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 2017/08/24 21:31:32 UTC

[6/8] jena git commit: JENA-1381: NamedGraph; use in DatasetGraphMap, GraphView.

JENA-1381: NamedGraph; use in DatasetGraphMap, GraphView.

Adjust javadoc in DatasetFactory.


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

Branch: refs/heads/master
Commit: 03a1c35abd3c40c05e950c86608d2da668721034
Parents: b358603
Author: Andy Seaborne <an...@apache.org>
Authored: Sat Aug 19 17:56:54 2017 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Sat Aug 19 17:56:54 2017 +0100

----------------------------------------------------------------------
 .../org/apache/jena/query/DatasetFactory.java   | 56 +++++++------
 .../jena/sparql/core/DatasetGraphFactory.java   | 82 ++++++++++++--------
 .../jena/sparql/core/DatasetGraphMap.java       | 12 +--
 .../jena/sparql/core/DatasetGraphMapLink.java   |  9 ++-
 .../org/apache/jena/sparql/core/GraphView.java  |  3 +-
 .../org/apache/jena/sparql/core/NamedGraph.java | 46 +++++++++++
 .../jena/sparql/core/NamedGraphWrapper.java     | 44 +++++++++++
 7 files changed, 186 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/03a1c35a/jena-arq/src/main/java/org/apache/jena/query/DatasetFactory.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/query/DatasetFactory.java b/jena-arq/src/main/java/org/apache/jena/query/DatasetFactory.java
index 84fb9dd..42f960b 100644
--- a/jena-arq/src/main/java/org/apache/jena/query/DatasetFactory.java
+++ b/jena-arq/src/main/java/org/apache/jena/query/DatasetFactory.java
@@ -39,35 +39,22 @@ import org.apache.jena.util.FileManager;
  */
 public class DatasetFactory {
 
-    /** Create an in-memory, non-transactional Dataset.
+    /** Create an in-memory {@link Dataset}.
      * <p>
      * See also {@link #createTxnMem()} for a transactional dataset.
      * <p>
      * This implementation copies models when {@link Dataset#addNamedModel(String, Model)} is called.
+     * <p>
+     * This implementation does not support serialized transactions (it only provides MRSW locking). 
+     * 
+     * @see #createTxnMem
      */
     public static Dataset create() {
         return wrap(DatasetGraphFactory.create()) ;
     }
     
-	/** Create an in-memory, non-transactional Dataset.
-	 * <p>
-	 * See also {@link #createTxnMem()} for a transactional dataset.
-	 * <p>
-	 * Use {@link #createGeneral()} when needing to add graphs with mixed charcateristics, 
-	 * e.g. inference graphs, specific graphs from TDB.
-	 * <p>    
-     * <em>This operation is marked "deprecated" because the general purpose "add named graph of any implementation"
-     * feature will be removed; this feature is now provided by {@link #createGeneral()}.
-     * </em>
-	 * @deprecated Prefer {@link #createGeneral()} or {@link #createTxnMem()} or {@link #create()}
-	 */
-	@Deprecated
-	public static Dataset createMem() {
-		return createGeneral() ;
-	}
-
 	/**
-     * Create an in-memory. transactional Dataset.
+     * Create an in-memory. transactional {@link Dataset}.
      * <p> 
      * This fully supports transactions, including abort to roll-back changes.
      * It provides "autocommit" if operations are performed
@@ -75,7 +62,7 @@ public class DatasetFactory {
      * (the implementation adds a begin/commit around each add or delete
      * so overheads can accumulate).
      * 
-     * @return a transactional, in-memory, modifiable Dataset which
+     * @return a transactional, in-memory, modifiable Dataset
      * 
      */
 	public static Dataset createTxnMem() {
@@ -83,21 +70,44 @@ public class DatasetFactory {
 	}
 
 	/**
-	 * Create a general-purpose Dataset.<br/>
+	 * Create a general-purpose  {@link Dataset}.<br/>
 	 * Any graphs needed are in-memory unless explciitly added with {@link Dataset#addNamedModel}.
 	 * </p>
-	 * This dataset can contain graphs from any source when added via {@link Dataset#addNamedModel}.
+	 * This dataset type can contain graphs from any source when added via {@link Dataset#addNamedModel}.
 	 * These are held as links to the supplied graph and not copied.
 	 * <p> 
-	 * This dataset does not support transactions. 
+	 * <em>This dataset does not support the graph indexing feature of jena-text.</em>
+     * <p>
+	 * This dataset does not support serialized transactions (it only provides MRSW locking). 
 	 * <p>
 	 * 
+	 * @see #createTxnMem
 	 * @return a general-purpose Dataset
 	 */
 	public static Dataset createGeneral() {
 		return wrap(DatasetGraphFactory.createGeneral()); 
 	}
 
+    /** Create an in-memory {@link Dataset}.
+     * <p>
+     * See also {@link #createTxnMem()} for a transactional dataset.
+     * <p>
+     * Use {@link #createGeneral()} when needing to add graphs with mixed characteristics, 
+     * e.g. inference graphs, or specific graphs from TDB.
+     * <p>    
+     * <em>It does not support the graph indexing feature of jena-text.</em>
+     * <p>
+     * <em>This factory operation is marked "deprecated" because the general purpose "add named graph of any implementation"
+     * feature will be removed; this feature is now provided by {@link #createGeneral()}.
+     * </em>
+     * @deprecated Prefer {@link #createTxnMem()} or {@link #create()} or, for special cases, {@link #createGeneral()}.
+     * @see #createTxnMem
+     */
+    @Deprecated
+    public static Dataset createMem() {
+        return createGeneral() ;
+    }
+
     /**
 	 * @param model The model for the default graph
 	 * @return a dataset with the given model as the default graph

http://git-wip-us.apache.org/repos/asf/jena/blob/03a1c35a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphFactory.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphFactory.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphFactory.java
index 321055e..68e680f 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphFactory.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphFactory.java
@@ -19,64 +19,78 @@
 package org.apache.jena.sparql.core;
 
 import java.util.Iterator ;
+import java.util.Objects ;
 
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.query.Dataset ;
+import org.apache.jena.rdf.model.Model ;
 import org.apache.jena.sparql.core.mem.DatasetGraphInMemory;
 import org.apache.jena.sparql.graph.GraphFactory ;
 
 public class DatasetGraphFactory
 {
-    /** Create an in-memory {@link DatasetGraph}.
-     * This implementation copies the triples of an added graph into the dataset. 
+    /** Create an in-memory {@link Dataset}.
      * <p>
-     * See also {@link #createTxnMem()}
-     * <br/>
-     * See also {@link #createGeneral()}
+     * See also {@link #createTxnMem()} for a transactional dataset.
+     * <p>
+     * This implementation copies models when {@link Dataset#addNamedModel(String, Model)} is called.
+     * <p>
+     * This implementation does not support serialized transactions (it only provides MRSW locking). 
      * 
      * @see #createTxnMem
-     * @see #createGeneral
      */
-    
     public static DatasetGraph create() {
         return new DatasetGraphMap() ;
     }
 
     /**
-     * Create a general-purpose, non-transactional Dataset.<br/>
+     * Create an in-memory. transactional {@link Dataset}.
+     * <p> 
+     * This fully supports transactions, including abort to roll-back changes.
+     * It provides "autocommit" if operations are performed
+     * outside a transaction but with a performance impact
+     * (the implementation adds a begin/commit around each add or delete
+     * so overheads can accumulate).
      * 
-     * This dataset can contain graphs from any source when added via {@link Dataset#addNamedModel}.
-     * Any graphs needed are in-memory unless explicitly added with {@link DatasetGraph#addGraph}.
+     * @return a transactional, in-memory, modifiable Dataset
+     * 
+     */
+    public static DatasetGraph createTxnMem() { return new DatasetGraphInMemory(); }
+
+    /**
+     * Create a general-purpose  {@link Dataset}.<br/>
+     * Any graphs needed are in-memory unless explciitly added with {@link Dataset#addNamedModel}.
      * </p>
+     * This dataset type can contain graphs from any source when added via {@link Dataset#addNamedModel}.
      * These are held as links to the supplied graph and not copied.
      * <p> 
-     * This dataset does not support transactions. 
+     * <em>This dataset does not support the graph indexing feature of jena-text.</em>
+     * <p>
+     * This dataset does not support serialized transactions (it only provides MRSW locking). 
      * <p>
      * 
-     * @return a general-purpose DatasetGraph
+     * @see #createTxnMem
+     * @return a general-purpose Dataset
      */
     public static DatasetGraph createGeneral() { return new DatasetGraphMapLink(graphMakerMem) ; }
 
-    /**
-     * @return a DatasetGraph which features transactional in-memory operation
-     */
-    public static DatasetGraph createTxnMem() { return new DatasetGraphInMemory(); }
-
-    /** Create an in-memory, non-transactional DatasetGraph.
+    /** Create an in-memory {@link Dataset}.
      * <p>
      * See also {@link #createTxnMem()} for a transactional dataset.
      * <p>
      * Use {@link #createGeneral()} when needing to add graphs with mixed characteristics, 
-     * e.g. inference graphs, specific graphs from TDB.
+     * e.g. inference graphs, or specific graphs from TDB.
      * <p>    
-     * <em>This operation is marked "deprecated" because the general purpose 
-     * "add named graph of any implementation"
+     * <em>It does not support the graph indexing feature of jena-text.</em>
+     * <p>
+     * <em>This factory operation is marked "deprecated" because the general purpose "add named graph of any implementation"
      * feature will be removed; this feature is now provided by {@link #createGeneral()}.
      * </em>
-     * @deprecated Prefer {@link #createGeneral()} or {@link #createTxnMem()}
+     * @deprecated Prefer {@link #createTxnMem()} or {@link #create()} or, for special cases, {@link #createGeneral()}.
+     * @see #createTxnMem
      */
-    @Deprecated
+   @Deprecated
     public static DatasetGraph createMem() { return createGeneral() ; }
     
     /** Create a DatasetGraph based on an existing one;
@@ -89,9 +103,11 @@ public class DatasetGraphFactory
         return cloneStructure(dsg) ;
     }
     
-    /** Clone the structure of a DatasetGraph
+    /** 
+     * Clone the structure of a {@link DatasetGraph}.
      */
     public static DatasetGraph cloneStructure(DatasetGraph dsg) {
+        Objects.requireNonNull(dsg, "DatasetGraph must be provided") ;
         DatasetGraphMapLink dsg2 = new DatasetGraphMapLink(dsg.getDefaultGraph()) ;
         for ( Iterator<Node> names = dsg.listGraphNodes() ; names.hasNext() ; ) {
             Node gn = names.next() ;
@@ -126,15 +142,17 @@ public class DatasetGraphFactory
     /** Interface for making graphs when a dataset needs to add a new graph.
      *  Return null for no graph created.
      */
-    public interface GraphMaker { public Graph create() ; }
+    public interface GraphMaker { public Graph create(Node name) ; }
 
-    /** A graph maker that doesn't make graphs */
-    public static GraphMaker graphMakerNull = () -> null ;
+    /** A graph maker that doesn't make graphs. */
+    public static GraphMaker graphMakerNull = (name) -> null ;
 
-//    /** @deprecated Use graphMakerMem */
-//    @Deprecated 
-//    public static GraphMaker memGraphMaker = () -> GraphFactory.createDefaultGraph() ;
+    /** A graph maker that creates unnamed Jena default graphs */ 
+    /*package*/ static GraphMaker graphMakerMem = (name) -> GraphFactory.createDefaultGraph() ;
     
-    /** A graph maker that create Jena default graphs */ 
-    public static GraphMaker graphMakerMem = () -> GraphFactory.createDefaultGraph() ;
+    /** A graph maker that create {@link NamedGraph}s around a Jena default graphs */ 
+    public static GraphMaker graphMakerNamedGraphMem = (name) -> {
+        Graph g = GraphFactory.createDefaultGraph() ;
+        return new NamedGraphWrapper(name, g);
+    };
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/03a1c35a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
index dc06ca7..24d3e04 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
@@ -52,17 +52,17 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
     /**  DatasetGraphMap defaulting to storage in memory.
      */
     public DatasetGraphMap() {
-        this(DatasetGraphFactory.graphMakerMem) ; 
+        this(DatasetGraphFactory.graphMakerNamedGraphMem) ; 
     }
     
     /**  DatasetGraphMap with a specific policy for graph creation.
      *   This allows control over the storage. 
      */
     public DatasetGraphMap(GraphMaker graphMaker) {
-        this(graphMaker.create(), graphMaker) ;
+        this(graphMaker.create(null), graphMaker) ;
     }
     
-    public DatasetGraphMap(Graph defaultGraph, GraphMaker graphMaker) {
+    private DatasetGraphMap(Graph defaultGraph, GraphMaker graphMaker) {
         this.defaultGraph = defaultGraph ;
         this.graphMaker = graphMaker ;
     }
@@ -144,7 +144,7 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
         // Not a special case.
         Graph g = graphs.get(graphNode);
         if ( g == null ) {
-            g = getGraphCreate();
+            g = getGraphCreate(graphNode);
             if ( g != null )
                 graphs.put(graphNode, g);
         }
@@ -155,8 +155,8 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
      * Return null for "nothing created as a graph".
      * Sub classes can reimplement this.  
      */
-    protected Graph getGraphCreate() { 
-        Graph g = graphMaker.create() ;
+    protected Graph getGraphCreate(Node graphNode) { 
+        Graph g = graphMaker.create(graphNode) ;
         if ( g == null )
             throw new ARQException("Can't make new graphs") ;
         return g ;

http://git-wip-us.apache.org/repos/asf/jena/blob/03a1c35a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
index 345efc0..c6d455b 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
@@ -106,7 +106,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
      * DatasetFactory.createGeneral.
      */
     /*package*/ DatasetGraphMapLink(GraphMaker graphMaker) {
-        this(graphMaker.create(), graphMaker) ;
+        this(graphMaker.create(null), graphMaker) ;
     }
 
     /** A {@code DatasetGraph} that uses the given graph for the default graph
@@ -146,6 +146,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
 
     @Override
     public Graph getGraph(Node graphNode) {
+        // Same as DatasetMap.getGraph but we inherit differently.
         if ( Quad.isUnionGraph(graphNode) ) 
             return new GraphUnionRead(this) ;
         if ( Quad.isDefaultGraph(graphNode))
@@ -153,7 +154,7 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
         // Not a special case.
         Graph g = graphs.get(graphNode);
         if ( g == null ) {
-            g = getGraphCreate();
+            g = getGraphCreate(graphNode);
             if ( g != null )
                 graphs.put(graphNode, g);
         }
@@ -163,8 +164,8 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
     /** Called from getGraph when a nonexistent graph is asked for.
      * Return null for "nothing created as a graph"
      */
-    protected Graph getGraphCreate() { 
-        return graphMaker.create() ;
+    protected Graph getGraphCreate(Node graphNode) { 
+        return graphMaker.create(graphNode) ;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/jena/blob/03a1c35a/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java
index 41a9195..ab20c0c 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/GraphView.java
@@ -44,7 +44,7 @@ import org.apache.jena.util.iterator.WrappedIterator ;
  *  @see GraphUnionRead
  */ 
 
-public class GraphView extends GraphBase implements Sync
+public class GraphView extends GraphBase implements NamedGraph, Sync
 {
     // Beware this implements union graph - implementations may wish
     // to do better so see protected method below.
@@ -80,6 +80,7 @@ public class GraphView extends GraphBase implements Sync
      * Return the graph name for this graph in the dataset it is a view of.
      * Returns {@code null} for the default graph.
      */
+    @Override
     public Node getGraphName() {
         return (gn == Quad.defaultGraphNodeGenerated) ? null : gn ;
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/03a1c35a/jena-arq/src/main/java/org/apache/jena/sparql/core/NamedGraph.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/NamedGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/NamedGraph.java
new file mode 100644
index 0000000..77db174
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/NamedGraph.java
@@ -0,0 +1,46 @@
+/*
+ * 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.jena.sparql.core;
+
+import org.apache.jena.graph.Graph ;
+import org.apache.jena.graph.Node ;
+
+/**
+ * A graph with an associated name.
+ * <p>
+ * Sometimes there is an associated name with a graph, where it lives on the web,
+ * or the name in a dataset.
+ * <p>
+ * This interface is for graph that have one associated name.
+ * What "associated" means is left open.  
+ * 
+ * @see GraphView
+ * @see NamedGraphWrapper
+ */
+
+public interface NamedGraph extends Graph {
+    /**
+     * Return the graph name for this graph.
+     * Blank nodes can be used.
+     * <p>
+     * A named graph of "null" is discouraged - use {@link Quad#defaultGraphIRI} 
+     * for a default graph in the context of use.
+     */
+    public Node getGraphName();
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/03a1c35a/jena-arq/src/main/java/org/apache/jena/sparql/core/NamedGraphWrapper.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/NamedGraphWrapper.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/NamedGraphWrapper.java
new file mode 100644
index 0000000..7b826c6
--- /dev/null
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/NamedGraphWrapper.java
@@ -0,0 +1,44 @@
+/*
+ * 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.jena.sparql.core;
+
+import org.apache.jena.graph.Graph ;
+import org.apache.jena.graph.Node ;
+import org.apache.jena.sparql.graph.GraphWrapper ;
+
+/**
+ * Add a name to a graph.
+ * 
+ * @see GraphView
+ */
+
+public class NamedGraphWrapper extends GraphWrapper implements NamedGraph {
+
+    private final Node graphName ;
+
+    public NamedGraphWrapper(Node graphName, Graph graph) {
+        super(graph) ;
+        this.graphName = graphName;
+    }
+
+    @Override
+    public Node getGraphName() {
+        return graphName ;
+    }
+}