private VectorExpression getIfExpression(GenericUDFIf genericUDFIf, List<ExprNodeDesc> childExpr, VectorExpressionDescriptor.Mode mode, TypeInfo returnType) throws HiveException { boolean isFilter = false; // Assume. if (mode == VectorExpressionDescriptor.Mode.FILTER) { // Is output type a BOOLEAN? if (returnType.getCategory() == Category.PRIMITIVE && ((PrimitiveTypeInfo) returnType).getPrimitiveCategory() == PrimitiveCategory.BOOLEAN) { isFilter = true; } else { return null; } } // Get a PROJECTION IF expression. VectorExpression ve = doGetIfExpression(genericUDFIf, childExpr, returnType); if (ve == null) { return null; } if (isFilter) { // Wrap the PROJECTION IF expression output with a filter. SelectColumnIsTrue filterVectorExpr = new SelectColumnIsTrue(ve.getOutputColumnNum()); filterVectorExpr.setChildExpressions(new VectorExpression[] {ve}); filterVectorExpr.setInputTypeInfos(ve.getOutputTypeInfo()); filterVectorExpr.setInputDataTypePhysicalVariations(ve.getOutputDataTypePhysicalVariation()); return filterVectorExpr; } else { return ve; } }
@Override public String vectorExpressionParameters() { return getColumnParamString(0, colNum1); }
SelectColumnIsTrue selectColumnIsTrue = new SelectColumnIsTrue(colIndex); selectColumnIsTrue.setInputTypeInfos(childTypeInfo); selectColumnIsTrue.setInputDataTypePhysicalVariations(DataTypePhysicalVariation.NONE);
if (typeInfo.getCategory() == Category.PRIMITIVE && ((PrimitiveTypeInfo) typeInfo).getPrimitiveCategory() == PrimitiveCategory.BOOLEAN) { expr = new SelectColumnIsTrue(columnNum); expr = new SelectColumnIsTrue(outputColumnNum);
SelectColumnIsTrue filterVectorExpr = new SelectColumnIsTrue(outputCol); filterVectorExpr.setChildExpressions(new VectorExpression[] {ve}); return filterVectorExpr; } else {
@Test public void testBooleanFiltersOnColumns() throws HiveException { VectorizedRowBatch batch = getBatchThreeBooleanCols(); SelectColumnIsTrue expr = new SelectColumnIsTrue(0); expr.evaluate(batch); assertEquals(3, batch.size); assertEquals(2, batch.selected[0]); assertEquals(3, batch.selected[1]); assertEquals(7, batch.selected[2]); batch = getBatchThreeBooleanCols(); SelectColumnIsFalse expr1 = new SelectColumnIsFalse(1); expr1.evaluate(batch); assertEquals(3, batch.size); assertEquals(0, batch.selected[0]); assertEquals(2, batch.selected[1]); assertEquals(4, batch.selected[2]); }
if (childrenMode == VectorExpressionDescriptor.Mode.FILTER) { children.add(new SelectColumnIsTrue(colIndex));
SelectColumnIsTrue filterVectorExpr = new SelectColumnIsTrue(vectorCoalesce.getOutputColumnNum()); filterVectorExpr.setChildExpressions(new VectorExpression[] {vectorCoalesce}); filterVectorExpr.setInputTypeInfos(vectorCoalesce.getOutputTypeInfo()); filterVectorExpr.setInputDataTypePhysicalVariations(vectorCoalesce.getOutputDataTypePhysicalVariation());
if (typeInfo.getCategory() == Category.PRIMITIVE && ((PrimitiveTypeInfo) typeInfo).getPrimitiveCategory() == PrimitiveCategory.BOOLEAN) { expr = new SelectColumnIsTrue(columnNum); } else { expr = new SelectColumnIsTrue(castToBooleanExpr.getOutputColumn()); expr.setChildExpressions(new VectorExpression[] {castToBooleanExpr});
SelectColumnIsTrue filterVectorExpr = new SelectColumnIsTrue(outputColumnNum); filterVectorExpr.setChildExpressions(new VectorExpression[] {ve}); filterVectorExpr.setInputTypeInfos(ve.getOutputTypeInfo()); filterVectorExpr.setInputDataTypePhysicalVariations(ve.getOutputDataTypePhysicalVariation());
@Test public void testFilterExprAndExpr() throws HiveException { VectorizedRowBatch batch1 = getBatchThreeBooleanCols(); SelectColumnIsTrue expr1 = new SelectColumnIsTrue(0); SelectColumnIsFalse expr2 = new SelectColumnIsFalse(1); FilterExprAndExpr andExpr = new FilterExprAndExpr(); andExpr.setChildExpressions(new VectorExpression[] {expr1, expr2}); andExpr.evaluate(batch1); assertEquals(1, batch1.size); assertEquals(2, batch1.selected[0]); }
@Test public void testFilterExprOrExprWithSelectInUse() throws HiveException { VectorizedRowBatch batch1 = getBatchThreeBooleanCols(); SelectColumnIsTrue expr1 = new SelectColumnIsTrue(0); SelectColumnIsFalse expr2 = new SelectColumnIsFalse(1); FilterExprOrExpr orExpr = new FilterExprOrExpr(); orExpr.setChildExpressions(new VectorExpression[] {expr1, expr2}); // Evaluate batch1 so that temporary arrays in the expression // have residual values to interfere in later computation orExpr.evaluate(batch1); // Swap column vectors, but keep selected vector unchanged ColumnVector tmp = batch1.cols[0]; batch1.cols[0] = batch1.cols[1]; batch1.cols[1] = tmp; // Make sure row-7 is in the output. batch1.cols[1].isNull[7] = false; ((LongColumnVector) batch1.cols[1]).vector[7] = 0; orExpr.evaluate(batch1); assertEquals(3, batch1.size); assertEquals(0, batch1.selected[0]); assertEquals(3, batch1.selected[1]); assertEquals(7, batch1.selected[2]); }
@Test public void testFilterExprOrExprWithBatchReuse() throws HiveException { VectorizedRowBatch batch1 = getBatchThreeBooleanCols(); SelectColumnIsTrue expr1 = new SelectColumnIsTrue(0); SelectColumnIsFalse expr2 = new SelectColumnIsFalse(1); FilterExprOrExpr orExpr = new FilterExprOrExpr(); orExpr.setChildExpressions(new VectorExpression[] {expr1, expr2}); orExpr.evaluate(batch1); // Now re-initialize batch1 to simulate batch-object re-use. for (int i = 0; i < VectorizedRowBatch.DEFAULT_SIZE; i++) { batch1.selected[i] = 0; } batch1.size = BOOLEAN_COLUMN_TEST_SIZE; batch1.selectedInUse = false; // Swap column vectors to simulate change in data ColumnVector tmp = batch1.cols[0]; batch1.cols[0] = batch1.cols[1]; batch1.cols[1] = tmp; orExpr.evaluate(batch1); assertEquals(5, batch1.size); 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]); }
VectorizedRowBatch batch2 = getBatchThreeBooleanCols(); SelectColumnIsTrue expr1 = new SelectColumnIsTrue(0); SelectColumnIsFalse expr2 = new SelectColumnIsFalse(1);
SelectColumnIsTrue expr1d = new SelectColumnIsTrue(0); SelectColumnNothing expr2d = new SelectColumnNothing(0); SelectColumnNothing expr3d = new SelectColumnNothing(0);
private VectorExpression getColumnVectorExpression(ExprNodeColumnDesc exprDesc, Mode mode) throws HiveException { int columnNum = getInputColumnIndex(exprDesc.getColumn()); VectorExpression expr = null; switch (mode) { case FILTER: //Important: It will come here only if the column is being used as a boolean expr = new SelectColumnIsTrue(columnNum); break; case PROJECTION: expr = new IdentityExpression(columnNum, exprDesc.getTypeString()); break; } return expr; }
if (childrenMode == Mode.FILTER) { children.add(new SelectColumnIsTrue(colIndex));