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 2011/10/16 18:54:48 UTC

svn commit: r1184868 - in /incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql: lang/SyntaxVarScope.java syntax/PatternVars.java syntax/PatternVarsVisitor.java

Author: andy
Date: Sun Oct 16 16:54:47 2011
New Revision: 1184868

URL: http://svn.apache.org/viewvc?rev=1184868&view=rev
Log:
JENA-142 Parrtial fix (covers {} UNION { BIND })

Modified:
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/lang/SyntaxVarScope.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/syntax/PatternVars.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/syntax/PatternVarsVisitor.java

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/lang/SyntaxVarScope.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/lang/SyntaxVarScope.java?rev=1184868&r1=1184867&r2=1184868&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/lang/SyntaxVarScope.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/lang/SyntaxVarScope.java Sun Oct 16 16:54:47 2011
@@ -18,11 +18,7 @@
 
 package com.hp.hpl.jena.sparql.lang;
 
-import java.util.Collection ;
-import java.util.Iterator ;
-import java.util.LinkedHashSet ;
-import java.util.List ;
-import java.util.Set ;
+import java.util.* ;
 
 import com.hp.hpl.jena.query.Query ;
 import com.hp.hpl.jena.query.QueryParseException ;
@@ -30,15 +26,7 @@ import com.hp.hpl.jena.query.Syntax ;
 import com.hp.hpl.jena.sparql.core.Var ;
 import com.hp.hpl.jena.sparql.core.VarExprList ;
 import com.hp.hpl.jena.sparql.expr.Expr ;
-import com.hp.hpl.jena.sparql.syntax.Element ;
-import com.hp.hpl.jena.sparql.syntax.ElementBind ;
-import com.hp.hpl.jena.sparql.syntax.ElementMinus ;
-import com.hp.hpl.jena.sparql.syntax.ElementSubQuery ;
-import com.hp.hpl.jena.sparql.syntax.ElementVisitor ;
-import com.hp.hpl.jena.sparql.syntax.ElementVisitorBase ;
-import com.hp.hpl.jena.sparql.syntax.ElementWalker ;
-import com.hp.hpl.jena.sparql.syntax.PatternVars ;
-import com.hp.hpl.jena.sparql.syntax.PatternVarsVisitor ;
+import com.hp.hpl.jena.sparql.syntax.* ;
 
 /** Calculate in-scope variables from the AST */ 
 public class SyntaxVarScope
@@ -90,7 +78,10 @@ public class SyntaxVarScope
     {
         LinkedHashSet<Var> queryVars = new LinkedHashSet<Var>() ;
         BindScopeChecker visitor = new BindScopeChecker(queryVars) ;
-        PatternVars.vars(query.getQueryPattern(), visitor) ;
+        //PatternVars.vars(query.getQueryPattern(), visitor) ;
+        
+        ElementWalker.Walker walker = new ScopeWalker(visitor) ;
+        ElementWalker.walk(query.getQueryPattern(), walker) ;
     }
     
     // Check subquery by finding subquries and recurisively checking.
@@ -117,7 +108,7 @@ public class SyntaxVarScope
         return vars ;
     }
     
-    // Other check (not scioping at this level) of a query
+    // Other check (not scoping at this level) of a query
     private static void check(Query query, Collection<Var> vars)
     {
         // Check any expressions are assigned to fresh variables.
@@ -248,7 +239,7 @@ public class SyntaxVarScope
         }
     }
 
-    /** Accumulate pattern variables but include some checking (BIND) as well */  
+    /** Accumulate pattern variables but include some checking (BIND) as well */
     private static class BindScopeChecker extends PatternVarsVisitor
     {
         public BindScopeChecker(Set<Var> s)
@@ -267,27 +258,80 @@ public class SyntaxVarScope
         }
     }
 
-    public static void varsWalk(Element element, PatternVarsVisitor visitor)
-    {
-        ElementWalker.Walker walker = new WalkerStack(visitor) ;
-        ElementWalker.walk(element, walker) ;
-    }
+    // Special version of walker for scoping rules.
     
-    public static class WalkerStack extends ElementWalker.Walker
+    public static class ScopeWalker extends ElementWalker.Walker
     {
-        protected WalkerStack(ElementVisitor visitor)
+        PatternVarsVisitor pvVisitor ;
+        
+        protected ScopeWalker(PatternVarsVisitor visitor)
         {
             super(visitor) ;
+            pvVisitor = visitor ;
         }
         
         @Override
         public void visit(ElementMinus el)
         {
-//            if ( el.getMinusElement() != null )
-//                el.getMinusElement().visit(this) ;
+            // Don't go down the RHS of MINUS
+            //if ( el.getMinusElement() != null )
+            //    el.getMinusElement().visit(this) ;
             proc.visit(el) ;
         }
+        
+        // It is a top-down walk, so on enter an element of group or UNION,
+        // then the entry set is 
+
+        // Isolate elements of UNION
+        @Override
+        public void visit(ElementUnion el)
+        {
+            Set<Var> accState = new HashSet<Var>(pvVisitor.acc) ;
+            doMultipleIndependent(accState, el.getElements()) ;
+            pvVisitor.acc = accState ;
+            proc.visit(el) ;
+        }
+        
+        // There are different kinds of elements in a GROUP:
+        // BGPs (ElementTriplesBlock ElementPathBlock)
+        //   Rolling accumulation
+        // GRAPH ?g { ?s ?p ?o }
+        // BIND applies to BGP 
+        // FILTER end of group
+        // All other elements (SERVICE?) outcome is only to the overall results.
+        
+//        @Override
+//        public void visit(ElementGroup el)
+//        {
+//            // But BIND needs to be does over end of group.
+//            // Ditto FILTER tests.
+//            Set<Var> accState = new HashSet<Var>(pvVisitor.acc) ;
+//            doMultipleIndependent(accState, el.getElements()) ;
+//            pvVisitor.acc = accState ;
+//            proc.visit(el) ;
+//        }
+        
+
+        private void doMultipleIndependent(Set<Var> agg, List<Element> elements)
+        {
+            // agg is empty?
+            for ( Element e : elements )
+            {
+                pvVisitor.acc.clear() ;
+                // Do subelement.
+                e.visit(this) ;
+                // Accumulate for final result.
+                agg.addAll(pvVisitor.acc) ;
+            }
+        }
+        
     }
-    
 
+    
+//    public static void varsWalk(Element element, PatternVarsVisitor visitor)
+//    {
+//        ElementWalker.Walker walker = new ScopeWalker(visitor) ;
+//        ElementWalker.walk(element, walker) ;
+//    }
+//    
 }

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/syntax/PatternVars.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/syntax/PatternVars.java?rev=1184868&r1=1184867&r2=1184868&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/syntax/PatternVars.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/syntax/PatternVars.java Sun Oct 16 16:54:47 2011
@@ -53,9 +53,10 @@ public class PatternVars
         
         @Override
         public void visit(ElementMinus el)
-        {
-//            if ( el.getMinusElement() != null )
-//                el.getMinusElement().visit(this) ;
+        {
+            // Don't go down the RHS of MINUS
+            //if ( el.getMinusElement() != null )
+            //    el.getMinusElement().visit(this) ;
             proc.visit(el) ;
         }
     }

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/syntax/PatternVarsVisitor.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/syntax/PatternVarsVisitor.java?rev=1184868&r1=1184867&r2=1184868&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/syntax/PatternVarsVisitor.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/syntax/PatternVarsVisitor.java Sun Oct 16 16:54:47 2011
@@ -29,9 +29,9 @@ import com.hp.hpl.jena.sparql.util.VarUt
 
 public class PatternVarsVisitor extends ElementVisitorBase
 {
-    protected Set<Var> acc ;
+    public Set<Var> acc ;
     public PatternVarsVisitor(Set<Var> s) { acc = s ; } 
-
+    
     @Override
     public void visit(ElementTriplesBlock el)
     {