diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java index 0ada068..c10b9c7 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ASTConverter.java @@ -19,9 +19,11 @@ import java.math.BigDecimal; import java.util.ArrayList; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import org.apache.calcite.rel.RelFieldCollation; import org.apache.calcite.rel.RelNode; @@ -54,10 +56,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hive.metastore.api.FieldSchema; -import org.apache.hadoop.hive.ql.exec.RowSchema; import org.apache.hadoop.hive.ql.metadata.VirtualColumn; import org.apache.hadoop.hive.ql.optimizer.calcite.CalciteSemanticException; -import org.apache.hadoop.hive.ql.optimizer.calcite.RelOptHiveTable; import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveGroupingID; import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveSort; import org.apache.hadoop.hive.ql.optimizer.calcite.reloperators.HiveTableScan; @@ -190,12 +190,36 @@ else if (aggregateType == Group.CUBE) { } else { int i = 0; + List projectNodes = new ArrayList(); + Map windowingNodes = new HashMap(); for (RexNode r : select.getChildExps()) { ASTNode expr = r.accept(new RexVisitor(schema, r instanceof RexLiteral)); + if (r instanceof RexOver) { + for (RexNode operand : ((RexOver) r).getOperands()) { + ASTNode operandExpr = operand.accept(new RexVisitor(schema, + operand instanceof RexLiteral)); + windowingNodes.put(operandExpr.toStringTree(), operandExpr); + } + } else { + projectNodes.add(expr.toStringTree()); + } String alias = select.getRowType().getFieldNames().get(i++); ASTNode selectExpr = ASTBuilder.selectExpr(expr, alias); b.add(selectExpr); } + if (groupBy != null) { + for (Entry windowingNode : windowingNodes.entrySet()) { + if (!projectNodes.contains(windowingNode.getKey())) { + int colIndex = 0; + String alias = "window_col_" + colIndex; + while (select.getRowType().getFieldNames().contains(alias)) { + alias = "window_col_" + (colIndex++); + } + ASTNode selectExpr = ASTBuilder.selectExpr(windowingNode.getValue(), alias); + b.add(selectExpr); + } + } + } } hiveAST.select = b.node();