/* * Copyright 2015 The Apache Software Foundation. * * Licensed 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.optimizer.ppr; import java.util.Arrays; import org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeConstantDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeDesc; import org.apache.hadoop.hive.ql.plan.ExprNodeGenericFuncDesc; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPAnd; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPNull; import org.apache.hadoop.hive.ql.udf.generic.GenericUDFOPOr; import org.apache.hadoop.hive.serde2.typeinfo.TypeInfoFactory; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import static org.junit.Assert.*; @RunWith(Parameterized.class) public final class TestPositivePartitionPrunerCompactExpr { private final ExprNodeDesc expression; private final String expected; public TestPositivePartitionPrunerCompactExpr(ExprNodeDesc expression, String expected) { this.expression = expression; this.expected = expected; } @Parameterized.Parameters(name = "{index}: {0} => {1}") public static Iterable<Object[]> data() { ExprNodeDesc trueExpr = new ExprNodeConstantDesc(Boolean.TRUE); ExprNodeDesc falseExpr = new ExprNodeConstantDesc(Boolean.FALSE); ExprNodeDesc col1Expr = new ExprNodeColumnDesc(TypeInfoFactory.booleanTypeInfo, "col1", "t1", true); ExprNodeDesc col2Expr = new ExprNodeColumnDesc(TypeInfoFactory.booleanTypeInfo, "col2", "t1", true); ExprNodeDesc udf1Expr = new ExprNodeGenericFuncDesc(TypeInfoFactory.booleanTypeInfo, new GenericUDFOPNull(), Arrays.<ExprNodeDesc>asList(col1Expr)); ExprNodeDesc udf2Expr = new ExprNodeGenericFuncDesc(TypeInfoFactory.booleanTypeInfo, new GenericUDFOPNull(), Arrays.<ExprNodeDesc>asList(col2Expr)); return Arrays.asList(new Object[][]{ {null, null}, {and(null, null), null}, {and(falseExpr, null), "false"}, {and(null, falseExpr), "false"}, {and(trueExpr, null), null}, {and(null, trueExpr), null}, {and(udf1Expr, null), "col1 is null"}, {and(null, udf2Expr), "col2 is null"}, {and(udf1Expr, udf2Expr), "(col1 is null and col2 is null)"}, {and(falseExpr, falseExpr), "false"}, {and(trueExpr, falseExpr), "false"}, {and(falseExpr, trueExpr), "false"}, {and(udf1Expr, falseExpr), "false"}, {and(falseExpr, udf2Expr), "false"}, {and(trueExpr, trueExpr), "true"}, {and(udf1Expr, trueExpr), "col1 is null"}, {and(trueExpr, udf2Expr), "col2 is null"}, {or(null, null), null}, {or(falseExpr, null), null}, {or(null, falseExpr), null}, {or(trueExpr, null), "true"}, {or(null, trueExpr), "true"}, {or(udf1Expr, null), null}, {or(null, udf2Expr), null}, {or(udf1Expr, udf2Expr), "(col1 is null or col2 is null)"}, {or(falseExpr, falseExpr), "false"}, {or(trueExpr, falseExpr), "true"}, {or(falseExpr, trueExpr), "true"}, {or(udf1Expr, falseExpr), "col1 is null"}, {or(falseExpr, udf2Expr), "col2 is null"}, {or(trueExpr, trueExpr), "true"}, {or(udf1Expr, trueExpr), "true"}, {or(trueExpr, udf2Expr), "true"}, {or(and(udf1Expr, udf2Expr), udf2Expr), "((col1 is null and col2 is null) or col2 is null)"}, {and(or(udf1Expr, udf2Expr), udf2Expr), "((col1 is null or col2 is null) and col2 is null)"}, }); } @Test public void testCompactExpr() { ExprNodeDesc actual = PartitionPruner.compactExpr(expression); if (expected == null) { assertNull(actual); } else { assertNotNull("Expected not NULL expression", actual); assertNotNull("Expected not NULL expression string", actual.getExprString()); assertEquals(expected, actual.getExprString()); } } private static ExprNodeDesc or(ExprNodeDesc left, ExprNodeDesc right) { return new ExprNodeGenericFuncDesc(TypeInfoFactory.booleanTypeInfo, new GenericUDFOPOr(), Arrays.<ExprNodeDesc>asList(left, right)); } private static ExprNodeDesc and(ExprNodeDesc left, ExprNodeDesc right) { return new ExprNodeGenericFuncDesc(TypeInfoFactory.booleanTypeInfo, new GenericUDFOPAnd(), Arrays.<ExprNodeDesc>asList(left, right)); } }