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