You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by st...@apache.org on 2017/02/10 16:55:30 UTC

[28/45] commons-rdf git commit: COMMONSRDF-55: Handle Jena's urn:x-arq:DefaultGraph and friends

COMMONSRDF-55: Handle Jena's urn:x-arq:DefaultGraph and friends


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

Branch: refs/heads/COMMONSRDF-47
Commit: bb264738aa0e3c3a8e9ae8bba0d7109cfb59adaa
Parents: 5e2430f
Author: Stian Soiland-Reyes <st...@apache.org>
Authored: Fri Jan 27 17:26:59 2017 +0000
Committer: Stian Soiland-Reyes <st...@apache.org>
Committed: Fri Jan 27 17:26:59 2017 +0000

----------------------------------------------------------------------
 .../commons/rdf/api/AbstractDatasetTest.java    | 45 +++++++++++
 .../commons/rdf/jena/impl/AbstractQuadLike.java | 39 +++++++--
 .../rdf/jena/impl/InternalJenaFactory.java      |  2 +-
 .../rdf/jena/DefaultGraphInQuadTest.java        | 85 ++++++++++++++++++++
 .../apache/commons/rdf/jena/JenaRDFTest.java    |  1 -
 5 files changed, 165 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/bb264738/api/src/test/java/org/apache/commons/rdf/api/AbstractDatasetTest.java
----------------------------------------------------------------------
diff --git a/api/src/test/java/org/apache/commons/rdf/api/AbstractDatasetTest.java b/api/src/test/java/org/apache/commons/rdf/api/AbstractDatasetTest.java
index 505994f..edde127 100644
--- a/api/src/test/java/org/apache/commons/rdf/api/AbstractDatasetTest.java
+++ b/api/src/test/java/org/apache/commons/rdf/api/AbstractDatasetTest.java
@@ -158,8 +158,53 @@ public abstract class AbstractDatasetTest {
             count++;
         }
         assertEquals(dataset.size(), count);
+        
+        // Pattern iteration which should cover multiple graphs.
+        
+        Set<Quad> aliceQuads = new HashSet<>();
+        for (Quad aliceQ : dataset.iterate(null, alice, null, null)) { 
+            aliceQuads.add(aliceQ);
+        }
+        assertTrue(aliceQuads.contains(factory.createQuad(graph1, alice, name, aliceName)));
+        assertTrue(aliceQuads.contains(factory.createQuad(graph1, alice, knows, bob)));
+        // We can't test this by Quad equality, as bnode1 might become mapped by the 
+        // dataset
+        //assertTrue(aliceQuads.contains(factory.createQuad(graph1, alice, member, bnode1)));
+        assertTrue(aliceQuads.contains(factory.createQuad(null, alice, isPrimaryTopicOf, graph1)));
+        assertEquals(4, aliceQuads.size());
+        
+        // Check the isPrimaryTopicOf statements in the default graph
+        int topics = 0;
+        for (Quad topic : dataset.iterate(null, null, isPrimaryTopicOf, null)) {
+            topics++;
+            // COMMONSRDF-55: should not be <urn:x-arq:defaultgraph> or similar
+            assertFalse(topic.getGraphName().isPresent());
+        }
+        assertEquals(2, topics);
     }
 
+    @Test
+    public void streamDefaultGraphNameAlice() throws Exception {
+        // null below would match in ANY graph (including default graph)
+        Optional<? extends Quad> aliceTopic = dataset.stream(null, alice, isPrimaryTopicOf, null).findAny();
+        assertTrue(aliceTopic.isPresent());
+        // COMMONSRDF-55: should not be <urn:x-arq:defaultgraph> or similar
+        assertNull(aliceTopic.get().getGraphName().orElse(null));
+        assertFalse(aliceTopic.get().getGraphName().isPresent());
+    }
+
+
+    @Test
+    public void streamDefaultGraphNameByPattern() throws Exception {
+        // Explicitly select in only the default graph Optional.empty()
+        Optional<? extends Quad> aliceTopic = dataset.stream(Optional.empty(), null, null, null).findAny();
+        assertTrue(aliceTopic.isPresent());
+        // COMMONSRDF-55: should not be <urn:x-arq:defaultgraph> or similar
+        assertNull(aliceTopic.get().getGraphName().orElse(null));
+        assertFalse(aliceTopic.get().getGraphName().isPresent());
+    }
+    
+    
     /**
      * Special quad closing for RDF4J.
      */

http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/bb264738/jena/src/main/java/org/apache/commons/rdf/jena/impl/AbstractQuadLike.java
----------------------------------------------------------------------
diff --git a/jena/src/main/java/org/apache/commons/rdf/jena/impl/AbstractQuadLike.java b/jena/src/main/java/org/apache/commons/rdf/jena/impl/AbstractQuadLike.java
index 9a4c94b..3100ae6 100644
--- a/jena/src/main/java/org/apache/commons/rdf/jena/impl/AbstractQuadLike.java
+++ b/jena/src/main/java/org/apache/commons/rdf/jena/impl/AbstractQuadLike.java
@@ -22,12 +22,15 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.UUID;
 
+import org.apache.commons.rdf.api.BlankNodeOrIRI;
+import org.apache.commons.rdf.api.IRI;
 import org.apache.commons.rdf.api.QuadLike;
 import org.apache.commons.rdf.api.RDFTerm;
 import org.apache.commons.rdf.jena.JenaQuad;
 import org.apache.commons.rdf.jena.JenaQuadLike;
 import org.apache.commons.rdf.jena.JenaRDF;
 import org.apache.commons.rdf.jena.JenaTriple;
+import org.apache.jena.graph.Factory;
 import org.apache.jena.graph.Triple;
 import org.apache.jena.sparql.core.Quad;
 
@@ -52,6 +55,22 @@ abstract class AbstractQuadLike<S extends RDFTerm, P extends RDFTerm, O extends
     private static InternalJenaFactory internalJenaFactory = new InternalJenaFactory() {
     };
 
+    /**
+     * COMMONSRDF-55 - special handling of urn:x-arq:DefaultGraph and friends
+     */
+    private static class DefaultGraphChecker {
+        // Fixed UUID for comparison of defaultGraphNodeGenerated
+        private UUID salt = UUID.fromString("aaa6bf96-ea58-4a55-9485-3733403a1f24");     
+        private RDFTerm defaultGraph = internalJenaFactory.createRDFTerm(Quad.defaultGraphIRI, salt);
+        private RDFTerm defaultGraphNodeGenerated = internalJenaFactory.createRDFTerm(Quad.defaultGraphNodeGenerated, salt);
+        
+        public boolean isNotDefaultGraph(RDFTerm graphName) {
+            return !(graphName.equals(defaultGraph) || graphName.equals(defaultGraphNodeGenerated)); 
+        }
+    }
+    
+    private static DefaultGraphChecker defaultGraphChecker = new DefaultGraphChecker();
+
     final Optional<G> graphName;
     final S subject;
     final P predicate;
@@ -59,11 +78,12 @@ abstract class AbstractQuadLike<S extends RDFTerm, P extends RDFTerm, O extends
     org.apache.jena.sparql.core.Quad quad = null;
     org.apache.jena.graph.Triple triple = null;
 
+    
     AbstractQuadLike(final S subject, final P predicate, final O object, final Optional<G> graphName) {
         this.subject = Objects.requireNonNull(subject);
         this.predicate = Objects.requireNonNull(predicate);
         this.object = Objects.requireNonNull(object);
-        this.graphName = Objects.requireNonNull(graphName);
+        this.graphName = Objects.requireNonNull(graphName).filter(defaultGraphChecker::isNotDefaultGraph);
     }
 
     AbstractQuadLike(final S subject, final P predicate, final O object) {
@@ -76,7 +96,11 @@ abstract class AbstractQuadLike<S extends RDFTerm, P extends RDFTerm, O extends
         this.subject = (S) internalJenaFactory.createRDFTerm(quad.getSubject(), salt);
         this.predicate = (P) internalJenaFactory.createRDFTerm(quad.getPredicate(), salt);
         this.object = (O) internalJenaFactory.createRDFTerm(quad.getObject(), salt);
-        this.graphName = Optional.of((G) internalJenaFactory.createRDFTerm(quad.getGraph(), salt));
+        if (quad.isDefaultGraph()) {
+            this.graphName = Optional.empty();
+        } else { 
+            this.graphName = Optional.of((G) internalJenaFactory.createRDFTerm(quad.getGraph(), salt));
+        }
     }
 
     @SuppressWarnings("unchecked")
@@ -92,8 +116,11 @@ abstract class AbstractQuadLike<S extends RDFTerm, P extends RDFTerm, O extends
     public org.apache.jena.sparql.core.Quad asJenaQuad() {
         final JenaRDF factory = new JenaRDF();
         if (quad == null) {
-            quad = org.apache.jena.sparql.core.Quad.create(factory.asJenaNode(graphName.orElse(null)),
-                    factory.asJenaNode(subject), factory.asJenaNode(predicate), factory.asJenaNode(object));
+            quad = org.apache.jena.sparql.core.Quad.create(
+                    graphName.map(factory::asJenaNode).orElse(Quad.defaultGraphIRI),
+                    factory.asJenaNode(subject), 
+                    factory.asJenaNode(predicate), 
+                    factory.asJenaNode(object));
         }
         return quad;
     }
@@ -102,7 +129,9 @@ abstract class AbstractQuadLike<S extends RDFTerm, P extends RDFTerm, O extends
     public org.apache.jena.graph.Triple asJenaTriple() {
         final JenaRDF factory = new JenaRDF();
         if (triple == null) {
-            triple = org.apache.jena.graph.Triple.create(factory.asJenaNode(subject), factory.asJenaNode(predicate),
+            triple = org.apache.jena.graph.Triple.create(
+                    factory.asJenaNode(subject), 
+                    factory.asJenaNode(predicate),
                     factory.asJenaNode(object));
         }
         return triple;

http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/bb264738/jena/src/main/java/org/apache/commons/rdf/jena/impl/InternalJenaFactory.java
----------------------------------------------------------------------
diff --git a/jena/src/main/java/org/apache/commons/rdf/jena/impl/InternalJenaFactory.java b/jena/src/main/java/org/apache/commons/rdf/jena/impl/InternalJenaFactory.java
index 031ba7c..3e186a2 100644
--- a/jena/src/main/java/org/apache/commons/rdf/jena/impl/InternalJenaFactory.java
+++ b/jena/src/main/java/org/apache/commons/rdf/jena/impl/InternalJenaFactory.java
@@ -159,7 +159,7 @@ public abstract class InternalJenaFactory {
         }
         throw new ConversionException("Unrecognized node type: " + node);
     }
-
+    
     public JenaTriple createTriple(final BlankNodeOrIRI subject, final IRI predicate, final RDFTerm object) {
         return new JenaTripleImpl(subject, predicate, object);
     }

http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/bb264738/jena/src/test/java/org/apache/commons/rdf/jena/DefaultGraphInQuadTest.java
----------------------------------------------------------------------
diff --git a/jena/src/test/java/org/apache/commons/rdf/jena/DefaultGraphInQuadTest.java b/jena/src/test/java/org/apache/commons/rdf/jena/DefaultGraphInQuadTest.java
new file mode 100644
index 0000000..739d7a4
--- /dev/null
+++ b/jena/src/test/java/org/apache/commons/rdf/jena/DefaultGraphInQuadTest.java
@@ -0,0 +1,85 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.rdf.jena;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.commons.rdf.api.IRI;
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.sparql.core.Quad;
+import org.junit.Test;
+
+/**
+ * COMMONSRDF-55: Ensure correct handling of 
+ * Jena's default graph IRI urn:x-arq:DefaultGraph
+ */
+public class DefaultGraphInQuadTest {
+    
+    JenaRDF rdf = new JenaRDF();
+    IRI example = rdf.createIRI("http://example.com/");
+    Node exampleJena = NodeFactory.createURI("http://example.com/");
+    
+    @Test
+    public void createFromNull() throws Exception {        
+        JenaQuad q = rdf.createQuad(null, example, example, example);
+        assertFalse(q.getGraphName().isPresent());
+        assertTrue(q.asJenaQuad().isDefaultGraph());
+        assertEquals(Quad.defaultGraphIRI,  q.asJenaQuad().getGraph());
+    }
+
+    @Test
+    public void createFromDefaultGraphIRI() throws Exception {
+        JenaIRI defaultGraph = (JenaIRI) rdf.asRDFTerm(Quad.defaultGraphIRI);        
+        JenaQuad q = rdf.createQuad(defaultGraph, example, example, example);
+        assertTrue(q.asJenaQuad().isDefaultGraph());
+        assertEquals(Quad.defaultGraphIRI,  q.asJenaQuad().getGraph());
+        assertFalse(q.getGraphName().isPresent());
+    }
+    
+    @Test
+    public void defaultGraphIRI() throws Exception {
+        Quad jenaQuad = Quad.create(Quad.defaultGraphIRI, exampleJena, exampleJena, exampleJena);
+        JenaQuad q = rdf.asQuad(jenaQuad);        
+        assertFalse(q.getGraphName().isPresent());
+        assertTrue(q.asJenaQuad().isDefaultGraph());
+    }
+
+    @Test
+    public void defaultGraphNodeGenerated() throws Exception {        
+        // defaultGraphNodeGenerated might appear in parser output
+        Quad jenaQuad = Quad.create(Quad.defaultGraphNodeGenerated, exampleJena, exampleJena, exampleJena);
+        JenaQuad q = rdf.asQuad(jenaQuad);        
+        assertFalse(q.getGraphName().isPresent());
+        assertTrue(q.asJenaQuad().isDefaultGraph());
+    }
+
+    @Test
+    public void unionGraph() throws Exception {
+        // unionGraph shouldn't really appear as a quad except
+        // in a pattern
+        Quad jenaQuad = Quad.create(Quad.unionGraph, exampleJena, exampleJena, exampleJena);
+        JenaQuad q = rdf.asQuad(jenaQuad);
+        // But at least we can agree it is NOT (necessarily) in the
+        // default graph
+        assertFalse(q.asJenaQuad().isDefaultGraph());
+        assertTrue(q.getGraphName().isPresent());
+    }
+}

http://git-wip-us.apache.org/repos/asf/commons-rdf/blob/bb264738/jena/src/test/java/org/apache/commons/rdf/jena/JenaRDFTest.java
----------------------------------------------------------------------
diff --git a/jena/src/test/java/org/apache/commons/rdf/jena/JenaRDFTest.java b/jena/src/test/java/org/apache/commons/rdf/jena/JenaRDFTest.java
index 72986d0..fd50421 100644
--- a/jena/src/test/java/org/apache/commons/rdf/jena/JenaRDFTest.java
+++ b/jena/src/test/java/org/apache/commons/rdf/jena/JenaRDFTest.java
@@ -15,7 +15,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.commons.rdf.jena;
 
 import org.apache.commons.rdf.api.AbstractRDFTest;