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>
+
) .