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 2014/05/29 21:56:52 UTC

svn commit: r1598387 - in /jena/trunk/jena-arq: src/main/java/com/hp/hpl/jena/sparql/engine/iterator/ src/test/java/com/hp/hpl/jena/sparql/ testing/ARQ/ testing/ARQ/Extra/

Author: andy
Date: Thu May 29 19:56:52 2014
New Revision: 1598387

URL: http://svn.apache.org/r1598387
Log:
JENA-705 Correct merging in of bindings in the presence of a projection.

Added:
    jena/trunk/jena-arq/testing/ARQ/Extra/
    jena/trunk/jena-arq/testing/ARQ/Extra/data-sub-select-project.ttl   (with props)
    jena/trunk/jena-arq/testing/ARQ/Extra/manifest.ttl   (with props)
    jena/trunk/jena-arq/testing/ARQ/Extra/sub-select-project-01.rq
    jena/trunk/jena-arq/testing/ARQ/Extra/sub-select-project-01.srj
Modified:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/iterator/QueryIterProjectMerge.java
    jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/TC_Scripted.java
    jena/trunk/jena-arq/testing/ARQ/manifest-arq.ttl

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/iterator/QueryIterProjectMerge.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/iterator/QueryIterProjectMerge.java?rev=1598387&r1=1598386&r2=1598387&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/iterator/QueryIterProjectMerge.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/engine/iterator/QueryIterProjectMerge.java Thu May 29 19:56:52 2014
@@ -18,14 +18,17 @@
 
 package com.hp.hpl.jena.sparql.engine.iterator ;
 
+import java.util.Iterator ;
 import java.util.List ;
 
+import org.apache.jena.atlas.logging.Log ;
+
+import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.sparql.algebra.op.OpProject ;
 import com.hp.hpl.jena.sparql.core.Var ;
 import com.hp.hpl.jena.sparql.engine.ExecutionContext ;
 import com.hp.hpl.jena.sparql.engine.QueryIterator ;
-import com.hp.hpl.jena.sparql.engine.binding.Binding ;
-import com.hp.hpl.jena.sparql.engine.binding.BindingUtils ;
+import com.hp.hpl.jena.sparql.engine.binding.* ;
 import com.hp.hpl.jena.sparql.engine.main.OpExecutor ;
 
 /**
@@ -48,13 +51,13 @@ public class QueryIterProjectMerge exten
     protected QueryIterator nextStage(Binding binding) {
         QueryIterator qIter = engine.executeOp(opProject.getSubOp(),
                                                QueryIterSingleton.create(binding, getExecContext())) ;
-
         qIter = new QueryIterConvert(qIter,
                                      new ProjectEnsureBindingConverter(binding, opProject.getVars()),
                                      getExecContext()) ;
         return qIter ;
     }
 
+    /** Ensure binding from outer binding are present when projecting */  
     static class ProjectEnsureBindingConverter implements QueryIterConvert.Converter {
 
         private final Binding   outerBinding ;
@@ -67,7 +70,36 @@ public class QueryIterProjectMerge exten
 
         @Override
         public Binding convert(Binding bind) {
-            return BindingUtils.merge(outerBinding, bind) ;
+            return ensure(projectionVars, outerBinding, bind) ;
+            // Effectively, this is:
+            //bind = new BindingProject(projectionVars, bind) ;
+            // return BindingUtils.merge(outerBinding, bind) ;
+        }
+        
+        /** Merge two bindings, the outer and inner, projecting the inner with the give variables.
+         *  This is what happens in substitutIon execution, with a inner select-project.  
+         */
+        private static Binding ensure(List<Var> vars, Binding outer, Binding inner) {
+            // A specialised BindingUtils.merge that does project as well.
+            // Reduce small object churn.
+            BindingMap b2 = BindingFactory.create(outer) ;
+            Iterator<Var> vIter = (vars != null) ? vars.iterator() : inner.vars() ;
+            // Add any variables from the RHS
+            for ( ; vIter.hasNext() ; ) {
+                Var v = vIter.next() ;
+                Node n2 = inner.get(v) ;
+                if ( n2 == null )
+                    continue ;
+                if ( ! b2.contains(v) )
+                    b2.add(v, inner.get(v)) ;
+                else {
+                    // Checking!
+                    Node n1 = outer.get(v) ;
+                    if ( ! n1.equals(n2) )
+                        Log.warn(BindingUtils.class,  "merge: Mismatch : "+n1+" != "+n2);
+                }
+            }
+            return b2 ;
         }
     }
 }

Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/TC_Scripted.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/TC_Scripted.java?rev=1598387&r1=1598386&r2=1598387&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/TC_Scripted.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/TC_Scripted.java Thu May 29 19:56:52 2014
@@ -29,8 +29,8 @@ public class TC_Scripted extends TestSui
     static public TestSuite suite()
     {
         TestSuite ts = new TC_Scripted() ;
-        ts.addTest(ScriptTestSuiteFactory.make(ARQTestSuite.testDirARQ+"/manifest-arq.ttl")) ;
         ts.addTest(ScriptTestSuiteFactory.make(ARQTestSuite.testDirARQ+"/Syntax/manifest-syntax.ttl")) ;
+        ts.addTest(ScriptTestSuiteFactory.make(ARQTestSuite.testDirARQ+"/manifest-arq.ttl")) ;
         ts.addTest(ScriptTestSuiteFactory.make(ARQTestSuite.testDirARQ+"/Serialization/manifest.ttl")) ;
         return ts ;
     }

Added: jena/trunk/jena-arq/testing/ARQ/Extra/data-sub-select-project.ttl
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/testing/ARQ/Extra/data-sub-select-project.ttl?rev=1598387&view=auto
==============================================================================
Binary file - no diff available.

Propchange: jena/trunk/jena-arq/testing/ARQ/Extra/data-sub-select-project.ttl
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: jena/trunk/jena-arq/testing/ARQ/Extra/manifest.ttl
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/testing/ARQ/Extra/manifest.ttl?rev=1598387&view=auto
==============================================================================
Binary file - no diff available.

Propchange: jena/trunk/jena-arq/testing/ARQ/Extra/manifest.ttl
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: jena/trunk/jena-arq/testing/ARQ/Extra/sub-select-project-01.rq
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/testing/ARQ/Extra/sub-select-project-01.rq?rev=1598387&view=auto
==============================================================================
--- jena/trunk/jena-arq/testing/ARQ/Extra/sub-select-project-01.rq (added)
+++ jena/trunk/jena-arq/testing/ARQ/Extra/sub-select-project-01.rq Thu May 29 19:56:52 2014
@@ -0,0 +1,7 @@
+PREFIX : <http://example/> 
+
+SELECT * {
+  ?s :p ?o .
+  { SELECT ?s { ?s :p ?z } }
+  { SELECT ?s { ?s :q ?z } }
+}

Added: jena/trunk/jena-arq/testing/ARQ/Extra/sub-select-project-01.srj
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/testing/ARQ/Extra/sub-select-project-01.srj?rev=1598387&view=auto
==============================================================================
--- jena/trunk/jena-arq/testing/ARQ/Extra/sub-select-project-01.srj (added)
+++ jena/trunk/jena-arq/testing/ARQ/Extra/sub-select-project-01.srj Thu May 29 19:56:52 2014
@@ -0,0 +1,13 @@
+{
+  "head": {
+    "vars": [ "s" , "o" ]
+  } ,
+  "results": {
+    "bindings": [
+      {
+        "s": { "type": "uri" , "value": "http://example/s" } ,
+        "o": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "1" }
+      }
+    ]
+  }
+}

Modified: jena/trunk/jena-arq/testing/ARQ/manifest-arq.ttl
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/testing/ARQ/manifest-arq.ttl?rev=1598387&r1=1598386&r2=1598387&view=diff
==============================================================================
--- jena/trunk/jena-arq/testing/ARQ/manifest-arq.ttl (original)
+++ jena/trunk/jena-arq/testing/ARQ/manifest-arq.ttl Thu May 29 19:56:52 2014
@@ -77,12 +77,16 @@
         <EngineRef/manifest.ttl>
         <EngineMain/manifest.ttl>
 
-    ## ARQ extensions
+    ## SPARQL 1.1
         <Assign/manifest.ttl>
         <SelectExpr/manifest.ttl>
         <GroupBy/manifest.ttl>
         <SubQuery/manifest.ttl>
         <Paths/manifest.ttl>
         <Negation/manifest.ttl>
+
+    ## Addition misc tests
+        <Extra/manifest.ttl>
+
     ) .