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