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 2013/08/18 22:58:09 UTC

svn commit: r1515213 - in /jena/trunk/jena-arq/src: main/java/com/hp/hpl/jena/sparql/core/DatasetGraphBase.java test/java/com/hp/hpl/jena/sparql/core/AbstractDatasetGraphTests.java

Author: andy
Date: Sun Aug 18 20:58:08 2013
New Revision: 1515213

URL: http://svn.apache.org/r1515213
Log:
JENA-513 , JENA-514 : DatasetGraphBase.deleteAny rewritten to work in slices.

Instead of copying the whole iterator, the code takes slices, and repeats until
the "deleteAny" pattern no longer causes .find to return anything.



Modified:
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphBase.java
    jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/core/AbstractDatasetGraphTests.java

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphBase.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphBase.java?rev=1515213&r1=1515212&r2=1515213&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphBase.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/core/DatasetGraphBase.java Sun Aug 18 20:58:08 2013
@@ -18,9 +18,7 @@
 
 package com.hp.hpl.jena.sparql.core;
 
-
 import java.util.Iterator ;
-import java.util.List ;
 
 import org.apache.jena.atlas.io.IndentedLineBuffer ;
 import org.apache.jena.atlas.iterator.Iter ;
@@ -85,14 +83,32 @@ abstract public class DatasetGraphBase i
     @Override
     public void delete(Node g, Node s, Node p, Node o)  { delete(new Quad(g,s,p,o)) ; }
     
+    private static final int DeleteBufferSize = 1000 ;
     @Override
-    /** Simple implementation */
+    /** Simple implementation but done without assuming iterator.remove() */
     public void deleteAny(Node g, Node s, Node p, Node o)
-    { 
-        Iterator<Quad> iter = find(g, s, p, o) ;
-        List<Quad> list = Iter.toList(iter) ;
-        for ( Quad q : list )
-            delete(q) ;
+    {
+        // Delete in slices rather than assume .remove() on the iterator is implemented. 
+        // We keep executing find(g, s, p, o) until we don't get a full slice.
+        Quad[] buffer = new Quad[DeleteBufferSize] ;
+        while(true) {
+            Iterator<Quad> iter = find(g, s, p, o) ;
+            // Get a slice
+            int len = 0 ;
+            for (; len < DeleteBufferSize; len++) {
+                if ( !iter.hasNext() )
+                    break ;
+                buffer[len] = iter.next() ;
+            }
+            // Delete them.
+            for (int i = 0; i < len; i++) {
+                delete(buffer[i]) ;
+                buffer[i] = null ;
+            }
+            // Finished?
+            if ( len < DeleteBufferSize )
+                break ;
+        }
     }
     
     @Override

Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/core/AbstractDatasetGraphTests.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/core/AbstractDatasetGraphTests.java?rev=1515213&r1=1515212&r2=1515213&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/core/AbstractDatasetGraphTests.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/core/AbstractDatasetGraphTests.java Sun Aug 18 20:58:08 2013
@@ -237,4 +237,24 @@ public abstract class AbstractDatasetGra
         dsg.deleteAny(Node.ANY, subject, null, null);
     }
   
+    @Test public void deleteAny_02()
+    {
+        DatasetGraph dsg = emptyDataset() ;
+        Node subject = NodeFactory.createURI("http://example/s");
+        Node predicate = NodeFactory.createURI("http://example/p");
+        Node object1 = NodeFactory.createAnon();
+        Node object2 = NodeFactory.createAnon();
+        Node graph = NodeFactory.createURI("http://example/g") ; 
+        
+        dsg.add(graph, subject, predicate, object1);
+        dsg.add(graph, subject, predicate, object2);
+        
+        dsg.deleteAny(Quad.defaultGraphIRI, null, null, null);
+        List<Quad> quads = Iter.toList(dsg.find(graph, null, null, null)) ;
+        assertEquals(2, quads.size()) ;
+        
+        dsg.deleteAny(graph, null, null, null);
+        quads = Iter.toList(dsg.find(graph, null, null, null)) ;
+        assertEquals(0, quads.size()) ;
+    }
 }