diff --git a/ql/src/gen/vectorization/ExpressionTemplates/IfExprColumnScalar.txt b/ql/src/gen/vectorization/ExpressionTemplates/IfExprColumnScalar.txt index 9f4bb75..417a6da 100644 --- a/ql/src/gen/vectorization/ExpressionTemplates/IfExprColumnScalar.txt +++ b/ql/src/gen/vectorization/ExpressionTemplates/IfExprColumnScalar.txt @@ -19,6 +19,7 @@ package org.apache.hadoop.hive.ql.exec.vector.expressions.gen; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.expressions.IfVectorExpression; import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; @@ -54,7 +55,7 @@ public class extends VectorExpression { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarColumn.txt b/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarColumn.txt index 487d894..64db4e1 100644 --- a/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarColumn.txt +++ b/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarColumn.txt @@ -19,6 +19,7 @@ package org.apache.hadoop.hive.ql.exec.vector.expressions.gen; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.expressions.IfVectorExpression; import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; @@ -54,7 +55,7 @@ public class extends VectorExpression { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarScalar.txt b/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarScalar.txt index 5651d15..f9d0fe0 100644 --- a/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarScalar.txt +++ b/ql/src/gen/vectorization/ExpressionTemplates/IfExprScalarScalar.txt @@ -19,6 +19,7 @@ package org.apache.hadoop.hive.ql.exec.vector.expressions.gen; import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; +import org.apache.hadoop.hive.ql.exec.vector.expressions.IfVectorExpression; import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; @@ -55,7 +56,7 @@ public class extends VectorExpression { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java index 8cae274..80981fc 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprColumnNull.java @@ -40,9 +40,8 @@ public IfExprColumnNull(int arg1Column, int arg2Column, int outputColumn) { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } - final LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; final ColumnVector arg2ColVector = batch.cols[arg2Column]; final ColumnVector outputColVector = batch.cols[outputColumn]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprDoubleColumnDoubleColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprDoubleColumnDoubleColumn.java index 514b453..8723a53 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprDoubleColumnDoubleColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprDoubleColumnDoubleColumn.java @@ -48,7 +48,7 @@ public IfExprDoubleColumnDoubleColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnColumn.java index 98fa29e..0730d9a 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnColumn.java @@ -48,7 +48,7 @@ public IfExprIntervalDayTimeColumnColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnScalar.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnScalar.java index 9dc3669..b8a290c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnScalar.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeColumnScalar.java @@ -54,7 +54,7 @@ public IfExprIntervalDayTimeColumnScalar() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarColumn.java index 4d4649f..be7f160 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarColumn.java @@ -54,7 +54,7 @@ public IfExprIntervalDayTimeScalarColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarScalar.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarScalar.java index c8f3294..01b406e 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarScalar.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprIntervalDayTimeScalarScalar.java @@ -57,7 +57,7 @@ public IfExprIntervalDayTimeScalarScalar() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprLongColumnLongColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprLongColumnLongColumn.java index 4c6015e..06a2ef9 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprLongColumnLongColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprLongColumnLongColumn.java @@ -47,7 +47,7 @@ public IfExprLongColumnLongColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java index 156fcc4..3b58656 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprNullColumn.java @@ -40,7 +40,7 @@ public IfExprNullColumn(int arg1Column, int arg2Column, int outputColumn) { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } final LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringGroupColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringGroupColumn.java index c8367c6..d31c96a 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringGroupColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringGroupColumn.java @@ -51,7 +51,7 @@ public IfExprStringGroupColumnStringGroupColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringScalar.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringScalar.java index 915c6d8..6db7f69 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringScalar.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringGroupColumnStringScalar.java @@ -55,7 +55,7 @@ public IfExprStringGroupColumnStringScalar() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringGroupColumn.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringGroupColumn.java index 11d51e3..006183c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringGroupColumn.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringGroupColumn.java @@ -55,7 +55,7 @@ public IfExprStringScalarStringGroupColumn() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringScalar.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringScalar.java index bd6558c..678bfa1 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringScalar.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprStringScalarStringScalar.java @@ -56,7 +56,7 @@ public IfExprStringScalarStringScalar() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnColumnBase.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnColumnBase.java index 8219b3c..3dd25f8 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnColumnBase.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnColumnBase.java @@ -47,7 +47,7 @@ public IfExprTimestampColumnColumnBase() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnScalarBase.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnScalarBase.java index eb0c1c0..4a573ec 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnScalarBase.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampColumnScalarBase.java @@ -56,7 +56,7 @@ public IfExprTimestampColumnScalarBase() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarColumnBase.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarColumnBase.java index 3e4a195..04bda29 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarColumnBase.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarColumnBase.java @@ -55,7 +55,7 @@ public IfExprTimestampScalarColumnBase() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarScalarBase.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarScalarBase.java index 5273131..de5e935 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarScalarBase.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfExprTimestampScalarScalarBase.java @@ -56,7 +56,7 @@ public IfExprTimestampScalarScalarBase() { public void evaluate(VectorizedRowBatch batch) { if (childExpressions != null) { - super.evaluateChildren(batch); + IfVectorExpression.evaluateIfChildren(batch,childExpressions); } LongColumnVector arg1ColVector = (LongColumnVector) batch.cols[arg1Column]; diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfVectorExpression.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfVectorExpression.java new file mode 100644 index 0000000..1e9b418 --- /dev/null +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/IfVectorExpression.java @@ -0,0 +1,103 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hive.ql.exec.vector.expressions; + +import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; +import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; + +public class IfVectorExpression { + + public static void evaluateIfChildren(VectorizedRowBatch batch,VectorExpression [] childExpressions) { + if (childExpressions != null) { + int length = childExpressions.length; + int[] pre_sel = batch.selected; + int size = batch.size; + int[][] elseFlag = new int[length / 2][size]; + int[] else_sel = new int[size]; + boolean selectInUse = batch.selectedInUse; + for (int i = 0; i + 1 < length; i += 2) { + if (i % 2 == 0) { + batch.size = size; + batch.selectedInUse = selectInUse; + VectorExpression ve = childExpressions[i]; + int colNum = ve.getOutputColumn(); + ve.evaluate(batch); + LongColumnVector outputColVector = (LongColumnVector) batch.cols[colNum]; + long[] flag = outputColVector.vector; + int[] sel = batch.selected; + int n = batch.size; + int newSize = 0; + for (int j = 0; j < n; j++) { + if (flag[j] == 1) { + sel[newSize++] = j; + } else { + elseFlag[i][j] = 1; + } + } + if (newSize < n) { + batch.size = newSize; + batch.selectedInUse = true; + } + int count = i; + ve = childExpressions[count + 1]; + ve.evaluate(batch); + } else { + break; + } + + } + + if (length % 2 == 1) { + VectorExpression ve = childExpressions[length - 1]; + if (ve.getChildExpressions() == null) {// handle else statement + int newSize = 0; + for (int i = 0; i < size; i++) { + int flag = 0; + for (int j = 0; j < length / 2; j++) { + if (elseFlag[j][i] == 0) { + flag = 1; + break; + } + } + if (flag == 0) { + else_sel[newSize++] = i; + } + } + if (newSize < size) { + batch.size = newSize; + batch.selectedInUse = true; + } + batch.selected = else_sel; + ve.evaluate(batch); + } else { + // handle more when statement + batch.size = size; + batch.selectedInUse = selectInUse; + batch.selected = pre_sel; + ve.evaluate(batch); + } + + } + batch.size = size; + batch.selectedInUse = selectInUse; + batch.selected = pre_sel; + } + } + +} + diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFAdaptor.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFAdaptor.java index 14ba646..38f16fc 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFAdaptor.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/udf/VectorUDFAdaptor.java @@ -27,10 +27,7 @@ import org.apache.hadoop.hive.ql.exec.MapredContext; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.exec.vector.*; -import org.apache.hadoop.hive.ql.exec.vector.expressions.StringExpr; -import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpression; -import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriter; -import org.apache.hadoop.hive.ql.exec.vector.expressions.VectorExpressionWriterFactory; +import org.apache.hadoop.hive.ql.exec.vector.expressions.*; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; @@ -123,11 +120,13 @@ public void evaluate(VectorizedRowBatch batch) { throw new RuntimeException(e); } } - if (childExpressions != null) { - super.evaluateChildren(batch); + if(genericUDF.getUdfName().equals("org.apache.hadoop.hive.ql.udf.generic.GenericUDFIf")){ + IfVectorExpression.evaluateIfChildren(batch,childExpressions); + }else{ + super.evaluateChildren(batch); + } } - int[] sel = batch.selected; int n = batch.size; ColumnVector outV = batch.cols[outputColumn];