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 2013/04/13 21:44:21 UTC

svn commit: r1467681 - in /jena/trunk/jena-arq/src: main/java/com/hp/hpl/jena/sparql/algebra/OpVars.java test/java/com/hp/hpl/jena/sparql/algebra/TestOpVar.java

Author: andy
Date: Sat Apr 13 19:44:20 2013
New Revision: 1467681

URL: http://svn.apache.org/r1467681
Log:
Rename OpVars.patternVars as more accurate OpVars.visibleVars
Deprecate OpVars.allVars (unstable across renaming for scoping)

Added:
    jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestOpVar.java
Modified:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/OpVars.java

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/OpVars.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/OpVars.java?rev=1467681&r1=1467680&r2=1467681&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/OpVars.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/algebra/OpVars.java Sat Apr 13 19:44:20 2013
@@ -26,6 +26,7 @@ import java.util.Set ;
 import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.graph.Triple ;
 import com.hp.hpl.jena.query.SortCondition ;
+import com.hp.hpl.jena.sparql.ARQInternalErrorException ;
 import com.hp.hpl.jena.sparql.algebra.OpWalker.WalkerVisitor ;
 import com.hp.hpl.jena.sparql.algebra.op.* ;
 import com.hp.hpl.jena.sparql.core.BasicPattern ;
@@ -37,20 +38,25 @@ import com.hp.hpl.jena.sparql.pfunction.
 
 public class OpVars
 {
-    public static Set<Var> patternVars(Op op)
+    /** @deprecated use {@linkplain #visibleVars} */
+    @Deprecated
+    public static Set<Var> patternVars(Op op) { return visibleVars(op) ; } 
+    
+    public static Set<Var> visibleVars(Op op)
     {
         Set<Var> acc = new HashSet<Var>() ;
-        patternVars(op, acc) ;
+        visibleVars(op, acc) ;
         return acc ; 
     }
     
-    public static void patternVars(Op op, Set<Var> acc)
+    public static void visibleVars(Op op, Set<Var> acc)
     {
-        //OpWalker.walk(op, new OpVarsPattern(acc)) ;
-        OpVisitor visitor = new OpVarsPattern(acc) ;
-        OpWalker.walk(new WalkerVisitorSkipMinus(visitor), op) ;
+        OpVarsPattern visitor = new OpVarsPattern(acc) ;
+        OpWalker.walk(new WalkerVisitorVisible(visitor, acc), op) ;
     }
-    
+
+    /** @deprecated Not stable across scope renaming.  Use {@linkplain #visibleVars} */
+    @Deprecated
     public static Collection<Var> allVars(Op op)
     {
         Set<Var> acc = new HashSet<Var>() ;
@@ -58,9 +64,13 @@ public class OpVars
         return acc ;
     }
 
+    /** @deprecated Not stable across scope renaming.  Use {@linkplain #visibleVars} */
+    @Deprecated
+    // All mentioned variables regardless of scope/visibility.
     public static void allVars(Op op, Set<Var> acc)
     {
-        OpWalker.walk(op, new OpVarsQuery(acc)) ;
+        OpVarsQuery visitor = new OpVarsQuery(acc) ;
+        OpWalker.walk(op, visitor) ;
     }
     
     public static Collection<Var> vars(BasicPattern pattern)
@@ -76,14 +86,27 @@ public class OpVars
             addVarsFromTriple(acc, triple) ;
     }
     
-    /** Don't accumulate RHS of OpMinus*/
-    static class WalkerVisitorSkipMinus extends WalkerVisitor
+
+    /** Do project and don't walk into it. MINUS vars aren't visiible either */
+    private static class WalkerVisitorVisible extends WalkerVisitor
     {
-        public WalkerVisitorSkipMinus(OpVisitor visitor)
+        private final Collection<Var> acc ;
+
+        public WalkerVisitorVisible(OpVarsPattern visitor, Collection<Var> acc)
         {
             super(visitor) ;
+            this.acc = acc ;
         }
-        
+
+        @Override
+        public void visit(OpProject op)
+        {
+            before(op) ;
+            // Skip Project subop.
+            acc.addAll(op.getVars()) ;
+            after(op) ;  
+        }
+
         @Override
         public void visit(OpMinus op)
         {
@@ -96,6 +119,26 @@ public class OpVars
         }
     }
     
+//    /** Don't accumulate RHS of OpMinus*/
+//    private static class WalkerVisitorVisible extends WalkerVisitorProjectDirect
+//    {
+//        public WalkerVisitorVisible(OpVarsPattern visitor, Collection<Var> acc)
+//        {
+//            super(visitor, acc) ;
+//        }
+//        
+//        @Override
+//        public void visit(OpMinus op)
+//        {
+//            before(op) ;
+//            if ( op.getLeft() != null ) op.getLeft().visit(this) ;
+//            // Skip right.
+//            //if ( op.getRight() != null ) op.getRight().visit(this) ;
+//            if ( visitor != null ) op.visit(visitor) ;      
+//            after(op) ;  
+//        }
+//    }
+    
     private static class OpVarsPattern extends OpVisitorBase
     {
         // The possibly-set-vars
@@ -152,12 +195,13 @@ public class OpVars
         
         @Override
         public void visit(OpProject opProject) 
-        {   
-            // Seems a tad wasteful to do all that work then throw it away.
-            // But it needs the walker redone.
-            // Better: extend a Walking visitor - OpWalker.Walker
-            acc.clear() ;
-            acc.addAll(opProject.getVars()) ;
+        {
+            // The walker should have handled this. 
+            throw new ARQInternalErrorException() ;
+            // Code to do it without walker support ...  
+//            // Seems a tad wasteful to do all that work then throw it away.
+//            acc.clear() ;
+//            acc.addAll(opProject.getVars()) ;
         }
         
         @Override

Added: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestOpVar.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestOpVar.java?rev=1467681&view=auto
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestOpVar.java (added)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/algebra/TestOpVar.java Sat Apr 13 19:44:20 2013
@@ -0,0 +1,64 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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 com.hp.hpl.jena.sparql.algebra;
+
+import java.util.Arrays ;
+import java.util.Collection ;
+import java.util.HashSet ;
+import java.util.List ;
+
+import org.apache.jena.atlas.junit.BaseTest ;
+import org.junit.Test ;
+
+import com.hp.hpl.jena.sparql.core.Var ;
+import com.hp.hpl.jena.sparql.sse.SSE ;
+
+public class TestOpVar extends BaseTest
+{
+    @Test public void opvar_01() { opVarPattern("(bgp (?s :p ?o))", "s", "o") ; }
+    @Test public void opvar_02() { opVarPattern("(leftjoin (bgp (?s :p ?o)) (bgp (?s1 :p ?o1)) )", "s1", "o1", "s", "o") ; }
+    @Test public void opvar_03() { opVarPattern("(leftjoin (bgp (?s :p ?o)) (bgp (?s :p ?o)) )", "s", "o") ; }
+    
+    @Test public void opvar_04() { opVarPattern("(project (?s) (bgp(?s :p ?o)))", "s") ; }
+    @Test public void opvar_05() { opVarPattern("(minus (bgp (?s :p ?o)) (bgp (?s1 :p ?o1)) )", "s", "o") ; }
+    @Test public void opvar_06() { opVarPattern("(join (project (?x) (bgp(?x :p ?z)))  (bgp(?s :p 1)) )", "x", "s") ; }
+    
+    private static void opVarPattern(String string, String... vars)
+    {
+        Op op = SSE.parseOp(string) ;
+        Collection<Var> c = OpVars.visibleVars(op) ;
+        check(vars, c) ;
+    }
+
+    private static void check(String[] varsExpected, Collection<Var> varsFound)
+    {
+        Var[] vars = new Var[varsExpected.length] ;
+        for ( int i = 0 ; i < varsExpected.length ; i++ )
+        {
+            Var v = Var.alloc(varsExpected[i]) ;
+            vars[i] = v ;
+        }
+        
+        List<Var> varList = Arrays.asList(vars) ;
+        HashSet<Var> varSet = new HashSet<Var>() ;
+        varSet.addAll(varList) ;
+        assertEquals(varSet, varsFound) ;
+    }
+}
+