From 8231908b1a9afd59c755be60b7fc2a6c9dfc238f Mon Sep 17 00:00:00 2001 From: kangkaisen Date: Thu, 31 May 2018 15:37:55 +0800 Subject: [PATCH] Support AnalyticExpr in View --- .../apache/doris/analysis/AnalyticExpr.java | 68 +++++++++++-------- 1 file changed, 40 insertions(+), 28 deletions(-) diff --git a/fe/src/main/java/org/apache/doris/analysis/AnalyticExpr.java b/fe/src/main/java/org/apache/doris/analysis/AnalyticExpr.java index 3587b47b0f7cfc..b813e1b81b0474 100644 --- a/fe/src/main/java/org/apache/doris/analysis/AnalyticExpr.java +++ b/fe/src/main/java/org/apache/doris/analysis/AnalyticExpr.java @@ -17,6 +17,7 @@ package org.apache.doris.analysis; +import com.google.common.base.Joiner; import org.apache.doris.analysis.AnalyticWindow.Boundary; import org.apache.doris.analysis.AnalyticWindow.BoundaryType; import org.apache.doris.catalog.AggregateFunction; @@ -171,33 +172,6 @@ public Expr clone() { return new AnalyticExpr(this); } - // @Override - // public String toSqlImpl() { - // if (sqlString_ != null) return sqlString_; - // StringBuilder sb = new StringBuilder(); - // sb.append(fnCall.toSql()).append(" OVER ("); - // boolean needsSpace = false; - // if (!partitionExprs.isEmpty()) { - // sb.append("PARTITION BY ").append(Expr.toSql(partitionExprs)); - // needsSpace = true; - // } - // if (!orderByElements_.isEmpty()) { - // List orderByStrings = Lists.newArrayList(); - // for (OrderByElement e: orderByElements) { - // orderByStrings.add(e.toSql()); - // } - // if (needsSpace) sb.append(" "); - // sb.append("ORDER BY ").append(Joiner.on(", ").join(orderByStrings)); - // needsSpace = true; - // } - // if (window != null) { - // if (needsSpace) sb.append(" "); - // sb.append(window.toSql()); - // } - // sb.append(")"); - // return sb.toString(); - // } - @Override public String debugString() { return Objects.toStringHelper(this) @@ -812,6 +786,44 @@ protected Expr substituteImpl(ExprSubstitutionMap sMap, Analyzer analyzer) @Override public String toSql() { - return ""; + if (sqlString != null) { + return sqlString; + } + StringBuilder sb = new StringBuilder(); + sb.append(fnCall.toSql()).append(" OVER ("); + boolean needsSpace = false; + if (!partitionExprs.isEmpty()) { + sb.append("PARTITION BY ").append(exprListToSql(partitionExprs)); + needsSpace = true; + } + if (!orderByElements.isEmpty()) { + List orderByStrings = Lists.newArrayList(); + for (OrderByElement e : orderByElements) { + orderByStrings.add(e.toSql()); + } + if (needsSpace) { + sb.append(" "); + } + sb.append("ORDER BY ").append(Joiner.on(", ").join(orderByStrings)); + needsSpace = true; + } + if (window != null) { + if (needsSpace) { + sb.append(" "); + } + sb.append(window.toSql()); + } + sb.append(")"); + return sb.toString(); + } + + private String exprListToSql(List exprs) { + if (exprs == null || exprs.isEmpty()) + return ""; + List strings = Lists.newArrayList(); + for (Expr expr : exprs) { + strings.add(expr.toSql()); + } + return Joiner.on(", ").join(strings); } }