diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ExprNodeConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ExprNodeConverter.java index ec22f1a..42f1ab6 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ExprNodeConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/ExprNodeConverter.java @@ -20,6 +20,7 @@ import java.math.BigDecimal; import java.sql.Date; import java.sql.Timestamp; +import java.util.ArrayList; import java.util.Calendar; import java.util.LinkedList; import java.util.List; @@ -80,11 +81,11 @@ private final String tabAlias; private final String columnAlias; private final RelDataType inputRowType; - private final RelDataType outputRowType; private final ImmutableSet inputVCols; - private WindowFunctionSpec wfs; + private List windowFunctionSpecs = new ArrayList<>(); private final RelDataTypeFactory dTFactory; protected final Log LOG = LogFactory.getLog(this.getClass().getName()); + private static long uniqueCounter = 0; public ExprNodeConverter(String tabAlias, RelDataType inputRowType, Set vCols, RelDataTypeFactory dTFactory) { @@ -97,13 +98,12 @@ public ExprNodeConverter(String tabAlias, String columnAlias, RelDataType inputR this.tabAlias = tabAlias; this.columnAlias = columnAlias; this.inputRowType = inputRowType; - this.outputRowType = outputRowType; this.inputVCols = ImmutableSet.copyOf(inputVCols); this.dTFactory = dTFactory; } - public WindowFunctionSpec getWindowFunctionSpec() { - return this.wfs; + public List getWindowFunctionSpec() { + return this.windowFunctionSpecs; } @Override @@ -235,7 +235,7 @@ public ExprNodeDesc visitOver(RexOver over) { final WindowFrameSpec windowFrameSpec = getWindowRange(window); windowSpec.setWindowFrame(windowFrameSpec); - wfs = new WindowFunctionSpec(); + WindowFunctionSpec wfs = new WindowFunctionSpec(); wfs.setWindowSpec(windowSpec); final Schema schema = new Schema(tabAlias, inputRowType.getFieldList()); final ASTNode wUDAFAst = new ASTConverter.RexVisitor(schema).visitOver(over); @@ -246,10 +246,15 @@ public ExprNodeDesc visitOver(RexOver over) { ASTNode child = (ASTNode) wUDAFAst.getChild(i); wfs.addArg(child); } + if (wUDAFAst.getText().equals("TOK_FUNCTIONSTAR")) { + wfs.setStar(true); + } + String columnAlias = getWindowColumnAlias(); wfs.setAlias(columnAlias); - RelDataTypeField f = outputRowType.getField(columnAlias, false, false); - return new ExprNodeColumnDesc(TypeConverter.convert(f.getType()), columnAlias, tabAlias, + this.windowFunctionSpecs.add(wfs); + + return new ExprNodeColumnDesc(TypeConverter.convert(over.getType()), columnAlias, tabAlias, false); } @@ -343,4 +348,8 @@ private BoundarySpec getWindowBound(RexWindowBound wb, boolean isRows) { return boundarySpec; } + private String getWindowColumnAlias() { + return "$win$_col_" + (uniqueCounter++); + } + } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java index b1b5375..7288677 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/HiveOpConverter.java @@ -81,6 +81,7 @@ import org.apache.hadoop.hive.ql.parse.UnparseTranslator; import org.apache.hadoop.hive.ql.parse.WindowingComponentizer; import org.apache.hadoop.hive.ql.parse.WindowingSpec; +import org.apache.hadoop.hive.ql.parse.WindowingSpec.WindowFunctionSpec; import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDescUtils; @@ -284,7 +285,9 @@ OpAttr visit(HiveProject projectRel) throws SemanticException { exprCols.add(exprCol); //TODO: Cols that come through PTF should it retain (VirtualColumness)? if (converter.getWindowFunctionSpec() != null) { - windowingSpec.addWindowFunction(converter.getWindowFunctionSpec()); + for (WindowFunctionSpec wfs : converter.getWindowFunctionSpec()) { + windowingSpec.addWindowFunction(wfs); + } } } if (windowingSpec.getWindowExpressions() != null