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) ;