You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2016/06/02 10:27:23 UTC

[4/4] jena git commit: JENA-1187: Correct scope calculation for OpUnion

JENA-1187: Correct scope calculation for OpUnion


Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/363287f2
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/363287f2
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/363287f2

Branch: refs/heads/master
Commit: 363287f23ce4c5e93df74a76bd826090001126e2
Parents: 4918d7f
Author: Andy Seaborne <an...@apache.org>
Authored: Thu Jun 2 10:04:00 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Thu Jun 2 10:04:00 2016 +0100

----------------------------------------------------------------------
 .../jena/sparql/engine/main/JoinClassifier.java | 10 ++++-----
 .../jena/sparql/engine/main/VarFinder.java      | 22 ++++++++++++++++++--
 .../jena/sparql/algebra/TestClassify.java       |  7 ++++---
 3 files changed, 29 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/363287f2/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/JoinClassifier.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/JoinClassifier.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/JoinClassifier.java
index bdae14c..22c3f39 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/JoinClassifier.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/JoinClassifier.java
@@ -98,11 +98,11 @@ public class JoinClassifier
             System.err.println("Left/opt:      " + vLeftOpt) ;
         // if (print) System.err.println("Left/filter:   " + vLeftFilter) ;
 
-        VarFinder vfRight = VarFinder.process(rightOp) ;
-        Set<Var> vRightFixed = vfRight.getFixed() ;
-        Set<Var> vRightOpt = vfRight.getOpt() ;
-        Set<Var> vRightFilter = vfRight.getFilter() ;
-        Set<Var> vRightAssign = vfRight.getAssign() ;
+        VarFinder vfRight       = VarFinder.process(rightOp) ;
+        Set<Var> vRightFixed    = vfRight.getFixed() ;
+        Set<Var> vRightOpt      = vfRight.getOpt() ;
+        Set<Var> vRightFilter   = vfRight.getFilter() ;
+        Set<Var> vRightAssign   = vfRight.getAssign() ;
 
         if ( print )
             System.err.println("Right/fixed:   " + vRightFixed) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/363287f2/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
index 731532b..258f7ea 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/VarFinder.java
@@ -28,6 +28,7 @@ import java.util.HashSet ;
 import java.util.List ;
 import java.util.Set ;
 
+import org.apache.jena.atlas.lib.SetUtils ;
 import org.apache.jena.sparql.algebra.Op ;
 import org.apache.jena.sparql.algebra.OpVisitor ;
 import org.apache.jena.sparql.algebra.op.* ;
@@ -213,8 +214,25 @@ public class VarFinder
 
         @Override
         public void visit(OpUnion opUnion) {
-            mergeVars(opUnion.getLeft());
-            mergeVars(opUnion.getRight());
+            VarUsageVisitor usage1 = VarUsageVisitor.apply(opUnion.getLeft());
+            VarUsageVisitor usage2 = VarUsageVisitor.apply(opUnion.getRight());
+
+            // Fixed both sides.
+            Set<Var> fixed = SetUtils.intersection(usage1.defines, usage2.defines) ;  
+            defines.addAll(fixed) ;
+            
+            // Fixed one side or the other, not both.
+            Set<Var> notFixed = SetUtils.symmetricDifference(usage1.defines, usage2.defines) ;
+            optDefines.addAll(notFixed) ;                              
+
+            optDefines.addAll(usage1.optDefines);
+            optDefines.addAll(usage2.optDefines);
+            
+            filterMentions.addAll(usage1.filterMentions);
+            filterMentions.addAll(usage2.filterMentions);
+            
+            assignMentions.addAll(usage1.assignMentions);
+            assignMentions.addAll(usage2.assignMentions);
         }
         
         @Override

http://git-wip-us.apache.org/repos/asf/jena/blob/363287f2/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestClassify.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestClassify.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestClassify.java
index 741500d..17e7692 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestClassify.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/TestClassify.java
@@ -104,9 +104,10 @@ public class TestClassify extends BaseTest
     // Use of a filter variable from the LHS but optional in RHS
     @Test public void testClassify_Join_35() 
     { classifyJ("{ GRAPH ?g { ?x ?y ?z } { OPTIONAL{?a ?b ?z} FILTER (?z) } }", false) ; }
-    
-    @Test public void testClassify_Join_40() 
-    { classifyJ("{ ?x ?y ?z { ?x ?y ?z } UNION { ?x1 ?y1 ?z1 }}", true) ; }
+
+    // The fix for JENA-1187 invalidates this test.
+//    @Test public void testClassify_Join_40()
+//    { classifyJ("{ ?x ?y ?z { ?x ?y ?z } UNION { ?x1 ?y1 ?z1 }}", true) ; }
 
     @Test public void testClassify_Join_41() 
     { classifyJ("{ ?x ?y ?z { ?x1 ?y1 ?z1 BIND(?z+2 AS ?A) } UNION { ?x1 ?y1 ?z1 }}", false) ; }