You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by da...@apache.org on 2016/07/19 00:48:41 UTC
svn commit: r1753328 - in /pig/trunk: CHANGES.txt
src/org/apache/pig/newplan/FilterExtractor.java
test/org/apache/pig/test/TestNewPartitionFilterPushDown.java
Author: daijy
Date: Tue Jul 19 00:48:41 2016
New Revision: 1753328
URL: http://svn.apache.org/viewvc?rev=1753328&view=rev
Log:
PIG-4940: Predicate push-down filtering unary expressions can be pushed
Modified:
pig/trunk/CHANGES.txt
pig/trunk/src/org/apache/pig/newplan/FilterExtractor.java
pig/trunk/test/org/apache/pig/test/TestNewPartitionFilterPushDown.java
Modified: pig/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/pig/trunk/CHANGES.txt?rev=1753328&r1=1753327&r2=1753328&view=diff
==============================================================================
--- pig/trunk/CHANGES.txt (original)
+++ pig/trunk/CHANGES.txt Tue Jul 19 00:48:41 2016
@@ -36,6 +36,8 @@ OPTIMIZATIONS
BUG FIXES
+PIG-4940: Predicate push-down filtering unary expressions can be pushed (rdblue via daijy)
+
PIG-4938: [PiggyBank] XPath returns empty values when using aggregation method (nkollar via daijy)
PIG-4896: Param substitution ignored when redefined (knoguchi)
Modified: pig/trunk/src/org/apache/pig/newplan/FilterExtractor.java
URL: http://svn.apache.org/viewvc/pig/trunk/src/org/apache/pig/newplan/FilterExtractor.java?rev=1753328&r1=1753327&r2=1753328&view=diff
==============================================================================
--- pig/trunk/src/org/apache/pig/newplan/FilterExtractor.java (original)
+++ pig/trunk/src/org/apache/pig/newplan/FilterExtractor.java Tue Jul 19 00:48:41 2016
@@ -278,12 +278,21 @@ public abstract class FilterExtractor {
if (unaryExpr instanceof CastExpression) {
return checkPushDown(unaryExpr.getExpression());
}
- if (unaryExpr instanceof IsNullExpression) {
- state.pushdownExpr = unaryExpr;
- state.filterExpr = null;
- } else if (unaryExpr instanceof NotExpression) {
- state.pushdownExpr = unaryExpr;
- state.filterExpr = null;
+ // For IsNull, the child may not be a supported expression, e.g. MapLookupExpression.
+ // For NotExpression, the child, C, is broken into expressions P and F such that C = P AND F
+ // Consequently, NOT C = NOT P OR NOT F, which can't be expressed as an AND so both must be
+ // pushed or both used as a filter.
+ // For both cases, this expr can be pushed if and only if the entire child can be.
+ if (unaryExpr instanceof IsNullExpression || unaryExpr instanceof NotExpression) {
+ KeyState childState = checkPushDown(unaryExpr.getExpression());
+ if (childState.filterExpr == null) {
+ // only push down if the entire expression can be pushed
+ state.pushdownExpr = unaryExpr;
+ state.filterExpr = null;
+ } else {
+ state.filterExpr = addToFilterPlan(unaryExpr);
+ state.pushdownExpr = null;
+ }
} else {
state.filterExpr = addToFilterPlan(unaryExpr);
state.pushdownExpr = null;
Modified: pig/trunk/test/org/apache/pig/test/TestNewPartitionFilterPushDown.java
URL: http://svn.apache.org/viewvc/pig/trunk/test/org/apache/pig/test/TestNewPartitionFilterPushDown.java?rev=1753328&r1=1753327&r2=1753328&view=diff
==============================================================================
--- pig/trunk/test/org/apache/pig/test/TestNewPartitionFilterPushDown.java (original)
+++ pig/trunk/test/org/apache/pig/test/TestNewPartitionFilterPushDown.java Tue Jul 19 00:48:41 2016
@@ -57,6 +57,7 @@ import org.apache.pig.newplan.logical.ex
import org.apache.pig.newplan.logical.expression.IsNullExpression;
import org.apache.pig.newplan.logical.expression.LogicalExpression;
import org.apache.pig.newplan.logical.expression.MapLookupExpression;
+import org.apache.pig.newplan.logical.expression.NotExpression;
import org.apache.pig.newplan.logical.expression.OrExpression;
import org.apache.pig.newplan.logical.expression.ProjectExpression;
import org.apache.pig.newplan.logical.optimizer.LogicalPlanOptimizer;
@@ -685,6 +686,15 @@ public class TestNewPartitionFilterPushD
testFull(q, "((srcid < 5) or (srcid == 10))", "((f1 < 5) or (f2 == 'UK'))", false);
}
+ // PIG-4940
+ @Test
+ public void testUnaryExpressions() throws Exception {
+ String q = query + "b = filter a by srcid == 10 and not browser#'type' is null;" +
+ "store b into 'out';";
+ test(q, Arrays.asList("srcid"), "(srcid == 10)",
+ "(not (browser#'type' is null))", true);
+ }
+
//// helper methods ///////
private PartitionFilterExtractor test(String query, List<String> partitionCols,
String expPartFilterString, String expFilterString)
@@ -890,6 +900,9 @@ public class TestNewPartitionFilterPushD
int colind = ((DereferenceExpression) op).getBagColumns().get(0);
String column = String.valueOf(colind);
return alias + ".$" + column;
+ } else if (op instanceof NotExpression) {
+ String expr = getTestExpression(((NotExpression) op).getExpression());
+ return braketize("not " + expr);
} else {
throw new FrontendException("Unsupported conversion of LogicalExpression to Expression: " + op.getName());
}