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/11/15 22:25:29 UTC

[1/3] jena git commit: JENA-1064: Add union graph support.

Repository: jena
Updated Branches:
  refs/heads/master 78f91993a -> f00e659c5


JENA-1064: Add union graph support.

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

Branch: refs/heads/master
Commit: bbce3220840a2afdce70d79cdb050440109658f9
Parents: 78f9199
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Nov 15 21:23:32 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Nov 15 21:23:32 2015 +0000

----------------------------------------------------------------------
 .../jena/sparql/core/DatasetGraphBaseFind.java  | 70 +++++++++++++++-----
 1 file changed, 53 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/bbce3220/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphBaseFind.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphBaseFind.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphBaseFind.java
index 56c15bd..21b6415 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphBaseFind.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphBaseFind.java
@@ -20,9 +20,12 @@ package org.apache.jena.sparql.core;
 
 
 import java.util.Iterator ;
+import java.util.stream.Stream ;
 
 import org.apache.jena.atlas.iterator.Iter ;
 import org.apache.jena.graph.Node ;
+import org.apache.jena.graph.Triple ;
+import org.apache.jena.sparql.core.mem.DatasetGraphInMemory ;
 
 /** 
  * DatasetGraph framework.  
@@ -31,7 +34,7 @@ import org.apache.jena.graph.Node ;
  * @see DatasetGraphTriplesQuads
  * @see DatasetGraphCollection
  * @see DatasetGraphOne
- * 
+ * @see DatasetGraphInMemory
  */
 abstract public class DatasetGraphBaseFind extends DatasetGraphBase 
 {
@@ -39,8 +42,7 @@ abstract public class DatasetGraphBaseFind extends DatasetGraphBase
     
     /** Implementation of find based on splitting into triples (default graph) and quads (named graph) */
     @Override
-    public Iterator<Quad> find(Node g, Node s, Node p , Node o)
-    {
+    public Iterator<Quad> find(Node g, Node s, Node p, Node o) {
         if ( Quad.isDefaultGraph(g))
             return findInDftGraph(s, p, o) ;
         if ( ! isWildcard(g) )
@@ -49,33 +51,67 @@ abstract public class DatasetGraphBaseFind extends DatasetGraphBase
     }
     
     @Override
-    public Iterator<Quad> findNG(Node g, Node s, Node p , Node o)
-    {
+    public Iterator<Quad> findNG(Node g, Node s, Node p , Node o) {
         Iterator<Quad> qIter ;
         if ( Quad.isUnionGraph(g))
+            qIter = findQuadsInUnionGraph(s, p, o) ;
+        else if ( isWildcard(g) )
             qIter = findInAnyNamedGraphs(s, p, o) ;
-        else if ( ! isWildcard(g) )
-            qIter = findInSpecificNamedGraph(g, s, p, o) ;
+        else if ( Quad.isDefaultGraph(g) )
+            qIter = findInDftGraph(s, p, o) ;
         else
-            qIter = findInAnyNamedGraphs(s, p, o) ;
+            // Not wildcard, not union graph, not default graph.
+            qIter = findInSpecificNamedGraph(g, s, p, o) ;
         if ( qIter == null )
             return Iter.nullIterator() ;
         return qIter ;
     }
 
-    protected Iterator<Quad> findAny(Node s, Node p , Node o) 
-    {
+    protected Iterator<Quad> findAny(Node s, Node p, Node o) {
         // Default graph
-        Iterator<Quad> iter1 = findInDftGraph(s, p, o) ;
-        Iterator<Quad> iter2 = findInAnyNamedGraphs(s, p, o) ;
-
-        if ( iter1 == null && iter2 == null )
-            return Iter.nullIterator() ;
-        // Copes with null in either position.
-        return Iter.append(iter1, iter2) ;
+        Iterator<Quad> iter1 = findInDftGraph(s, p, o);
+        Iterator<Quad> iter2 = findInAnyNamedGraphs(s, p, o);
+        // Copes with null in either or both positions.
+        return Iter.append(iter1, iter2);
     }
 
+    /** Find matches in the default graph.
+     *  Return as quads; the default graph is {@link Quad#defaultGraphIRI}
+     *  To get Triples, use {@code DatasetGraph.getDefaultGraph().find(...)}.
+     */
     protected abstract Iterator<Quad> findInDftGraph(Node s, Node p , Node o) ;
+
+    /** Find matches in the notional union of all named graphs - return as triples.
+     * No duplicates - the union graph is a <em>set</em> of triples.
+     * See {@link #findInAnyNamedGraphs}, where there may be duplicates.
+     * <p>
+     * Implementations are encouraged to override this method. For example, it
+     * may be possible to avoid "distinct".
+     */
+    public Iterator<Triple> findInUnionGraph(Node s, Node p , Node o) {
+        return findUnionGraphTriples(s,p,o).iterator() ;
+    }
+
+    /** Find matches in the notional union of all named graphs - return as quads.
+     * No duplicates - the union graph is a <em>set</em> of triples.
+     * See {@link #findInAnyNamedGraphs}, where there may be duplicates.
+     * <p>
+     * Implementations are encouraged to override this method. For example, it
+     * may be possible to avoid "distinct".
+     */
+    public Iterator<Quad> findQuadsInUnionGraph(Node s, Node p , Node o) {
+        return findUnionGraphTriples(s,p,o).map(t -> new Quad(Quad.unionGraph, t)).iterator() ;
+    }
+
+    private Stream<Triple> findUnionGraphTriples(Node s, Node p , Node o) {
+        return Iter.asStream(findInAnyNamedGraphs(s,p,o)).map(Quad::asTriple).distinct() ;
+    }
+
+    /** Find in a specific named graph - {@code g} is a group term (IRI or bNode), not a wild card (or null). */
     protected abstract Iterator<Quad> findInSpecificNamedGraph(Node g, Node s, Node p , Node o) ;
+    /** Find in any named graph - return quads.
+     * If a triple matches in two different graph, return a quad for each.
+     * See {@link #findInUnionGraph} for matching without duplicate triples.
+     */
     protected abstract Iterator<Quad> findInAnyNamedGraphs(Node s, Node p , Node o) ;
 }


[3/3] jena git commit: JENA-624, JENA-1064: Union graph quads to be Quad.unionGraph.

Posted by an...@apache.org.
JENA-624, JENA-1064: Union graph quads to be Quad.unionGraph.

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

Branch: refs/heads/master
Commit: f00e659c52d3b9daac4a0ffacf19be1b90c03d60
Parents: a03ac09
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Nov 15 21:24:52 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Nov 15 21:24:52 2015 +0000

----------------------------------------------------------------------
 .../org/apache/jena/sparql/core/mem/QuadTable.java  |  6 +++++-
 .../apache/jena/sparql/core/mem/QuadTableForm.java  | 16 +++++++---------
 .../sparql/core/mem/TestDatasetGraphInMemory.java   | 12 +++++++-----
 3 files changed, 19 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/f00e659c/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/QuadTable.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/QuadTable.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/QuadTable.java
index 7505d1a..579c1e2 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/QuadTable.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/QuadTable.java
@@ -62,6 +62,10 @@ public interface QuadTable extends TupleTable<Quad> {
 
 	default Stream<Quad> findInUnionGraph(final Node s, final Node p, final Node o) {
 		final Set<Triple> seen = new HashSet<>();
-		return find(ANY, s, p, o).filter(q -> !q.isDefaultGraph() && seen.add(q.asTriple()));
+		return find(ANY, s, p, o).sequential()
+		    .filter(q -> !q.isDefaultGraph())
+		    .map(Quad::asTriple)
+		    .filter(seen::add)
+		    .map(t -> Quad.create(Quad.unionGraph, t)) ;
 	}
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/f00e659c/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/QuadTableForm.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/QuadTableForm.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/QuadTableForm.java
index 89383e3..c600a35 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/QuadTableForm.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/QuadTableForm.java
@@ -135,11 +135,10 @@ public enum QuadTableForm implements Supplier<QuadTable>,Predicate<Set<TupleSlot
 
 				@Override
 				public Stream<Quad> findInUnionGraph(final Node s, final Node p, final Node o) {
-					final AtomicReference<Triple> mostRecentlySeen = new AtomicReference<>();
-					return find(ANY, s, p, o).filter(currentQuad -> {
-						final Triple currentTriple = currentQuad.asTriple();
-						return !mostRecentlySeen.getAndSet(currentTriple).equals(currentTriple);
-					});
+				    final AtomicReference<Triple> mostRecentlySeen = new AtomicReference<>();
+				    return find(ANY, s, p, o).map(Quad::asTriple).filter(t->{
+				        return !mostRecentlySeen.getAndSet(t).equals(t);
+				    }).map(t->Quad.create(Quad.unionGraph, t)) ;
 				}
 
 				@Override
@@ -238,10 +237,9 @@ public enum QuadTableForm implements Supplier<QuadTable>,Predicate<Set<TupleSlot
 				@Override
 				public Stream<Quad> findInUnionGraph(final Node s, final Node p, final Node o) {
 					final AtomicReference<Triple> mostRecentlySeen = new AtomicReference<>();
-					return find(ANY, s, p, o).filter(currentQuad -> {
-						final Triple currentTriple = currentQuad.asTriple();
-						return !mostRecentlySeen.getAndSet(currentTriple).equals(currentTriple);
-					});
+					return find(ANY, s, p, o).map(Quad::asTriple).filter(t->{
+						return !mostRecentlySeen.getAndSet(t).equals(t);
+					}).map(t->Quad.create(Quad.unionGraph, t)) ;
 				}
 
 				@Override

http://git-wip-us.apache.org/repos/asf/jena/blob/f00e659c/jena-arq/src/test/java/org/apache/jena/sparql/core/mem/TestDatasetGraphInMemory.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/core/mem/TestDatasetGraphInMemory.java b/jena-arq/src/test/java/org/apache/jena/sparql/core/mem/TestDatasetGraphInMemory.java
index a5ad4c3..4a28dfb 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/core/mem/TestDatasetGraphInMemory.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/mem/TestDatasetGraphInMemory.java
@@ -239,15 +239,17 @@ public class TestDatasetGraphInMemory {
 
 		@Test
 		public void unionGraphWorksProperly() {
-			final DatasetGraph dsg = emptyDataset();
+		    DatasetGraph dsg = emptyDataset();
 			// quads from named graphs should appear in union
-			final Quad q = Quad.create(createBlankNode(), createBlankNode(), createBlankNode(), createBlankNode());
+			Quad q = Quad.create(createBlankNode(), createBlankNode(), createBlankNode(), createBlankNode());
 			dsg.add(q);
-			assertTrue(iter(dsg.find(unionGraph, ANY, ANY, ANY)).some(q::equals));
+			// Expected in the union graph
+			Quad q2 = Quad.create(unionGraph, q.asTriple());
+			assertTrue(iter(dsg.find(unionGraph, ANY, ANY, ANY)).some(q2::equals));
 			// no triples from default graph should appear in union
-			final Triple t = Triple.create(createBlankNode(), createBlankNode(), createBlankNode());
+			Triple t = Triple.create(createBlankNode(), createBlankNode(), createBlankNode());
 			dsg.getDefaultGraph().add(t);
-			assertFalse(iter(dsg.find(unionGraph, ANY, ANY, ANY)).some(t::equals));
+			assertFalse(iter(dsg.find(unionGraph, ANY, ANY, ANY)).some(Quad::isDefaultGraph)) ;
 		}
 
 		@Override


[2/3] jena git commit: Align to JENA-1064 : intermediate migration.

Posted by an...@apache.org.
Align to JENA-1064 : intermediate migration.

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

Branch: refs/heads/master
Commit: a03ac090dff2b0b54bab54fa17196463806c0e7c
Parents: bbce322
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Nov 15 21:24:04 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Sun Nov 15 21:24:04 2015 +0000

----------------------------------------------------------------------
 .../org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java   | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/a03ac090/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
index d20651f..8b44741 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/mem/DatasetGraphInMemory.java
@@ -190,14 +190,15 @@ public class DatasetGraphInMemory extends DatasetGraphTriplesQuads implements Tr
 	}
 
 	private Iterator<Quad> quadsFinder(final Node g, final Node s, final Node p, final Node o) {
-		if (isUnionGraph(g)) return findInUnionGraph(s, p, o);
+		if (isUnionGraph(g)) return findInUnionGraph$(s, p, o);
 		return quadsIndex().find(g, s, p, o).iterator();
 	}
 
 	/**
 	 * Union graph is the merge of named graphs.
 	 */
-	public Iterator<Quad> findInUnionGraph(final Node s, final Node p, final Node o) {
+	// Temp - Should this be replaced by DatasetGraphBaseFind code?
+	private Iterator<Quad> findInUnionGraph$(final Node s, final Node p, final Node o) {
 		return access(() -> quadsIndex().findInUnionGraph(s, p, o).iterator());
 	}