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 2018/05/12 16:15:09 UTC

[3/9] jena git commit: JENA-1544: Consistent FROM/FROM NAMED naming handling

JENA-1544: Consistent FROM/FROM NAMED naming handling


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

Branch: refs/heads/master
Commit: 1bcf8f40f449555013174c14c097a6532d4e3455
Parents: ee053b7
Author: Andy Seaborne <an...@apache.org>
Authored: Mon May 7 14:58:03 2018 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat May 12 01:44:48 2018 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/jena/query/Query.java  |  3 +-
 .../jena/sparql/core/DynamicDatasets.java       | 10 +--
 .../jena/sparql/engine/QueryEngineBase.java     | 70 +++++++++++++++-----
 .../jena/sparql/engine/QueryExecutionBase.java  | 34 +++-------
 .../sparql/engine/main/QueryEngineMain.java     |  2 +-
 .../apache/jena/sparql/graph/TestDatasets.java  |  4 --
 .../apache/jena/tdb2/solver/QueryEngineTDB.java | 27 +++-----
 .../apache/jena/tdb/solver/QueryEngineTDB.java  | 36 ++++------
 8 files changed, 95 insertions(+), 91 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/1bcf8f40/jena-arq/src/main/java/org/apache/jena/query/Query.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/Query.java b/jena-arq/src/main/java/org/apache/jena/query/Query.java
index bf50817..8199d43 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/Query.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/Query.java
@@ -339,7 +339,8 @@ public class Query extends Prologue implements Cloneable, Printable
     /** Return a dataset description (FROM/FROM NAMED clauses) for the query. */  
     public DatasetDescription getDatasetDescription()
     {
-        if ( ! hasDatasetDescription() ) return null;
+        if ( ! hasDatasetDescription() )
+            return null;
         
         DatasetDescription description = new DatasetDescription() ;
         

http://git-wip-us.apache.org/repos/asf/jena/blob/1bcf8f40/jena-arq/src/main/java/org/apache/jena/sparql/core/DynamicDatasets.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DynamicDatasets.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DynamicDatasets.java
index de537aa..a13769b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DynamicDatasets.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DynamicDatasets.java
@@ -46,16 +46,16 @@ public class DynamicDatasets
 
     /** Given a DatasetGraph and a query, form a DatasetGraph that 
      * is the dynamic dataset from the query.
-     * Returns the original DatasetGraph if the dataset description is null.
+     * Returns the original DatasetGraph if the dataset description is null or empty.
      */ 
     public static DatasetGraph dynamicDataset(DatasetDescription description, DatasetGraph dsg, boolean defaultUnionGraph)
     {
         if ( description == null )
             return dsg ;    
-//    	//An empty description means leave the dataset as-is
-//    	if (description.getDefaultGraphURIs().size() == 0 && description.getNamedGraphURIs().size() == 0) {
-//    		return dsg;
-//    	}
+    	//An empty description means leave the dataset as-is
+    	if (description.isEmpty() )
+    		return dsg;
+    	
         Set<Node> defaultGraphs = NodeUtils.convertToNodes(description.getDefaultGraphURIs()) ; 
         Set<Node> namedGraphs = NodeUtils.convertToNodes(description.getNamedGraphURIs()) ;
         return dynamicDataset(defaultGraphs, namedGraphs, dsg, defaultUnionGraph) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/1bcf8f40/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineBase.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineBase.java
index 5fd8aed..147a999 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryEngineBase.java
@@ -21,22 +21,28 @@ package org.apache.jena.sparql.engine;
 import org.apache.jena.atlas.lib.Closeable ;
 import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.query.Query ;
+import org.apache.jena.query.QueryExecException;
+import org.apache.jena.riot.system.IRIResolver;
 import org.apache.jena.sparql.ARQConstants ;
 import org.apache.jena.sparql.algebra.Algebra ;
 import org.apache.jena.sparql.algebra.Op ;
+import org.apache.jena.sparql.core.DatasetDescription;
 import org.apache.jena.sparql.core.DatasetGraph ;
+import org.apache.jena.sparql.core.DynamicDatasets;
 import org.apache.jena.sparql.core.Substitute ;
 import org.apache.jena.sparql.engine.binding.Binding ;
 import org.apache.jena.sparql.engine.binding.BindingRoot ;
 import org.apache.jena.sparql.mgt.Explain ;
 import org.apache.jena.sparql.mgt.QueryEngineInfo ;
 import org.apache.jena.sparql.util.Context ;
+import org.apache.jena.sparql.util.DatasetUtils;
 
 /** Main part of a QueryEngine - something that takes responsibility for a complete query execution */ 
 public abstract class QueryEngineBase implements OpEval, Closeable
 {
     public final static QueryEngineInfo queryEngineInfo = new QueryEngineInfo() ;
-    // See also ExecutinContext.getDataset()
+    // See also ExecutionContext.getDataset()
+    protected final DatasetGraph originalDataset ;
     protected DatasetGraph dataset = null ;
     protected Context context ;
     private Binding startBinding ;
@@ -45,20 +51,41 @@ public abstract class QueryEngineBase implements OpEval, Closeable
     private Op queryOp = null ;
     private Plan plan = null ;
     
-    protected QueryEngineBase(Query query,
-                              DatasetGraph dataset, 
-                              Binding input,
-                              Context cxt)
-    {
-        this(dataset, input, cxt) ;
+    protected QueryEngineBase(Query query, DatasetGraph dsg, Binding input, Context cxt) {
+        this(dsg, input, cxt) ;
         this.query = query ;
         query.setResultVars() ;
         // Unoptimized so far.
         setOp(createOp(query)) ;
+        dataset = prepareDataset(dsg, query);
     }
-    
-    protected QueryEngineBase(Op op, DatasetGraph dataset, Binding input, Context cxt)
-    {
+
+    private DatasetGraph prepareDataset(DatasetGraph originalDataset, Query query) {
+        DatasetDescription dsDesc = DatasetDescription.create(query, context) ;
+        DatasetGraph dsg = originalDataset;
+        
+        if ( dsg != null ) { 
+            if ( dsDesc != null ) {
+                if ( query.hasDatasetDescription() )
+                    dsg = dynamicDataset(dsDesc, dsg, false);
+            }
+            return dsg;
+        }
+
+        // No DatasetGraph
+        if ( ! query.hasDatasetDescription() ) 
+            throw new QueryExecException("No dataset and no dataset description for query");
+
+        // DatasetDescription : Build it.
+        String baseURI = query.getBaseURI() ;
+        if ( baseURI == null )
+            baseURI = IRIResolver.chooseBaseURI().toString() ;
+
+        dsg = DatasetUtils.createDatasetGraph(dsDesc, baseURI ) ;
+        return dsg ;
+    }
+
+    protected QueryEngineBase(Op op, DatasetGraph dataset, Binding input, Context cxt) {
         this(dataset, input, cxt) ;
         // Ensure context setup - usually done in QueryExecutionBase
         // so it can be changed after initialization.
@@ -68,13 +95,11 @@ public abstract class QueryEngineBase implements OpEval, Closeable
         setOp(op) ;
     }
     
-    private QueryEngineBase(DatasetGraph dataset, Binding input, Context context)
-    {
+    private QueryEngineBase(DatasetGraph dataset, Binding input, Context context) {
         this.context = context ;
-        this.dataset = dataset ;    // Maybe null e.g. in query
-        
-        if ( input == null )
-        {
+        this.originalDataset = dataset ;
+        this.dataset = dataset ;
+        if ( input == null ) {
             Log.warn(this, "Null initial input") ;
             input = BindingRoot.create() ;
         }
@@ -120,6 +145,19 @@ public abstract class QueryEngineBase implements OpEval, Closeable
         return op ;
     }
     
+    /** Calculate a dataset based on FROM and FROM NAMED in the query */ 
+    protected DatasetGraph dynamicDataset(DatasetDescription dsDesc, DatasetGraph dataset, boolean unionDftGraph) {
+        return DynamicDatasets.dynamicDataset(dsDesc, dataset, unionDftGraph) ;
+    }
+    
+    /** Retrun whether the dataset to execute against is the original one,
+     *  or a DatasetDescription modified one
+     *  (or a built one for provided dataset being null.
+     */
+    protected boolean isDynamicDataset() {
+        return originalDataset != dataset;
+    }
+    
     // Record the query operation as it goes pass and call the actual worker
     @Override
     final

http://git-wip-us.apache.org/repos/asf/jena/blob/1bcf8f40/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryExecutionBase.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryExecutionBase.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryExecutionBase.java
index 95c18c7..e86c857 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryExecutionBase.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/QueryExecutionBase.java
@@ -34,7 +34,6 @@ import org.apache.jena.graph.Node;
 import org.apache.jena.graph.Triple;
 import org.apache.jena.query.* ;
 import org.apache.jena.rdf.model.* ;
-import org.apache.jena.riot.system.IRIResolver;
 import org.apache.jena.shared.PrefixMapping;
 import org.apache.jena.sparql.ARQConstants;
 import org.apache.jena.sparql.core.DatasetGraph;
@@ -52,19 +51,20 @@ import org.apache.jena.sparql.modify.TemplateLib;
 import org.apache.jena.sparql.syntax.ElementGroup;
 import org.apache.jena.sparql.syntax.Template;
 import org.apache.jena.sparql.util.Context;
-import org.apache.jena.sparql.util.DatasetUtils;
 import org.apache.jena.sparql.util.ModelUtils;
 
 /** All the SPARQL query result forms made from a graph-level execution object */ 
 
 public class QueryExecutionBase implements QueryExecution
 {
-    private Query                    query;
-    private Dataset                  dataset;
-    private QueryEngineFactory       qeFactory;
+    private final Query              query;
+    private final QueryEngineFactory qeFactory;
+    private final Context            context;
+    private final Dataset            dataset;
+    private final DatasetGraph       dsg;
+    
     private QueryIterator            queryIterator    = null;
     private Plan                     plan             = null;
-    private Context                  context;
     private QuerySolution            initialBinding   = null;
 
     // Set if QueryIterator.cancel has been called
@@ -86,14 +86,13 @@ public class QueryExecutionBase implements QueryExecution
                               Context context, QueryEngineFactory qeFactory) {
         this.query = query;
         this.dataset = dataset ;
-        this.context = context ;
         this.qeFactory = qeFactory ;
+        this.dsg = (dataset == null) ? null : dataset.asDatasetGraph() ;
+        this.context = Context.setupContextExec(context, dsg) ;
         init() ;
     }
     
     private void init() {
-        DatasetGraph dsg = (dataset == null) ? null : dataset.asDatasetGraph() ;
-        context = Context.setupContextExec(context, dsg) ;
         if ( query != null )
             context.put(ARQConstants.sysCurrentQuery, query) ;
         // NB: Setting timeouts via the context after creating a QueryExecutionBase 
@@ -557,7 +556,6 @@ public class QueryExecutionBase implements QueryExecution
 
     public Plan getPlan() {
         if ( plan == null ) {
-            DatasetGraph dsg = prepareDataset(dataset, query);
             Binding inputBinding = null;
             if ( initialBinding != null )
                 inputBinding = BindingUtils.asBinding(initialBinding);
@@ -608,22 +606,6 @@ public class QueryExecutionBase implements QueryExecution
     @Override
     public Query getQuery()     { return query ; }
 
-    private static DatasetGraph prepareDataset(Dataset dataset, Query query) {
-        if ( dataset != null )
-            return dataset.asDatasetGraph();
-
-        if ( ! query.hasDatasetDescription() ) 
-            //Query.Log.warn(this, "No data for query (no URL, no model)");
-            throw new QueryExecException("No dataset description for query");
-        
-        String baseURI = query.getBaseURI() ;
-        if ( baseURI == null )
-            baseURI = IRIResolver.chooseBaseURI().toString() ;
-        
-        DatasetGraph dsg = DatasetUtils.createDatasetGraph(query.getDatasetDescription(), baseURI ) ;
-        return dsg ;
-    }
-    
     @Override
     public void setInitialBinding(QuerySolution startSolution) {
         initialBinding = startSolution ;

http://git-wip-us.apache.org/repos/asf/jena/blob/1bcf8f40/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java
index 49a7452..34edd9f 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/QueryEngineMain.java
@@ -44,7 +44,7 @@ public class QueryEngineMain extends QueryEngineBase
     { 
         super(query, dataset, input, context) ;
     }
-
+    
     @Override
     public QueryIterator eval(Op op, DatasetGraph dsg, Binding input, Context context)
     {

http://git-wip-us.apache.org/repos/asf/jena/blob/1bcf8f40/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestDatasets.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestDatasets.java b/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestDatasets.java
index a527455..6e81433 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestDatasets.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestDatasets.java
@@ -26,7 +26,6 @@ import java.util.List ;
 import org.apache.jena.atlas.lib.Creator ;
 import org.apache.jena.query.* ;
 import org.apache.jena.sparql.core.DatasetGraph ;
-import org.apache.jena.sparql.core.DynamicDatasets ;
 import org.apache.jena.update.UpdateExecutionFactory ;
 import org.apache.jena.update.UpdateFactory ;
 import org.apache.jena.update.UpdateProcessor ;
@@ -75,9 +74,6 @@ public class TestDatasets {
 		//Parse the query
 		Query q = QueryFactory.create(query);
 		
-		//Render the dataset appropriately, ARQ doesn't do this for us automatically
-		Dataset ds = DynamicDatasets.dynamicDataset(q.getDatasetDescription(), this.ds, false);
-		
 		//Then execute the query
 		QueryExecution exec = QueryExecutionFactory.create(q, ds);
 		

http://git-wip-us.apache.org/repos/asf/jena/blob/1bcf8f40/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/QueryEngineTDB.java
----------------------------------------------------------------------
diff --git a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/QueryEngineTDB.java b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/QueryEngineTDB.java
index 159ea79..388c81f 100644
--- a/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/QueryEngineTDB.java
+++ b/jena-db/jena-tdb2/src/main/java/org/apache/jena/tdb2/solver/QueryEngineTDB.java
@@ -55,45 +55,40 @@ public class QueryEngineTDB extends QueryEngineMain
     static public void register()       { QueryEngineRegistry.addFactory(factory) ; }
     static public void unregister()     { QueryEngineRegistry.removeFactory(factory) ; }
     
-    private Binding initialInput ;
-
     // ---- Object
+    
     protected QueryEngineTDB(Op op, DatasetGraphTDB dataset, Binding input, Context context)
     {
         super(op, dataset, input, context) ;
-        this.initialInput = input ;
     }
     
-    private boolean doingDynamicDatasetBySpecialDataset = false ;
-    
     protected QueryEngineTDB(Query query, DatasetGraphTDB dataset, Binding input, Context cxt)
     { 
         super(query, dataset, input, cxt) ; 
-        DatasetDescription dsDesc = DatasetDescription.create(query, context) ;
-        
-        if ( dsDesc != null )
-        {
-            doingDynamicDatasetBySpecialDataset = true ;
-            super.dataset = DynamicDatasets.dynamicDataset(dsDesc, dataset, isUnionDefaultGraph(cxt) ) ;
-        }
-        this.initialInput = input ; 
     }
     
     private static boolean isUnionDefaultGraph(Context cxt) {
         return cxt.isTrue(TDB2.symUnionDefaultGraph1) || cxt.isTrue(TDB2.symUnionDefaultGraph2);
     }
     
+    @Override
+    protected DatasetGraph dynamicDataset(DatasetDescription dsDesc, DatasetGraph dataset, boolean unionDftGraph) {
+        boolean union = unionDftGraph || isUnionDefaultGraph(context);
+        return DynamicDatasets.dynamicDataset(dsDesc, dataset, union ) ;
+    }
+
+    
     // Choose the algebra-level optimizations to invoke. 
     @Override
     protected Op modifyOp(Op op)
     {
-        op = Substitute.substitute(op, initialInput) ;
+        op = Substitute.substitute(op, getStartBinding()) ;
         // Optimize (high-level)
         op = super.modifyOp(op) ;
 
         // Quadification
         // Only apply if not a rewritten DynamicDataset
-        if ( ! doingDynamicDatasetBySpecialDataset )
+        if ( ! isDynamicDataset() )
             op = Algebra.toQuadForm(op) ;
         
         // Record it.
@@ -108,7 +103,7 @@ public class QueryEngineTDB extends QueryEngineMain
         // Op is quad'ed by now but there still may be some (graph ....) forms e.g. paths
         
         // Fix DatasetGraph for global union.
-        if ( isUnionDefaultGraph(context) && ! doingDynamicDatasetBySpecialDataset ) 
+        if ( isUnionDefaultGraph(context) && ! isDynamicDataset() ) 
         {
             op = A2.unionDefaultGraphQuads(op) ;
             Explain.explain("REWRITE(Union default graph)", op, context) ;

http://git-wip-us.apache.org/repos/asf/jena/blob/1bcf8f40/jena-tdb/src/main/java/org/apache/jena/tdb/solver/QueryEngineTDB.java
----------------------------------------------------------------------
diff --git a/jena-tdb/src/main/java/org/apache/jena/tdb/solver/QueryEngineTDB.java b/jena-tdb/src/main/java/org/apache/jena/tdb/solver/QueryEngineTDB.java
index cf89a03..85247fa 100644
--- a/jena-tdb/src/main/java/org/apache/jena/tdb/solver/QueryEngineTDB.java
+++ b/jena-tdb/src/main/java/org/apache/jena/tdb/solver/QueryEngineTDB.java
@@ -54,42 +54,34 @@ public class QueryEngineTDB extends QueryEngineMain
     static public QueryEngineFactory getFactory() { return factory ; } 
     static public void register()       { QueryEngineRegistry.addFactory(factory) ; }
     static public void unregister()     { QueryEngineRegistry.removeFactory(factory) ; }
-    
-    private Binding initialInput ;
 
     // ---- Object
-    protected QueryEngineTDB(Op op, DatasetGraphTDB dataset, Binding input, Context context)
-    {
-        super(op, dataset, input, context) ;
-        this.initialInput = input ;
+
+    protected QueryEngineTDB(Op op, DatasetGraphTDB dataset, Binding input, Context context) {
+        super(op, dataset, input, context);
+    }
+
+    protected QueryEngineTDB(Query query, DatasetGraphTDB dataset, Binding input, Context cxt) {
+        super(query, dataset, input, cxt);
     }
     
-    private boolean doingDynamicDatasetBySpecialDataset = false ;
-    
-    protected QueryEngineTDB(Query query, DatasetGraphTDB dataset, Binding input, Context cxt)
-    { 
-        super(query, dataset, input, cxt) ; 
-        DatasetDescription dsDesc = DatasetDescription.create(query, context) ;
-        
-        if ( dsDesc != null )
-        {
-            doingDynamicDatasetBySpecialDataset = true ;
-            super.dataset = DynamicDatasets.dynamicDataset(dsDesc, dataset, cxt.isTrue(TDB.symUnionDefaultGraph) ) ;
-        }
-        this.initialInput = input ; 
+    @Override
+    protected DatasetGraph dynamicDataset(DatasetDescription dsDesc, DatasetGraph dataset, boolean unionDftGraph) {
+        boolean union = unionDftGraph || context.isTrue(TDB.symUnionDefaultGraph);
+        return DynamicDatasets.dynamicDataset(dsDesc, dataset, union ) ;
     }
     
     // Choose the algebra-level optimizations to invoke. 
     @Override
     protected Op modifyOp(Op op)
     {
-        op = Substitute.substitute(op, initialInput) ;
+        op = Substitute.substitute(op, getStartBinding()) ;
         // Optimize (high-level)
         op = super.modifyOp(op) ;
 
         // Quadification
         // Only apply if not a rewritten DynamicDataset
-        if ( ! doingDynamicDatasetBySpecialDataset )
+        if ( ! isDynamicDataset() )
             op = Algebra.toQuadForm(op) ;
         
         // Record it.
@@ -104,7 +96,7 @@ public class QueryEngineTDB extends QueryEngineMain
         // Op is quad'ed by now but there still may be some (graph ....) forms e.g. paths
         
         // Fix DatasetGraph for global union.
-        if ( context.isTrue(TDB.symUnionDefaultGraph) && ! doingDynamicDatasetBySpecialDataset ) 
+        if ( context.isTrue(TDB.symUnionDefaultGraph) && ! isDynamicDataset() ) 
         {
             op = A2.unionDefaultGraphQuads(op) ;
             Explain.explain("REWRITE(Union default graph)", op, context) ;