PIG-4767: Partition filter not pushed down when filter clause references variable from another load path (knoguchi)
git-svn-id: https://svn.apache.org/repos/asf/pig/trunk@1801860 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/CHANGES.txt b/CHANGES.txt
index 2348898..13fc9e9 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -36,6 +36,8 @@
BUG FIXES
+PIG-4767: Partition filter not pushed down when filter clause references variable from another load path (knoguchi)
+
PIG-5270: Typo in Pig Logging (FromAlaska49 via daijy)
PIG-5263: Using wildcard doesn't work with OrcStorage (satishsaley via rohini)
diff --git a/src/org/apache/pig/newplan/logical/rules/PartitionFilterOptimizer.java b/src/org/apache/pig/newplan/logical/rules/PartitionFilterOptimizer.java
index de34e0d..733ea70 100644
--- a/src/org/apache/pig/newplan/logical/rules/PartitionFilterOptimizer.java
+++ b/src/org/apache/pig/newplan/logical/rules/PartitionFilterOptimizer.java
@@ -116,10 +116,6 @@
return false;
loFilter = (LOFilter)succeds.get(0);
- // Filter has dependency other than load, skip optimization
- if (currentPlan.getSoftLinkPredecessors(loFilter)!=null)
- return false;
-
// we have to check more only if LoadFunc implements LoadMetada
loadFunc = loLoad.getLoadFunc();
if(!( loadFunc instanceof LoadMetadata ) ) {
diff --git a/src/org/apache/pig/newplan/logical/rules/PredicatePushdownOptimizer.java b/src/org/apache/pig/newplan/logical/rules/PredicatePushdownOptimizer.java
index d964b3d..ba7c741 100644
--- a/src/org/apache/pig/newplan/logical/rules/PredicatePushdownOptimizer.java
+++ b/src/org/apache/pig/newplan/logical/rules/PredicatePushdownOptimizer.java
@@ -107,10 +107,6 @@
return false;
loFilter = (LOFilter) succeds.get(0);
- // Filter has dependency other than load, skip optimization
- if (currentPlan.getSoftLinkPredecessors(loFilter) != null)
- return false;
-
// we have to check more only if LoadFunc implements LoadPredicatePushdown
loadFunc = loLoad.getLoadFunc();
if (!(loadFunc instanceof LoadPredicatePushdown)) {
diff --git a/test/org/apache/pig/test/TestNewPartitionFilterPushDown.java b/test/org/apache/pig/test/TestNewPartitionFilterPushDown.java
index 2dcfe05..5e06e4d 100644
--- a/test/org/apache/pig/test/TestNewPartitionFilterPushDown.java
+++ b/test/org/apache/pig/test/TestNewPartitionFilterPushDown.java
@@ -61,10 +61,12 @@
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.expression.ScalarExpression;
import org.apache.pig.newplan.logical.optimizer.LogicalPlanOptimizer;
import org.apache.pig.newplan.logical.relational.LOFilter;
import org.apache.pig.newplan.logical.relational.LogToPhyTranslationVisitor;
import org.apache.pig.newplan.logical.relational.LogicalPlan;
+import org.apache.pig.newplan.logical.relational.LogicalRelationalOperator;
import org.apache.pig.newplan.logical.rules.LoadTypeCastInserter;
import org.apache.pig.newplan.logical.rules.PartitionFilterOptimizer;
import org.apache.pig.newplan.optimizer.PlanOptimizer;
@@ -467,10 +469,14 @@
Operator op = newLogicalPlan.getSinks().get(0);
LOFilter filter = (LOFilter)newLogicalPlan.getPredecessors(op).get(0);
- String actual = new PartitionFilterExtractor(null, new ArrayList<String>())
- .getExpression((LogicalExpression) filter.getFilterPlan().getSources().get(0)).toString();
- Assert.assertEquals("checking trimmed filter expression:",
- filterExpr, actual);
+ if (unsupportedExpr) {
+ String actual = getTestExpression((LogicalExpression) filter.getFilterPlan().getSources().get(0));
+ Assert.assertEquals("checking trimmed filter expression:", filterExpr, actual);
+ } else {
+ String actual = new PartitionFilterExtractor(null, new ArrayList<String>())
+ .getExpression((LogicalExpression) filter.getFilterPlan().getSources().get(0)).toString();
+ Assert.assertEquals("checking trimmed filter expression:", filterExpr, actual);
+ }
} else {
Iterator<Operator> it = newLogicalPlan.getOperators();
while( it.hasNext() ) {
@@ -707,6 +713,14 @@
"(not (browser#'type' is null))", true);
}
+ @Test
+ public void testScalarExpressions() throws Exception {
+ String q = "z = load '1line' as (z1:int); " +
+ query3 + "b = filter a by srcid != 10 and srcid == z.z1;" +
+ "store b into 'out';";
+ testFull(q, "(srcid != 10)", "(srcid == z.z1)", true);
+ }
+
//// helper methods ///////
private PartitionFilterExtractor test(String query, List<String> partitionCols,
String expPartFilterString, String expFilterString)
@@ -917,6 +931,10 @@
} else if (op instanceof NotExpression) {
String expr = getTestExpression(((NotExpression) op).getExpression());
return braketize("not " + expr);
+ } else if (op instanceof ScalarExpression) {
+ ScalarExpression scalar = (ScalarExpression) op;
+ return ((LogicalRelationalOperator)scalar.getImplicitReferencedOperator()).getAlias() +
+ "." + scalar.getFieldSchema().alias;
} else {
throw new FrontendException("Unsupported conversion of LogicalExpression to Expression: " + op.getName());
}