Repository: jena
Updated Branches:
  refs/heads/master ba2b415f4 -> d516f3569


Optimize the one graph case for GraphUnionRead


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

Branch: refs/heads/master
Commit: 2966021bace073649e210ca7d64f9c38e3a02210
Parents: 2b3a4c7
Author: Andy Seaborne <[email protected]>
Authored: Wed Dec 20 22:43:32 2017 +0000
Committer: Andy Seaborne <[email protected]>
Committed: Wed Dec 20 23:22:35 2017 +0000

----------------------------------------------------------------------
 .../jena/sparql/graph/GraphUnionRead.java       | 31 ++++++++++++++++++--
 .../jena/sparql/graph/TestGraphUnionRead.java   | 11 +++++++
 2 files changed, 39 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/2966021b/jena-arq/src/main/java/org/apache/jena/sparql/graph/GraphUnionRead.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/main/java/org/apache/jena/sparql/graph/GraphUnionRead.java 
b/jena-arq/src/main/java/org/apache/jena/sparql/graph/GraphUnionRead.java
index e675d6f..580f30d 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/graph/GraphUnionRead.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/graph/GraphUnionRead.java
@@ -24,6 +24,7 @@ import java.util.function.Consumer ;
 
 import org.apache.jena.atlas.iterator.Iter ;
 import org.apache.jena.atlas.iterator.IteratorConcat ;
+import org.apache.jena.atlas.lib.CollectionUtils;
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.graph.Triple ;
@@ -37,6 +38,7 @@ import org.apache.jena.sparql.core.DatasetGraphMap ;
 import org.apache.jena.sparql.core.GraphView ;
 import org.apache.jena.sparql.core.Quad ;
 import org.apache.jena.util.iterator.ExtendedIterator ;
+import org.apache.jena.util.iterator.NullIterator;
 import org.apache.jena.util.iterator.WrappedIterator ;
 
 /** Immutable graph that is the view of a union of graphs in a dataset.
@@ -52,6 +54,8 @@ import org.apache.jena.util.iterator.WrappedIterator ;
 public class GraphUnionRead extends GraphBase {
     private final DatasetGraph     dataset ;
     private final Collection<Node> graphs ;
+    // Special case.
+    private final Node graphName;
 
     /** Read-only graph view of all named graphs in the dataset.
      * If graphs are added after this view if created, then this is reflected 
in
@@ -65,6 +69,14 @@ public class GraphUnionRead extends GraphBase {
     public GraphUnionRead(DatasetGraph dsg, Collection<Node> graphs) {
         this.dataset = dsg ;
         this.graphs = graphs ;
+        // Special case.
+        if ( graphs != null && graphs.size() == 1 ) {
+            // No need to suppress duplicates because there aren't any.
+            // Assumes the dataset handles Quad.unionGraph.
+            graphName = CollectionUtils.oneElt(graphs);
+        }
+        else
+            graphName = null;
     }
 
     @Override
@@ -82,9 +94,16 @@ public class GraphUnionRead extends GraphBase {
         if ( graphs == null ) {
             // This produces unique quads with the same graph node,
             // hence the triples are distinct. 
-            Iterator<Quad> qIter = dataset.findNG(Quad.unionGraph, 
m.getSubject(), m.getPredicate(), m.getObject());
-            Iterator<Triple> tIter = Iter.map(qIter, quad->quad.asTriple());
-            return WrappedIterator.createNoRemove(tIter) ;
+            return quadsToTriples(dataset, Quad.unionGraph, m);
+        }
+        if ( graphs.isEmpty() )
+            return NullIterator.instance();
+        if ( graphName != null ) {
+            if ( ! dataset.containsGraph(graphName) )
+                // Avoid auto-creation.
+                return NullIterator.instance();
+            // Avoid needing distinct.
+            return dataset.getGraph(graphName).find(m);
         }
         // Only certain graphs.
         IteratorConcat<Triple> iter = new IteratorConcat<>() ;
@@ -92,6 +111,12 @@ public class GraphUnionRead extends GraphBase {
         return WrappedIterator.createNoRemove(Iter.distinct(iter)) ;
     }
     
+    private static ExtendedIterator<Triple> quadsToTriples(DatasetGraph dsg, 
Node graphName, Triple m) {
+        Iterator<Quad> qIter = dsg.findNG(graphName, m.getSubject(), 
m.getPredicate(), m.getObject());
+        Iterator<Triple> tIter = Iter.map(qIter, quad->quad.asTriple());
+        return WrappedIterator.createNoRemove(tIter) ;
+    }
+    
     /** Execute action for each graph that exists */
     private void forEachGraph(Consumer<Graph> action) {
         if ( graphs == null ) {

http://git-wip-us.apache.org/repos/asf/jena/blob/2966021b/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestGraphUnionRead.java
----------------------------------------------------------------------
diff --git 
a/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestGraphUnionRead.java 
b/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestGraphUnionRead.java
index 8e58739..ecd37c0 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestGraphUnionRead.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/sparql/graph/TestGraphUnionRead.java
@@ -114,6 +114,17 @@ public class TestGraphUnionRead extends BaseTest
         assertEquals(2, x) ;
     }
 
+    @Test public void gr_union_of_one_1()
+    {
+        List<Node> gnodes = list(gn2) ;
+        Graph g = new GraphUnionRead(dsg, gnodes) ;
+        long x1 = Iter.count(g.find(null, null, null)) ;
+        assertEquals(2, x1) ;
+        Node o = NodeFactory.createLiteral("g2") ; 
+        long x2 = Iter.count(g.find(null, null, o)) ;
+        assertEquals(1, x2) ;
+    }
+
     static <T> List<T> list(@SuppressWarnings("unchecked") T...x)
     {
         return Arrays.asList(x) ;

Reply via email to