diff --git ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterExprOrExpr.java ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterExprOrExpr.java index 3dc8c7d..703096c 100644 --- ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterExprOrExpr.java +++ ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/FilterExprOrExpr.java @@ -94,7 +94,18 @@ public void evaluate(VectorizedRowBatch batch) { // Merge the result of last evaluate to previous evaluate. int newSize = batch.size + sizeAfterFirstChild; - System.arraycopy(selectedAfterFirstChild, 0, batch.selected, batch.size, sizeAfterFirstChild); + for (int i = 0; i < batch.size; i++) { + tmp[batch.selected[i]] = 1; + } + int k = 0; + for (int j = 0; j < n; j++) { + int i = initialSelected[j]; + if (tmp[i] == 1) { + batch.selected[k++] = i; + } + } + + batch.size = newSize; if (newSize == n) { // Filter didn't do anything diff --git ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorLogicalExpressions.java ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorLogicalExpressions.java index d7b5410..144cac5 100644 --- ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorLogicalExpressions.java +++ ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorLogicalExpressions.java @@ -19,10 +19,6 @@ package org.apache.hadoop.hive.ql.exec.vector.expressions; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.util.HashSet; -import java.util.Set; import org.apache.hadoop.hive.ql.exec.vector.ColumnVector; import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector; @@ -386,29 +382,22 @@ public void testFilterExprOrExpr() { } assertEquals(5, batch1.size); - Set expectedSet = new HashSet(); - expectedSet.add(0); - expectedSet.add(2); - expectedSet.add(3); - expectedSet.add(4); - expectedSet.add(7); - - assertTrue(expectedSet.contains(batch1.selected[0])); - assertTrue(expectedSet.contains(batch1.selected[1])); - assertTrue(expectedSet.contains(batch1.selected[2])); - assertTrue(expectedSet.contains(batch1.selected[3])); - assertTrue(expectedSet.contains(batch1.selected[4])); + assertEquals(0, batch1.selected[0]); + assertEquals(2, batch1.selected[1]); + assertEquals(3, batch1.selected[2]); + assertEquals(4, batch1.selected[3]); + assertEquals(7, batch1.selected[4]); // Repeat the expression on the same batch, // the result must be unchanged. orExpr.evaluate(batch1); assertEquals(5, batch1.size); - assertTrue(expectedSet.contains(batch1.selected[0])); - assertTrue(expectedSet.contains(batch1.selected[1])); - assertTrue(expectedSet.contains(batch1.selected[2])); - assertTrue(expectedSet.contains(batch1.selected[3])); - assertTrue(expectedSet.contains(batch1.selected[4])); + assertEquals(0, batch1.selected[0]); + assertEquals(2, batch1.selected[1]); + assertEquals(3, batch1.selected[2]); + assertEquals(4, batch1.selected[3]); + assertEquals(7, batch1.selected[4]); } @Test @@ -437,18 +426,11 @@ public void testFilterExprOrExprWithBatchReuse() { orExpr.evaluate(batch1); assertEquals(5, batch1.size); - Set expectedSet = new HashSet(); - expectedSet.add(0); - expectedSet.add(1); - expectedSet.add(3); - expectedSet.add(5); - expectedSet.add(6); - - assertTrue(expectedSet.contains(batch1.selected[0])); - assertTrue(expectedSet.contains(batch1.selected[1])); - assertTrue(expectedSet.contains(batch1.selected[2])); - assertTrue(expectedSet.contains(batch1.selected[3])); - assertTrue(expectedSet.contains(batch1.selected[4])); + assertEquals(0, batch1.selected[0]); + assertEquals(1, batch1.selected[1]); + assertEquals(3, batch1.selected[2]); + assertEquals(5, batch1.selected[3]); + assertEquals(6, batch1.selected[4]); } @Test @@ -475,14 +457,9 @@ public void testFilterExprOrExprWithSelectInUse() { orExpr.evaluate(batch1); assertEquals(3, batch1.size); - Set expectedSet = new HashSet(); - expectedSet.add(0); - expectedSet.add(3); - expectedSet.add(7); - - assertTrue(expectedSet.contains(batch1.selected[0])); - assertTrue(expectedSet.contains(batch1.selected[1])); - assertTrue(expectedSet.contains(batch1.selected[2])); + assertEquals(0, batch1.selected[0]); + assertEquals(3, batch1.selected[1]); + assertEquals(7, batch1.selected[2]); } @Test