diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterExprOrExpr.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterExprOrExpr.java index 704de4b..1efacef 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterExprOrExpr.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterExprOrExpr.java @@ -26,7 +26,7 @@ public class FilterExprOrExpr extends VectorExpression { VectorExpression childExpr1; VectorExpression childExpr2; - int [] tmpSelect1 = new int[VectorizedRowBatch.DEFAULT_SIZE]; + int [] initialSelected = new int[VectorizedRowBatch.DEFAULT_SIZE]; int [] unselected = new int[VectorizedRowBatch.DEFAULT_SIZE]; int [] tmp = new int[VectorizedRowBatch.DEFAULT_SIZE]; @@ -42,15 +42,16 @@ public void evaluate(VectorizedRowBatch batch) { return; } boolean prevSelectInUse = batch.selectedInUse; - //Clone the selected vector + + // Save the original selected vector int [] sel = batch.selected; if (batch.selectedInUse) { for (int i = 0; i < n; i++) { - tmpSelect1[i] = sel[i]; + initialSelected[i] = sel[i]; } } else { for (int i = 0; i < n; i++) { - tmpSelect1[i] = i; + initialSelected[i] = i; sel[i] = i; } batch.selectedInUse = true; @@ -58,8 +59,8 @@ public void evaluate(VectorizedRowBatch batch) { childExpr1.evaluate(batch); - //Calculate unselected ones in last evaluate. - for (int i = 0; i < tmp.length; i++) { + // Calculate unselected ones in last evaluate. + for (int i = 0; i < n; i++) { tmp[i] = 0; } for (int j = 0; j < batch.size; j++) { @@ -68,30 +69,35 @@ public void evaluate(VectorizedRowBatch batch) { } int unselectedSize = 0; for (int j =0; j < n; j++) { - int i = tmpSelect1[j]; + int i = initialSelected[j]; if (tmp[i] == 0) { unselected[unselectedSize++] = i; } } + //Preserve current selected and size int currentSize = batch.size; int [] currentSelected = batch.selected; - //Evaluate second child expression over unselected ones only. + // Evaluate second child expression over unselected ones only. batch.selected = unselected; batch.size = unselectedSize; childExpr2.evaluate(batch); - //Merge the result of last evaluate to previous evaluate. + // Merge the result of last evaluate to previous evaluate. int newSize = batch.size + currentSize; for (int i = batch.size; i < newSize; i++ ) { batch.selected[i] = currentSelected[i-batch.size]; } batch.size = newSize; if (newSize == n) { - //Filter didn't do anything + // Filter didn't do anything batch.selectedInUse = prevSelectInUse; } + + // unselected array is taken away by the row batch + // so take the row batch's original one. + unselected = currentSelected; } @Override diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterNotExpr.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterNotExpr.java index 6f3b101..ea0d9ff 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterNotExpr.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterNotExpr.java @@ -25,7 +25,7 @@ */ public class FilterNotExpr extends VectorExpression { VectorExpression childExpr1; - int [] tmpSelect1 = new int[VectorizedRowBatch.DEFAULT_SIZE]; + int [] initialSelected = new int[VectorizedRowBatch.DEFAULT_SIZE]; int [] unselected = new int[VectorizedRowBatch.DEFAULT_SIZE]; int [] tmp = new int[VectorizedRowBatch.DEFAULT_SIZE]; @@ -45,11 +45,11 @@ public void evaluate(VectorizedRowBatch batch) { int [] sel = batch.selected; if (batch.selectedInUse) { for (int i = 0; i < n; i++) { - tmpSelect1[i] = sel[i]; + initialSelected[i] = sel[i]; } } else { for (int i = 0; i < n; i++) { - tmpSelect1[i] = i; + initialSelected[i] = i; sel[i] = i; } batch.selectedInUse = true; @@ -58,7 +58,7 @@ public void evaluate(VectorizedRowBatch batch) { childExpr1.evaluate(batch); //Calculate unselected ones in last evaluate. - for (int i = 0; i < tmp.length; i++) { + for (int i = 0; i < n; i++) { tmp[i] = 0; } for (int j = 0; j < batch.size; j++) { @@ -67,14 +67,16 @@ public void evaluate(VectorizedRowBatch batch) { } int unselectedSize = 0; for (int j =0; j < n; j++) { - int i = tmpSelect1[j]; + int i = initialSelected[j]; if (tmp[i] == 0) { unselected[unselectedSize++] = i; } } - //The unselected is the new selected + //The unselected is the new selected, swap the arrays + int [] swapTmp = batch.selected; batch.selected = unselected; + unselected = swapTmp; batch.size = unselectedSize; } diff --git a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestConstantVectorExpression.java b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestConstantVectorExpression.java index f2e5399..c656ce4 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestConstantVectorExpression.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestConstantVectorExpression.java @@ -27,6 +27,7 @@ import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector; import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch; +import org.apache.hadoop.hive.ql.exec.vector.util.VectorizedRowGroupGenUtil; import org.junit.Test; public class TestConstantVectorExpression {