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 2015/12/15 10:44:06 UTC
[1/2] jena git commit: Tidy and reformat. Add comments.
Repository: jena
Updated Branches:
refs/heads/master cfbc49188 -> 3008d5d34
Tidy and reformat. Add comments.
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/3008d5d3
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/3008d5d3
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/3008d5d3
Branch: refs/heads/master
Commit: 3008d5d34017addd7b265df5e018205b95d94122
Parents: f33f205
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Dec 15 09:37:11 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Dec 15 09:43:49 2015 +0000
----------------------------------------------------------------------
.../jena/sparql/modify/UpdateEngineWorker.java | 599 +++++++++----------
1 file changed, 273 insertions(+), 326 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/3008d5d3/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java b/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
index 275ab3c..e3a21a6 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
@@ -69,11 +69,10 @@ public class UpdateEngineWorker implements UpdateVisitor
{
protected final DatasetGraph datasetGraph ;
protected final boolean alwaysSilent = true ;
- protected final Binding inputBinding; // Used for UpdateModify and UpdateDeleteWhere only
+ protected final Binding inputBinding; // Used for UpdateModify only
protected final Context context ;
- public UpdateEngineWorker(DatasetGraph datasetGraph, Binding inputBinding, Context context)
- {
+ public UpdateEngineWorker(DatasetGraph datasetGraph, Binding inputBinding, Context context) {
this.datasetGraph = datasetGraph ;
this.inputBinding = inputBinding ;
this.context = context ;
@@ -87,274 +86,247 @@ public class UpdateEngineWorker implements UpdateVisitor
public void visit(UpdateClear update)
{ execDropClear(update, true) ; }
- protected void execDropClear(UpdateDropClear update, boolean isClear)
- {
- if ( update.isAll() )
- {
- execDropClear(update, null, true) ; // Always clear.
- execDropClearAllNamed(update, isClear) ;
- }
- else if ( update.isAllNamed() )
- execDropClearAllNamed(update, isClear) ;
+ protected void execDropClear(UpdateDropClear update, boolean isClear) {
+ if ( update.isAll() ) {
+ execDropClear(update, null, true); // Always clear.
+ execDropClearAllNamed(update, isClear);
+ } else if ( update.isAllNamed() )
+ execDropClearAllNamed(update, isClear);
else if ( update.isDefault() )
- execDropClear(update, null, true) ;
+ execDropClear(update, null, true);
else if ( update.isOneGraph() )
- execDropClear(update, update.getGraph(), isClear) ;
+ execDropClear(update, update.getGraph(), isClear);
else
- throw new ARQInternalErrorException("Target is undefined: "+update.getTarget()) ;
+ throw new ARQInternalErrorException("Target is undefined: " + update.getTarget());
}
- protected void execDropClear(UpdateDropClear update, Node g, boolean isClear)
- {
- if ( ! alwaysSilent )
- {
- if ( g != null && ! datasetGraph.containsGraph(g) && ! update.isSilent())
- error("No such graph: "+g) ;
+ protected void execDropClear(UpdateDropClear update, Node g, boolean isClear) {
+ if ( !alwaysSilent ) {
+ if ( g != null && !datasetGraph.containsGraph(g) && !update.isSilent() )
+ error("No such graph: " + g);
}
-
- if ( isClear )
- {
+
+ if ( isClear ) {
if ( g == null || datasetGraph.containsGraph(g) )
- graph(datasetGraph, g).clear() ;
- }
- else
- datasetGraph.removeGraph(g) ;
+ graph(datasetGraph, g).clear();
+ } else
+ datasetGraph.removeGraph(g);
}
- protected void execDropClearAllNamed(UpdateDropClear update, boolean isClear)
- {
+ protected void execDropClearAllNamed(UpdateDropClear update, boolean isClear) {
// Avoid ConcurrentModificationException
- List<Node> list = Iter.toList(datasetGraph.listGraphNodes()) ;
-
+ List<Node> list = Iter.toList(datasetGraph.listGraphNodes());
+
for ( Node gn : list )
- execDropClear(update, gn, isClear) ;
+ execDropClear(update, gn, isClear);
}
@Override
- public void visit(UpdateCreate update)
- {
- Node g = update.getGraph() ;
+ public void visit(UpdateCreate update) {
+ Node g = update.getGraph();
if ( g == null )
- return ;
- if ( datasetGraph.containsGraph(g) )
- {
- if ( ! alwaysSilent && ! update.isSilent() )
- error("Graph store already contains graph : "+g) ;
- return ;
+ return;
+ if ( datasetGraph.containsGraph(g) ) {
+ if ( !alwaysSilent && !update.isSilent() )
+ error("Graph store already contains graph : " + g);
+ return;
}
- // In-memory specific
- datasetGraph.addGraph(g, GraphFactory.createDefaultGraph()) ;
+ // In-memory specific
+ datasetGraph.addGraph(g, GraphFactory.createDefaultGraph());
}
@Override
- public void visit(UpdateLoad update)
- {
- String source = update.getSource() ;
- Node dest = update.getDest() ;
+ public void visit(UpdateLoad update) {
+ // LOAD SILENT? iri ( INTO GraphRef )?
+ String source = update.getSource();
+ Node dest = update.getDest();
try {
// Read into temporary storage to protect against parse errors.
- TypedInputStream s = RDFDataMgr.open(source) ;
- Lang lang = RDFDataMgr.determineLang(source, s.getContentType(), null) ;
-
+ TypedInputStream s = RDFDataMgr.open(source);
+ Lang lang = RDFDataMgr.determineLang(source, s.getContentType(), null);
+
if ( RDFLanguages.isTriples(lang) ) {
// Triples
- Graph g = GraphFactory.createGraphMem() ;
- StreamRDF stream = StreamRDFLib.graph(g) ;
- RDFDataMgr.parse(stream, s, source) ;
- Graph g2 = graph(datasetGraph, dest) ;
- GraphUtil.addInto(g2, g) ;
+ Graph g = GraphFactory.createGraphMem();
+ StreamRDF stream = StreamRDFLib.graph(g);
+ RDFDataMgr.parse(stream, s, source);
+ Graph g2 = graph(datasetGraph, dest);
+ GraphUtil.addInto(g2, g);
} else {
// Quads
if ( dest != null )
- throw new UpdateException("Attempt to load quads into a graph") ;
- DatasetGraph dsg = DatasetGraphFactory.create() ;
- StreamRDF stream = StreamRDFLib.dataset(dsg) ;
- RDFDataMgr.parse(stream, s, source) ;
- Iterator<Quad> iter = dsg.find() ;
- for ( ; iter.hasNext() ; )
- {
- Quad q = iter.next() ;
- datasetGraph.add(q) ;
+ throw new UpdateException("Attempt to load quads into a graph");
+ DatasetGraph dsg = DatasetGraphFactory.create();
+ StreamRDF stream = StreamRDFLib.dataset(dsg);
+ RDFDataMgr.parse(stream, s, source);
+ Iterator<Quad> iter = dsg.find();
+ for ( ; iter.hasNext() ; ) {
+ Quad q = iter.next();
+ datasetGraph.add(q);
}
}
- } catch (RuntimeException ex)
- {
- if ( ! update.getSilent() )
- {
+ }
+ catch (RuntimeException ex) {
+ if ( !update.getSilent() ) {
if ( ex instanceof UpdateException )
- throw (UpdateException)ex ;
- throw new UpdateException("Failed to LOAD '"+source+"'", ex) ;
+ throw (UpdateException)ex;
+ throw new UpdateException("Failed to LOAD '" + source + "'", ex);
}
}
}
-
+
@Override
- public void visit(UpdateAdd update)
- {
- if ( ! validBinaryGraphOp(update) ) return ;
+ public void visit(UpdateAdd update) {
+ // ADD SILENT? (DEFAULT or GRAPH) TO (DEFAULT or GRAPH)
+ if ( !validBinaryGraphOp(update) )
+ return;
if ( update.getSrc().equals(update.getDest()) )
- return ;
- // ADD (DEFAULT or GRAPH) TO (DEFAULT or GRAPH)
+ return;
// Different source and destination.
- gsCopyTriples(datasetGraph, update.getSrc(), update.getDest()) ;
+ gsAddTriples(datasetGraph, update.getSrc(), update.getDest());
}
@Override
- public void visit(UpdateCopy update)
- {
- if ( ! validBinaryGraphOp(update) ) return ;
+ public void visit(UpdateCopy update) {
+ // COPY SILENT? (DEFAULT or GRAPH) TO (DEFAULT or GRAPH)
+ if ( !validBinaryGraphOp(update) )
+ return;
if ( update.getSrc().equals(update.getDest()) )
- return ;
- // COPY (DEFAULT or GRAPH) TO (DEFAULT or GRAPH)
- gsCopy(datasetGraph, update.getSrc(), update.getDest(), update.getSilent()) ;
+ return;
+ gsCopy(datasetGraph, update.getSrc(), update.getDest(), update.getSilent());
}
@Override
- public void visit(UpdateMove update)
- {
- if ( ! validBinaryGraphOp(update) ) return ;
+ public void visit(UpdateMove update) {
+ // MOVE SILENT? (DEFAULT or GRAPH) TO (DEFAULT or GRAPH)
+ if ( !validBinaryGraphOp(update) )
+ return;
if ( update.getSrc().equals(update.getDest()) )
- return ;
+ return;
// MOVE (DEFAULT or GRAPH) TO (DEFAULT or GRAPH)
// Difefrent source and destination.
- gsCopy(datasetGraph, update.getSrc(), update.getDest(), update.getSilent()) ;
- gsDrop(datasetGraph, update.getSrc(), true) ;
+ gsCopy(datasetGraph, update.getSrc(), update.getDest(), update.getSilent());
+ gsDrop(datasetGraph, update.getSrc(), true);
}
- private boolean validBinaryGraphOp(UpdateBinaryOp update)
- {
+ private boolean validBinaryGraphOp(UpdateBinaryOp update) {
if ( update.getSrc().isDefault() )
- return true ;
-
- if ( update.getSrc().isOneNamedGraph() )
- {
- Node gn = update.getSrc().getGraph() ;
- if ( ! datasetGraph.containsGraph(gn) )
- {
- if ( ! update.getSilent() )
- error("No such graph: "+gn) ;
- return false ;
+ return true;
+
+ if ( update.getSrc().isOneNamedGraph() ) {
+ Node gn = update.getSrc().getGraph();
+ if ( !datasetGraph.containsGraph(gn) ) {
+ if ( !update.getSilent() )
+ error("No such graph: " + gn);
+ return false;
}
- return true ;
+ return true;
}
- error("Invalid source target for oepration; "+update.getSrc()) ;
- return false ;
+ error("Invalid source target for oepration; " + update.getSrc());
+ return false;
}
// ----
// Core operations
-
+ /** Copy from src to dst : copy overwrites (= deletes) the old contents */
protected static void gsCopy(DatasetGraph dsg, Target src, Target dest, boolean isSilent)
{
if ( dest.equals(src) )
return ;
gsClear(dsg, dest, true) ;
- gsCopyTriples(dsg, src, dest) ;
+ gsAddTriples(dsg, src, dest) ;
}
- protected static void gsCopyTriples(DatasetGraph dsg, Target src, Target dest)
- {
- Graph gSrc = graph(dsg, src) ;
- Graph gDest = graph(dsg, dest) ;
-
+ /** Add triples from src to dest */
+ protected static void gsAddTriples(DatasetGraph dsg, Target src, Target dest) {
+ Graph gSrc = graph(dsg, src);
+ Graph gDest = graph(dsg, dest);
+
// Avoids concurrency problems by reading fully before writing
ThresholdPolicy<Triple> policy = ThresholdPolicyFactory.policyFromContext(dsg.getContext());
- DataBag<Triple> db = BagFactory.newDefaultBag(policy, SerializationFactoryFinder.tripleSerializationFactory()) ;
- try
- {
- Iterator<Triple> triples = gSrc.find(null, null, null) ;
- db.addAll(triples) ;
- Iter.close(triples) ;
- GraphOps.addAll(gDest, db.iterator()) ;
+ DataBag<Triple> db = BagFactory.newDefaultBag(policy, SerializationFactoryFinder.tripleSerializationFactory());
+ try {
+ Iterator<Triple> triples = gSrc.find(null, null, null);
+ db.addAll(triples);
+ Iter.close(triples);
+ GraphOps.addAll(gDest, db.iterator());
+ }
+ finally {
+ db.close();
}
- finally { db.close() ; }
}
- protected static void gsClear(DatasetGraph dsg, Target target, boolean isSilent)
- {
+ /** Clear target */
+ protected static void gsClear(DatasetGraph dsg, Target target, boolean isSilent) {
// No create - we tested earlier.
- Graph g = graph(dsg, target) ;
- g.clear() ;
+ Graph g = graph(dsg, target);
+ g.clear();
}
- protected static void gsDrop(DatasetGraph dsg, Target target, boolean isSilent)
- {
+ /** Remove the target graph */
+ protected static void gsDrop(DatasetGraph dsg, Target target, boolean isSilent) {
if ( target.isDefault() )
- dsg.getDefaultGraph().clear() ;
+ dsg.getDefaultGraph().clear();
else
- dsg.removeGraph(target.getGraph()) ;
+ dsg.removeGraph(target.getGraph());
}
// ----
@Override
- public Sink<Quad> createInsertDataSink()
- {
- return new Sink<Quad>()
- {
+ public Sink<Quad> createInsertDataSink() {
+ return new Sink<Quad>() {
@Override
- public void send(Quad quad)
- {
+ public void send(Quad quad) {
addTodatasetGraph(datasetGraph, quad);
}
@Override
- public void flush()
- {
+ public void flush() {
SystemARQ.sync(datasetGraph);
}
-
+
@Override
- public void close()
- { }
+ public void close() {}
};
}
@Override
- public void visit(UpdateDataInsert update)
- {
+ public void visit(UpdateDataInsert update) {
for ( Quad quad : update.getQuads() )
- addTodatasetGraph(datasetGraph, quad) ;
+ addTodatasetGraph(datasetGraph, quad);
}
-
+
@Override
- public Sink<Quad> createDeleteDataSink()
- {
- return new Sink<Quad>()
- {
+ public Sink<Quad> createDeleteDataSink() {
+ return new Sink<Quad>() {
@Override
- public void send(Quad quad)
- {
- deleteFromdatasetGraph(datasetGraph, quad);
+ public void send(Quad quad) {
+ deleteFromDatasetGraph(datasetGraph, quad);
}
@Override
- public void flush()
- {
+ public void flush() {
SystemARQ.sync(datasetGraph);
}
-
+
@Override
- public void close()
- { }
+ public void close() {}
};
}
@Override
- public void visit(UpdateDataDelete update)
- {
+ public void visit(UpdateDataDelete update) {
for ( Quad quad : update.getQuads() )
- deleteFromdatasetGraph(datasetGraph, quad) ;
+ deleteFromDatasetGraph(datasetGraph, quad);
}
@Override
- public void visit(UpdateDeleteWhere update)
- {
+ public void visit(UpdateDeleteWhere update) {
List<Quad> quads = update.getQuads() ;
- // Convert bNodes to named variables first.
-// if ( false )
-// // Removed from SPARQL
-// quads = convertBNodesToVariables(quads) ;
+ // Removed from SPARQL : Convert bNodes to named variables first.
+ //quads = convertBNodesToVariables(quads) ;
+
// Convert quads to a pattern.
Element el = elementFromQuads(quads) ;
@@ -362,38 +334,42 @@ public class UpdateEngineWorker implements UpdateVisitor
// serialize the quads after applying the template instead.
ThresholdPolicy<Binding> policy = ThresholdPolicyFactory.policyFromContext(datasetGraph.getContext());
- DataBag<Binding> db = BagFactory.newDefaultBag(policy, SerializationFactoryFinder.bindingSerializationFactory()) ;
- try
- {
- Iterator<Binding> bindings = evalBindings(el, null) ;
- db.addAll(bindings) ;
- Iter.close(bindings) ;
-
- Iterator<Binding> it = db.iterator() ;
- execDelete(datasetGraph, quads, null, it) ;
- Iter.close(it) ;
+ DataBag<Binding> db = BagFactory.newDefaultBag(policy, SerializationFactoryFinder.bindingSerializationFactory());
+ try {
+ Iterator<Binding> bindings = evalBindings(el, null);
+ db.addAll(bindings);
+ Iter.close(bindings);
+
+ Iterator<Binding> it = db.iterator();
+ execDelete(datasetGraph, quads, null, it);
+ Iter.close(it);
}
- finally
- {
- db.close() ;
+ finally {
+ db.close();
}
}
@Override
- public void visit(UpdateModify update)
- {
- Node withGraph = update.getWithIRI() ;
- Element elt = update.getWherePattern() ;
-
- // null or a dataset for USING clause.
+ public void visit(UpdateModify update) {
+ Node withGraph = update.getWithIRI();
+ Element elt = update.getWherePattern();
+
+ // null or a dataset for USING clause.
// USING/USING NAMED
- DatasetGraph dsg = processUsing(update) ;
-
+ DatasetGraph dsg = processUsing(update);
+
// -------------------
// WITH
// USING overrides WITH
if ( dsg == null && withGraph != null ) {
if ( false ) {
+ // Subtle difference : WITH <uri>... WHERE {}
+ // and an empty/unknown graph <uri>
+ // rewrite with GRAPH -> no match.
+ // redo as dataset with different default graph -> match
+ // SPARQL is unclear abotu what happens when the graph does not exist.
+ // The rewite means the raw query engine is used though.
+
// Ye Olde way - create a special dataset
dsg = processWith(update) ;
withGraph = null ;
@@ -418,96 +394,85 @@ public class UpdateEngineWorker implements UpdateVisitor
Query query = elementToQuery(elt) ;
ThresholdPolicy<Binding> policy = ThresholdPolicyFactory.policyFromContext(datasetGraph.getContext());
DataBag<Binding> db = BagFactory.newDefaultBag(policy, SerializationFactoryFinder.bindingSerializationFactory()) ;
- try
- {
- Iterator<Binding> bindings = evalBindings(query, dsg, inputBinding, context) ;
-
- if ( false )
- {
- List<Binding> x = Iter.toList(bindings) ;
- System.out.printf("====>> Bindings (%d)\n", x.size()) ;
- Iter.print(System.out, x.iterator()) ;
- System.out.println("====<<") ;
- bindings = Iter.iter(x) ;
+ try {
+ Iterator<Binding> bindings = evalBindings(query, dsg, inputBinding, context);
+
+ if ( false ) {
+ List<Binding> x = Iter.toList(bindings);
+ System.out.printf("====>> Bindings (%d)\n", x.size());
+ Iter.print(System.out, x.iterator());
+ System.out.println("====<<");
+ bindings = Iter.iter(x);
}
- db.addAll(bindings) ;
- Iter.close(bindings) ;
-
- Iterator<Binding> it = db.iterator() ;
- execDelete(dsg, update.getDeleteQuads(), withGraph, it) ;
- Iter.close(it) ;
-
- Iterator<Binding> it2 = db.iterator() ;
- execInsert(dsg, update.getInsertQuads(), withGraph, it2) ;
- Iter.close(it2) ;
+ db.addAll(bindings);
+ Iter.close(bindings);
+
+ Iterator<Binding> it = db.iterator();
+ execDelete(dsg, update.getDeleteQuads(), withGraph, it);
+ Iter.close(it);
+
+ Iterator<Binding> it2 = db.iterator();
+ execInsert(dsg, update.getInsertQuads(), withGraph, it2);
+ Iter.close(it2);
}
- finally
- {
- db.close() ;
+ finally {
+ db.close();
}
}
// Indirection for subsystems to support USING/USING NAMED.
- protected DatasetGraph processUsing(UpdateModify update)
- {
+ protected DatasetGraph processUsing(UpdateModify update) {
if ( update.getUsing().size() == 0 && update.getUsingNamed().size() == 0 )
- return null ;
-
- return DynamicDatasets.dynamicDataset(update.getUsing(), update.getUsingNamed(), datasetGraph, false) ;
+ return null;
+
+ return DynamicDatasets.dynamicDataset(update.getUsing(), update.getUsingNamed(), datasetGraph, false);
}
-
- protected DatasetGraph processWith(UpdateModify update)
- {
- Node withGraph = update.getWithIRI() ;
+
+ protected DatasetGraph processWith(UpdateModify update) {
+ Node withGraph = update.getWithIRI();
if ( withGraph == null )
- return null ;
- Graph g = graphOrDummy(datasetGraph, withGraph) ;
- DatasetGraph dsg = new DatasetGraphAltDefaultGraph(datasetGraph, g) ;
- return dsg ;
+ return null;
+ Graph g = graphOrDummy(datasetGraph, withGraph);
+ DatasetGraph dsg = new DatasetGraphAltDefaultGraph(datasetGraph, g);
+ return dsg;
}
-
- private Graph graphOrDummy(DatasetGraph dsg, Node gn)
- {
- Graph g = graph(datasetGraph, gn) ;
+
+ private Graph graphOrDummy(DatasetGraph dsg, Node gn) {
+ Graph g = graph(datasetGraph, gn);
if ( g == null )
- g = GraphFactory.createGraphMem() ;
- return g ;
+ g = GraphFactory.createGraphMem();
+ return g;
}
-
- protected static List<Quad> unused_convertBNodesToVariables(List<Quad> quads)
- {
- NodeTransform bnodesToVariables = new NodeTransformBNodesToVariables() ;
- return NodeTransformLib.transformQuads(bnodesToVariables, quads) ;
+
+ protected static List<Quad> unused_convertBNodesToVariables(List<Quad> quads) {
+ NodeTransform bnodesToVariables = new NodeTransformBNodesToVariables();
+ return NodeTransformLib.transformQuads(bnodesToVariables, quads);
}
-
- protected Element elementFromQuads(List<Quad> quads)
- {
- ElementGroup el = new ElementGroup() ;
- ElementTriplesBlock x = new ElementTriplesBlock() ;
+
+ protected Element elementFromQuads(List<Quad> quads) {
+ ElementGroup el = new ElementGroup();
+ ElementTriplesBlock x = new ElementTriplesBlock();
// Maybe empty??
- el.addElement(x) ;
- Node g = Quad.defaultGraphNodeGenerated ;
-
- for ( Quad q : quads )
- {
- if ( q.getGraph() != g )
- {
- g = q.getGraph() ;
- x = new ElementTriplesBlock() ;
+ el.addElement(x);
+ Node g = Quad.defaultGraphNodeGenerated;
+
+ for ( Quad q : quads ) {
+ if ( q.getGraph() != g ) {
+ g = q.getGraph();
+ x = new ElementTriplesBlock();
if ( g == null || g == Quad.defaultGraphNodeGenerated )
- el.addElement(x) ;
- else
- {
- ElementNamedGraph eng = new ElementNamedGraph(g, x) ;
- el.addElement(eng) ;
+ el.addElement(x);
+ else {
+ ElementNamedGraph eng = new ElementNamedGraph(g, x);
+ el.addElement(eng);
}
}
- x.addTriple(q.asTriple()) ;
+ x.addTriple(q.asTriple());
}
- return el ;
+ return el;
}
- // JENA-1059
+ // JENA-1059 : optimization : process templates for ground triples and do these once.
// execDelete ; execInsert
// Quads involving only IRIs and literals do not change from binding to
// binding so any inserts, rather than repeatedly if they are going to be
@@ -534,10 +499,8 @@ public class UpdateEngineWorker implements UpdateVisitor
}
private static boolean constQuad(Quad quad) {
- return constTerm(quad.getGraph()) &&
- constTerm(quad.getSubject()) &&
- constTerm(quad.getPredicate()) &&
- constTerm(quad.getObject()) ;
+ return constTerm(quad.getGraph()) && constTerm(quad.getSubject()) &&
+ constTerm(quad.getPredicate()) && constTerm(quad.getObject());
}
private static boolean constTerm(Node n) {
@@ -552,12 +515,12 @@ public class UpdateEngineWorker implements UpdateVisitor
protected static void execDelete(DatasetGraph dsg, List<Quad> onceQuads, List<Quad> templateQuads, Node dftGraph, Iterator<Binding> bindings) {
if ( onceQuads != null && bindings.hasNext() ) {
onceQuads = remapDefaultGraph(onceQuads, dftGraph) ;
- onceQuads.forEach(q->deleteFromdatasetGraph(dsg, q)) ;
+ onceQuads.forEach(q->deleteFromDatasetGraph(dsg, q)) ;
}
Iterator<Quad> it = template(templateQuads, dftGraph, bindings) ;
if ( it == null )
return ;
- it.forEachRemaining(q->deleteFromdatasetGraph(dsg, q)) ;
+ it.forEachRemaining(q->deleteFromDatasetGraph(dsg, q)) ;
}
protected static void execInsert(DatasetGraph dsg, List<Quad> quads, Node dftGraph, Iterator<Binding> bindings) {
@@ -575,95 +538,79 @@ public class UpdateEngineWorker implements UpdateVisitor
return ;
it.forEachRemaining((q)->addTodatasetGraph(dsg, q)) ;
}
-
- // Catch all individual adds of quads
- private static void addTodatasetGraph(DatasetGraph datasetGraph, Quad quad)
- {
+
+ // Catch all individual adds of quads
+ private static void addTodatasetGraph(DatasetGraph datasetGraph, Quad quad) {
// Check legal triple.
if ( quad.isLegalAsData() )
datasetGraph.add(quad);
// Else drop.
- //Log.warn(UpdateEngineWorker.class, "Bad quad as data: "+quad) ;
+ // Log.warn(UpdateEngineWorker.class, "Bad quad as data: "+quad) ;
}
- // Catch all individual deletes of quads
- private static void deleteFromdatasetGraph(DatasetGraph datasetGraph, Quad quad)
- {
- datasetGraph.delete(quad) ;
+ // Catch all individual deletes of quads
+ private static void deleteFromDatasetGraph(DatasetGraph datasetGraph, Quad quad) {
+ datasetGraph.delete(quad);
}
- protected Query elementToQuery(Element pattern)
- {
+ protected Query elementToQuery(Element pattern) {
if ( pattern == null )
- return null ;
- Query query = new Query() ;
- query.setQueryPattern(pattern) ;
- query.setQuerySelectType() ;
- query.setQueryResultStar(true) ;
- query.setResultVars() ;
- return query ;
+ return null;
+ Query query = new Query();
+ query.setQueryPattern(pattern);
+ query.setQuerySelectType();
+ query.setQueryResultStar(true);
+ query.setResultVars();
+ return query;
}
-
- protected Iterator<Binding> evalBindings(Element pattern, Node dftGraph)
- {
- return evalBindings(elementToQuery(pattern), dftGraph) ;
+
+ protected Iterator<Binding> evalBindings(Element pattern, Node dftGraph) {
+ return evalBindings(elementToQuery(pattern), dftGraph);
}
-
- protected Iterator<Binding> evalBindings(Query query, Node dftGraph)
- {
- DatasetGraph dsg = datasetGraph ;
- if ( query != null )
- {
- if ( dftGraph != null )
- {
- Graph g = graphOrDummy(dsg, dftGraph) ;
- dsg = new DatasetGraphAltDefaultGraph(dsg, g) ;
+
+ protected Iterator<Binding> evalBindings(Query query, Node dftGraph) {
+ DatasetGraph dsg = datasetGraph;
+ if ( query != null ) {
+ if ( dftGraph != null ) {
+ Graph g = graphOrDummy(dsg, dftGraph);
+ dsg = new DatasetGraphAltDefaultGraph(dsg, g);
}
}
-
- return evalBindings(query, dsg, inputBinding, context) ;
-
+ return evalBindings(query, dsg, inputBinding, context);
}
-
- protected static Iterator<Binding> evalBindings(Query query, DatasetGraph dsg, Binding inputBinding, Context context)
- {
- // SET UP CONTEXT
- // The UpdateProcessorBase already copied the context and made it safe ... but that's going to happen again :-(
-
- Iterator<Binding> toReturn ;
-
- if ( query != null )
- {
- Plan plan = QueryExecutionFactory.createPlan(query, dsg, inputBinding, context) ;
+
+ protected static Iterator<Binding> evalBindings(Query query, DatasetGraph dsg, Binding inputBinding, Context context) {
+ // The UpdateProcessorBase already copied the context and made it safe
+ // ... but that's going to happen again :-(
+
+ Iterator<Binding> toReturn;
+
+ if ( query != null ) {
+ Plan plan = QueryExecutionFactory.createPlan(query, dsg, inputBinding, context);
toReturn = plan.iterator();
+ } else {
+ toReturn = Iter.singleton((null != inputBinding) ? inputBinding : BindingRoot.create());
}
- else
- {
- toReturn = Iter.singleton((null != inputBinding) ? inputBinding : BindingRoot.create()) ;
- }
- return toReturn ;
+ return toReturn;
}
-
- protected static Graph graph(DatasetGraph datasetGraph, Node gn)
- {
+
+ protected static Graph graph(DatasetGraph datasetGraph, Node gn) {
if ( gn == null || gn == Quad.defaultGraphNodeGenerated )
- return datasetGraph.getDefaultGraph() ;
+ return datasetGraph.getDefaultGraph();
else
- return datasetGraph.getGraph(gn) ;
+ return datasetGraph.getGraph(gn);
}
- protected static Graph graph(DatasetGraph datasetGraph, Target target)
- {
+ protected static Graph graph(DatasetGraph datasetGraph, Target target) {
if ( target.isDefault() )
- return datasetGraph.getDefaultGraph() ;
+ return datasetGraph.getDefaultGraph();
if ( target.isOneNamedGraph() )
- return graph(datasetGraph, target.getGraph()) ;
- error("Target does not name one graph: "+target) ;
- return null ;
+ return graph(datasetGraph, target.getGraph());
+ error("Target does not name one graph: " + target);
+ return null;
}
- protected static void error(String msg)
- {
- throw new UpdateException(msg) ;
+ protected static void error(String msg) {
+ throw new UpdateException(msg);
}
}
[2/2] jena git commit: JENA-1092: Rewrite constants quads for
insert/delete + WITH
Posted by an...@apache.org.
JENA-1092: Rewrite constants quads for insert/delete + WITH
Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/f33f2058
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/f33f2058
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/f33f2058
Branch: refs/heads/master
Commit: f33f205843c5d53950c234064bb6eca08aeecae5
Parents: cfbc491
Author: Andy Seaborne <an...@apache.org>
Authored: Tue Dec 15 09:22:52 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Dec 15 09:43:49 2015 +0000
----------------------------------------------------------------------
.../apache/jena/sparql/modify/TemplateLib.java | 244 +++++++++----------
.../jena/sparql/modify/UpdateEngineWorker.java | 64 +++--
2 files changed, 156 insertions(+), 152 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jena/blob/f33f2058/jena-arq/src/main/java/org/apache/jena/sparql/modify/TemplateLib.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/modify/TemplateLib.java b/jena-arq/src/main/java/org/apache/jena/sparql/modify/TemplateLib.java
index f0896f7..086a2d5 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/modify/TemplateLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/modify/TemplateLib.java
@@ -18,73 +18,73 @@
package org.apache.jena.sparql.modify;
-import java.util.* ;
+import java.util.*;
import java.util.function.Function;
-import java.util.stream.Collectors ;
+import java.util.stream.Collectors;
+import java.util.stream.Stream ;
-import org.apache.jena.atlas.iterator.Iter ;
+import org.apache.jena.atlas.iterator.Iter;
import org.apache.jena.ext.com.google.common.collect.Iterators;
-import org.apache.jena.graph.Node ;
-import org.apache.jena.graph.NodeFactory ;
-import org.apache.jena.graph.Triple ;
-import org.apache.jena.sparql.core.Quad ;
-import org.apache.jena.sparql.core.Substitute ;
-import org.apache.jena.sparql.core.Var ;
-import org.apache.jena.sparql.engine.binding.Binding ;
-import org.apache.jena.sparql.util.ModelUtils ;
-
-public class TemplateLib
-{
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.graph.Triple;
+import org.apache.jena.sparql.core.Quad;
+import org.apache.jena.sparql.core.Substitute;
+import org.apache.jena.sparql.core.Var;
+import org.apache.jena.sparql.engine.binding.Binding;
+import org.apache.jena.sparql.util.ModelUtils;
+
+public class TemplateLib {
// See also Substitute -- combine?
- // Or is this specifc enough to CONSTRUCT/Update template processing?
-
- // TODO We could eliminate some of the duplication in this class by writing generic methods and adding a shared super-interface to Triple and Quad
-
+ // Or is this specifc enough to CONSTRUCT/Update template processing?
+
+ // TODO We could eliminate some of the duplication in this class by writing
+ // generic methods and adding a shared super-interface to Triple and Quad
+
/**
- * Take a template, as a list of quad patterns, a default graph, and an iterator of bindings,
- * and produce an iterator of quads that results from applying the template to the bindings.
+ * Take a template, as a list of quad patterns, a default graph, and an
+ * iterator of bindings, and produce an iterator of quads that results from
+ * applying the template to the bindings.
*/
- public static Iterator<Quad> template(List<Quad> quads, final Node dftGraph, Iterator<Binding> bindings)
- {
- if ( quads == null || quads.isEmpty() ) return null ;
-
+ public static Iterator<Quad> template(List<Quad> quads, final Node dftGraph, Iterator<Binding> bindings) {
+ if ( quads == null || quads.isEmpty() )
+ return null;
quads = remapDefaultGraph(quads, dftGraph);
return calcQuads(quads, bindings);
}
-
- protected static List<Quad> remapDefaultGraph(List<Quad> quads, final Node dftGraph)
- {
- // The default graph has been set to something else.
- if ( dftGraph != null ) {
- quads = quads.stream()
- .map(q -> (!q.isDefaultGraph())
- ? q
- : new Quad(dftGraph, q.getSubject(), q.getPredicate(), q.getObject()))
- .collect(Collectors.toList()) ;
- }
- return quads;
+
+ /**
+ * Map quads to a different graph if they are in the default graph.
+ */
+ public static List<Quad> remapDefaultGraph(List<Quad> quads, final Node dftGraph) {
+ // The fast path is "no change"
+ if ( quads == null || quads.isEmpty() )
+ return quads ;
+ if ( dftGraph == null || Quad.isDefaultGraph(dftGraph) )
+ return quads ;
+ Stream<Quad> remappedStream = quads.stream().map(q->
+ !q.isDefaultGraph() ? q : new Quad(dftGraph, q.getSubject(), q.getPredicate(), q.getObject())
+ ) ;
+ return remappedStream.collect(Collectors.toList());
}
-
+
/** Substitute into triple patterns */
- public static Iterator<Triple> calcTriples(final List<Triple> triples, Iterator<Binding> bindings)
- {
- return Iterators.concat(Iter.map(bindings, new Function<Binding, Iterator<Triple>>()
- {
- Map<Node, Node> bNodeMap = new HashMap<>() ;
+ public static Iterator<Triple> calcTriples(final List<Triple> triples, Iterator<Binding> bindings) {
+ return Iterators.concat(Iter.map(bindings, new Function<Binding, Iterator<Triple>>() {
+ Map<Node, Node> bNodeMap = new HashMap<>();
+
@Override
- public Iterator<Triple> apply(final Binding b)
- {
- // Iteration is a new mapping of bnodes.
- bNodeMap.clear() ;
+ public Iterator<Triple> apply(final Binding b) {
+ // Iteration is a new mapping of bnodes.
+ bNodeMap.clear();
List<Triple> tripleList = new ArrayList<>(triples.size());
- for (Triple triple : triples)
- {
- Triple q = subst(triple, b, bNodeMap) ;
- if ( ! q.isConcrete() || ! ModelUtils.isValidAsStatement(q.getSubject(), q.getPredicate(), q.getObject()) )
- {
- //Log.warn(TemplateLib.class, "Unbound quad: "+FmtUtils.stringForQuad(quad)) ;
- continue ;
+ for ( Triple triple : triples ) {
+ Triple q = subst(triple, b, bNodeMap);
+ if ( !q.isConcrete() || !ModelUtils.isValidAsStatement(q.getSubject(), q.getPredicate(), q.getObject()) ) {
+ // Log.warn(TemplateLib.class, "Unbound quad:
+ // "+FmtUtils.stringForQuad(quad)) ;
+ continue;
}
tripleList.add(q);
}
@@ -92,27 +92,24 @@ public class TemplateLib
}
}));
}
-
+
/** Substitute into quad patterns */
- public static Iterator<Quad> calcQuads(final List<Quad> quads, Iterator<Binding> bindings)
- {
- return Iterators.concat(Iter.map(bindings, new Function<Binding, Iterator<Quad>>()
- {
- Map<Node, Node> bNodeMap = new HashMap<>() ;
+ public static Iterator<Quad> calcQuads(final List<Quad> quads, Iterator<Binding> bindings) {
+ return Iterators.concat(Iter.map(bindings, new Function<Binding, Iterator<Quad>>() {
+ Map<Node, Node> bNodeMap = new HashMap<>();
+
@Override
- public Iterator<Quad> apply(final Binding b)
- {
- // Iteration is a new mapping of bnodes.
- bNodeMap.clear() ;
+ public Iterator<Quad> apply(final Binding b) {
+ // Iteration is a new mapping of bnodes.
+ bNodeMap.clear();
List<Quad> quadList = new ArrayList<>(quads.size());
- for (Quad quad : quads)
- {
- Quad q = subst(quad, b, bNodeMap) ;
- if ( ! q.isConcrete() )
- {
- //Log.warn(TemplateLib.class, "Unbound quad: "+FmtUtils.stringForQuad(quad)) ;
- continue ;
+ for ( Quad quad : quads ) {
+ Quad q = subst(quad, b, bNodeMap);
+ if ( !q.isConcrete() ) {
+ // Log.warn(TemplateLib.class, "Unbound quad:
+ // "+FmtUtils.stringForQuad(quad)) ;
+ continue;
}
quadList.add(q);
}
@@ -121,73 +118,70 @@ public class TemplateLib
}));
}
- /** Substitute into a quad, with rewriting of bNodes */
- public static Quad subst(Quad quad, Binding b, Map<Node, Node> bNodeMap)
- {
- Node g = quad.getGraph() ;
- Node s = quad.getSubject() ;
- Node p = quad.getPredicate() ;
- Node o = quad.getObject() ;
-
- Node g1 = g ;
- Node s1 = s ;
- Node p1 = p ;
- Node o1 = o ;
-
- // replace blank nodes.
+ /** Substitute into a quad, with rewriting of bNodes */
+ public static Quad subst(Quad quad, Binding b, Map<Node, Node> bNodeMap) {
+ Node g = quad.getGraph();
+ Node s = quad.getSubject();
+ Node p = quad.getPredicate();
+ Node o = quad.getObject();
+
+ Node g1 = g;
+ Node s1 = s;
+ Node p1 = p;
+ Node o1 = o;
+
+ // replace blank nodes.
if ( g1.isBlank() || Var.isBlankNodeVar(g1) )
- g1 = newBlank(g1, bNodeMap) ;
-
+ g1 = newBlank(g1, bNodeMap);
+
if ( s1.isBlank() || Var.isBlankNodeVar(s1) )
- s1 = newBlank(s1, bNodeMap) ;
-
+ s1 = newBlank(s1, bNodeMap);
+
if ( p1.isBlank() || Var.isBlankNodeVar(p1) )
- p1 = newBlank(p1, bNodeMap) ;
-
+ p1 = newBlank(p1, bNodeMap);
+
if ( o1.isBlank() || Var.isBlankNodeVar(o1) )
- o1 = newBlank(o1, bNodeMap) ;
-
- Quad q = quad ;
+ o1 = newBlank(o1, bNodeMap);
+
+ Quad q = quad;
if ( s1 != s || p1 != p || o1 != o || g1 != g )
- q = new Quad(g1, s1, p1, o1) ;
-
- Quad q2 = Substitute.substitute(q, b) ;
- return q2 ;
+ q = new Quad(g1, s1, p1, o1);
+
+ Quad q2 = Substitute.substitute(q, b);
+ return q2;
}
-
- /** Substitute into a triple, with rewriting of bNodes */
- public static Triple subst(Triple triple, Binding b, Map<Node, Node> bNodeMap)
- {
- Node s = triple.getSubject() ;
- Node p = triple.getPredicate() ;
- Node o = triple.getObject() ;
-
- Node s1 = s ;
- Node p1 = p ;
- Node o1 = o ;
-
+
+ /** Substitute into a triple, with rewriting of bNodes */
+ public static Triple subst(Triple triple, Binding b, Map<Node, Node> bNodeMap) {
+ Node s = triple.getSubject();
+ Node p = triple.getPredicate();
+ Node o = triple.getObject();
+
+ Node s1 = s;
+ Node p1 = p;
+ Node o1 = o;
+
if ( s1.isBlank() || Var.isBlankNodeVar(s1) )
- s1 = newBlank(s1, bNodeMap) ;
-
+ s1 = newBlank(s1, bNodeMap);
+
if ( p1.isBlank() || Var.isBlankNodeVar(p1) )
- p1 = newBlank(p1, bNodeMap) ;
-
+ p1 = newBlank(p1, bNodeMap);
+
if ( o1.isBlank() || Var.isBlankNodeVar(o1) )
- o1 = newBlank(o1, bNodeMap) ;
-
- Triple t = triple ;
+ o1 = newBlank(o1, bNodeMap);
+
+ Triple t = triple;
if ( s1 != s || p1 != p || o1 != o )
- t = new Triple(s1, p1, o1) ;
-
- Triple t2 = Substitute.substitute(t, b) ;
- return t2 ;
+ t = new Triple(s1, p1, o1);
+
+ Triple t2 = Substitute.substitute(t, b);
+ return t2;
}
/** generate a blank node consistently */
- private static Node newBlank(Node n, Map<Node, Node> bNodeMap)
- {
- if ( ! bNodeMap.containsKey(n) )
- bNodeMap.put(n, NodeFactory.createBlankNode() );
- return bNodeMap.get(n) ;
+ private static Node newBlank(Node n, Map<Node, Node> bNodeMap) {
+ if ( !bNodeMap.containsKey(n) )
+ bNodeMap.put(n, NodeFactory.createBlankNode());
+ return bNodeMap.get(n);
}
}
http://git-wip-us.apache.org/repos/asf/jena/blob/f33f2058/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java b/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
index 4f7b33c..275ab3c 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/modify/UpdateEngineWorker.java
@@ -18,9 +18,11 @@
package org.apache.jena.sparql.modify;
+import static org.apache.jena.sparql.modify.TemplateLib.remapDefaultGraph ;
import static org.apache.jena.sparql.modify.TemplateLib.template ;
import java.util.ArrayList ;
+import java.util.Collection ;
import java.util.Iterator ;
import java.util.List ;
@@ -368,7 +370,7 @@ public class UpdateEngineWorker implements UpdateVisitor
Iter.close(bindings) ;
Iterator<Binding> it = db.iterator() ;
- execDelete(quads, null, it) ;
+ execDelete(datasetGraph, quads, null, it) ;
Iter.close(it) ;
}
finally
@@ -391,9 +393,11 @@ public class UpdateEngineWorker implements UpdateVisitor
// WITH
// USING overrides WITH
if ( dsg == null && withGraph != null ) {
- if ( false )
+ if ( false ) {
// Ye Olde way - create a special dataset
dsg = processWith(update) ;
+ withGraph = null ;
+ }
else
// Better,
// Wrap WHERE clause in GRAPH <with_uri>
@@ -420,24 +424,21 @@ public class UpdateEngineWorker implements UpdateVisitor
if ( false )
{
-// System.out.println("=======================================") ;
-// System.out.println(datasetGraph) ;
List<Binding> x = Iter.toList(bindings) ;
System.out.printf("====>> Bindings (%d)\n", x.size()) ;
Iter.print(System.out, x.iterator()) ;
System.out.println("====<<") ;
bindings = Iter.iter(x) ;
}
-
db.addAll(bindings) ;
Iter.close(bindings) ;
Iterator<Binding> it = db.iterator() ;
- execDelete(update.getDeleteQuads(), withGraph, it) ;
+ execDelete(dsg, update.getDeleteQuads(), withGraph, it) ;
Iter.close(it) ;
Iterator<Binding> it2 = db.iterator() ;
- execInsert(update.getInsertQuads(), withGraph, it2) ;
+ execInsert(dsg, update.getInsertQuads(), withGraph, it2) ;
Iter.close(it2) ;
}
finally
@@ -512,8 +513,12 @@ public class UpdateEngineWorker implements UpdateVisitor
// binding so any inserts, rather than repeatedly if they are going to be
// done at all. Note bNodes (if legal at this point) change from template
// instantiation to instantiation.
-
- private static Pair<List<Quad>, List<Quad>> split(List<Quad> quads) {
+ /**
+ * Split quads into ground terms (no variables) and templated quads.
+ * @param quads
+ * @return Pair of (ground quads, templated quads)
+ */
+ private static Pair<List<Quad>, List<Quad>> split(Collection<Quad> quads) {
// Guess size.
// Pre-size in case large (i.e. 10K+).
List<Quad> constQuads = new ArrayList<>(quads.size()) ;
@@ -539,36 +544,40 @@ public class UpdateEngineWorker implements UpdateVisitor
return n.isURI() || n.isLiteral() ;
}
- protected void execDelete(List<Quad> quads, Node dftGraph, Iterator<Binding> bindings) {
+ protected static void execDelete(DatasetGraph dsg, List<Quad> quads, Node dftGraph, Iterator<Binding> bindings) {
Pair<List<Quad>, List<Quad>> p = split(quads) ;
- execDelete(p.getLeft(), p.getRight(), dftGraph, bindings) ;
+ execDelete(dsg, p.getLeft(), p.getRight(), dftGraph, bindings) ;
}
- protected void execDelete(List<Quad> onceQuads, List<Quad> templateQuads, Node dftGraph, Iterator<Binding> bindings) {
- if ( onceQuads != null && bindings.hasNext() )
- // If at least once.
- onceQuads.forEach(datasetGraph::delete);
+ protected static void execDelete(DatasetGraph dsg, List<Quad> onceQuads, List<Quad> templateQuads, Node dftGraph, Iterator<Binding> bindings) {
+ if ( onceQuads != null && bindings.hasNext() ) {
+ onceQuads = remapDefaultGraph(onceQuads, dftGraph) ;
+ onceQuads.forEach(q->deleteFromdatasetGraph(dsg, q)) ;
+ }
Iterator<Quad> it = template(templateQuads, dftGraph, bindings) ;
- if ( it == null ) return ;
- it.forEachRemaining(datasetGraph::delete) ;
+ if ( it == null )
+ return ;
+ it.forEachRemaining(q->deleteFromdatasetGraph(dsg, q)) ;
}
- protected void execInsert(List<Quad> quads, Node dftGraph, Iterator<Binding> bindings) {
+ protected static void execInsert(DatasetGraph dsg, List<Quad> quads, Node dftGraph, Iterator<Binding> bindings) {
Pair<List<Quad>, List<Quad>> p = split(quads) ;
- execInsert(p.getLeft(), p.getRight(), dftGraph, bindings) ;
+ execInsert(dsg, p.getLeft(), p.getRight(), dftGraph, bindings) ;
}
- protected void execInsert(List<Quad> onceQuads, List<Quad> templateQuads, Node dftGraph, Iterator<Binding> bindings) {
- if ( onceQuads != null && bindings.hasNext() )
- // If at least once.
- onceQuads.forEach((q)->addTodatasetGraph(datasetGraph, q)) ;
+ protected static void execInsert(DatasetGraph dsg, List<Quad> onceQuads, List<Quad> templateQuads, Node dftGraph, Iterator<Binding> bindings) {
+ if ( onceQuads != null && bindings.hasNext() ) {
+ onceQuads = remapDefaultGraph(onceQuads, dftGraph) ;
+ onceQuads.forEach((q)->addTodatasetGraph(dsg, q)) ;
+ }
Iterator<Quad> it = template(templateQuads, dftGraph, bindings) ;
- if ( it == null ) return ;
- it.forEachRemaining((q)->addTodatasetGraph(datasetGraph, q)) ;
+ if ( it == null )
+ return ;
+ it.forEachRemaining((q)->addTodatasetGraph(dsg, q)) ;
}
- // Catch all individual adds of quads (and deletes - mainly for symmetry).
- private static void addTodatasetGraph(DatasetGraph datasetGraph, Quad quad)
+ // Catch all individual adds of quads
+ private static void addTodatasetGraph(DatasetGraph datasetGraph, Quad quad)
{
// Check legal triple.
if ( quad.isLegalAsData() )
@@ -577,6 +586,7 @@ public class UpdateEngineWorker implements UpdateVisitor
//Log.warn(UpdateEngineWorker.class, "Bad quad as data: "+quad) ;
}
+ // Catch all individual deletes of quads
private static void deleteFromdatasetGraph(DatasetGraph datasetGraph, Quad quad)
{
datasetGraph.delete(quad) ;