This is an automated email from the ASF dual-hosted git repository. andy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit b43add82aeb5631e6d6635e8ec50e36eee3839ca Author: Andy Seaborne <[email protected]> AuthorDate: Mon Nov 6 21:31:24 2023 +0000 GH-2077: Move NamedGraphWrapper into DatsetGraphMap --- .../jena/sparql/core/DatasetGraphFactory.java | 45 ++++---- .../apache/jena/sparql/core/DatasetGraphMap.java | 126 ++++++++++++++------- .../org/apache/jena/sparql/core/NamedGraph.java | 11 +- .../apache/jena/sparql/core/NamedGraphWrapper.java | 49 -------- 4 files changed, 107 insertions(+), 124 deletions(-) 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 03b879801b..e4a865ce7e 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 @@ -18,15 +18,15 @@ package org.apache.jena.sparql.core; -import java.util.Iterator ; -import java.util.Objects ; +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.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 ; +import org.apache.jena.sparql.graph.GraphFactory; import org.apache.jena.sys.JenaSystem; public class DatasetGraphFactory @@ -45,7 +45,7 @@ public class DatasetGraphFactory * @see #createTxnMem */ public static DatasetGraph create() { - return new DatasetGraphMap() ; + return new DatasetGraphMap(); } /** @@ -94,20 +94,20 @@ public class DatasetGraphFactory * @return a general-purpose Dataset */ public static DatasetGraph createGeneral(Graph dftGraph) { - return new DatasetGraphMapLink(dftGraph, graphMakerMem) ; + return new DatasetGraphMapLink(dftGraph, graphMakerMem); } /** * 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() ; - dsg2.addGraph(gn, dsg.getGraph(gn)) ; + 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(); + dsg2.addGraph(gn, dsg.getGraph(gn)); } - return dsg2 ; + return dsg2; } /** @@ -121,7 +121,7 @@ public class DatasetGraphFactory /** * Create a DatasetGraph which only ever has a single default graph. */ - public static DatasetGraph wrap(Graph graph) { return DatasetGraphOne.create(graph) ; } + public static DatasetGraph wrap(Graph graph) { return DatasetGraphOne.create(graph); } /** * An always empty {@link DatasetGraph}. @@ -130,21 +130,14 @@ public class DatasetGraphFactory */ public static DatasetGraph empty() { return DatasetGraphZero.create(); } - /** 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(Node name) ; } + public interface GraphMaker { public Graph create(Node name); } /** A graph maker that doesn't make graphs. */ - public static GraphMaker graphMakerNull = (name) -> null ; + public static GraphMaker graphMakerNull = (name) -> null; /** A graph maker that creates unnamed Jena default graphs */ - public static GraphMaker graphMakerMem = (name) -> GraphFactory.createDefaultGraph() ; - - /** A graph maker that creates {@link NamedGraph}s around a Jena default graphs */ - public static GraphMaker graphMakerNamedGraphMem = (name) -> { - Graph g = GraphFactory.createDefaultGraph() ; - return new NamedGraphWrapper(name, g); - }; + public static GraphMaker graphMakerMem = (name) -> GraphFactory.createDefaultGraph(); } 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 38fb05db60..ede679433e 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 @@ -18,22 +18,23 @@ package org.apache.jena.sparql.core; -import java.util.HashMap ; -import java.util.Iterator ; -import java.util.Map ; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; import java.util.Map.Entry; -import org.apache.jena.atlas.iterator.IteratorConcat ; -import org.apache.jena.graph.Graph ; -import org.apache.jena.graph.Node ; -import org.apache.jena.graph.Triple ; -import org.apache.jena.query.ReadWrite ; +import org.apache.jena.atlas.iterator.IteratorConcat; +import org.apache.jena.graph.Graph; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.Triple; +import org.apache.jena.query.ReadWrite; import org.apache.jena.query.TxnType; import org.apache.jena.riot.system.PrefixMap; import org.apache.jena.riot.system.Prefixes; -import org.apache.jena.sparql.ARQException ; -import org.apache.jena.sparql.core.DatasetGraphFactory.GraphMaker ; +import org.apache.jena.sparql.ARQException; +import org.apache.jena.sparql.core.DatasetGraphFactory.GraphMaker; import org.apache.jena.sparql.graph.GraphOps; +import org.apache.jena.sparql.graph.GraphWrapper; import org.apache.jena.system.G; /** Implementation of a {@code DatasetGraph} as an extensible set of graphs. @@ -47,32 +48,43 @@ import org.apache.jena.system.G; */ public class DatasetGraphMap extends DatasetGraphTriplesQuads { - private final GraphMaker graphMaker ; - private final Map<Node, Graph> graphs = new HashMap<>() ; - private final Graph defaultGraph ; - private final PrefixMap prefixes ; + private final GraphMaker graphMaker; + private final Map<Node, Graph> graphs = new HashMap<>(); + private final Graph defaultGraph; + private final PrefixMap prefixes; /** DatasetGraphMap defaulting to storage in memory. */ public DatasetGraphMap() { - this(DatasetGraphFactory.graphMakerNamedGraphMem) ; + this(null, DatasetGraphFactory.graphMakerMem); } - /** DatasetGraphMap with a specific policy for graph creation. - * This allows control over the storage. - */ - public DatasetGraphMap(GraphMaker graphMaker) { - this(graphMaker.create(null), graphMaker) ; + public DatasetGraphMap(Graph defaultGraph) { + this(defaultGraph, DatasetGraphFactory.graphMakerMem); } - private DatasetGraphMap(Graph defaultGraph, GraphMaker graphMaker) { - this.defaultGraph = defaultGraph ; - this.graphMaker = graphMaker ; - // Preserves legacy behaviour of "getDefaultGraph" having prefixes. + private DatasetGraphMap(Graph baseDefaultGraph, GraphMaker baseGraphMaker) { + this.graphMaker = namedGraphMaker(baseGraphMaker); + if ( baseDefaultGraph == null ) + this.defaultGraph = this.graphMaker.create(null); + else if ( baseDefaultGraph instanceof NamedGraph ) + this.defaultGraph = baseDefaultGraph; + else + this.defaultGraph = graphMaker.create(null); this.prefixes = Prefixes.adapt(defaultGraph); } + /* Ensure a GraphMaker returns {@link NamedGraph}. */ + private static GraphMaker namedGraphMaker(GraphMaker baseMaker) { + return (name) -> { + Graph g = baseMaker.create(name); + if ( g instanceof NamedGraph ) + return g; + return new NamedGraphWrapper(name, g); + }; + } + // ---- - private final Transactional txn = TransactionalLock.createMRSW() ; + private final Transactional txn = TransactionalLock.createMRSW(); private final Transactional txn() { return txn; } @Override public void begin() { txn().begin(); } @Override public void begin(TxnType txnType) { txn().begin(txnType); } @@ -112,49 +124,49 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads @Override protected void addToDftGraph(Node s, Node p, Node o) { - getDefaultGraph().add(Triple.create(s, p, o)) ; + getDefaultGraph().add(Triple.create(s, p, o)); } @Override protected void addToNamedGraph(Node g, Node s, Node p, Node o) { - getGraph(g).add(Triple.create(s, p, o)) ; + getGraph(g).add(Triple.create(s, p, o)); } @Override protected void deleteFromDftGraph(Node s, Node p, Node o) { - getDefaultGraph().delete(Triple.create(s, p, o)) ; + getDefaultGraph().delete(Triple.create(s, p, o)); } @Override protected void deleteFromNamedGraph(Node g, Node s, Node p, Node o) { - getGraph(g).delete(Triple.create(s, p, o)) ; + getGraph(g).delete(Triple.create(s, p, o)); } @Override protected Iterator<Quad> findInDftGraph(Node s, Node p, Node o) { - Iterator<Triple> iter = getDefaultGraph().find(s, p, o) ; - return G.triples2quadsDftGraph(iter) ; + Iterator<Triple> iter = getDefaultGraph().find(s, p, o); + return G.triples2quadsDftGraph(iter) ; } @Override protected Iterator<Quad> findInSpecificNamedGraph(Node g, Node s, Node p, Node o) { - Iterator<Triple> iter = getGraph(g).find(s, p, o) ; - return G.triples2quads(g, iter) ; + Iterator<Triple> iter = getGraph(g).find(s, p, o); + return G.triples2quads(g, iter); } @Override protected Iterator<Quad> findInAnyNamedGraphs(Node s, Node p, Node o) { - Iterator<Node> gnames = listGraphNodes() ; - IteratorConcat<Quad> iter = new IteratorConcat<>() ; + Iterator<Node> gnames = listGraphNodes(); + IteratorConcat<Quad> iter = new IteratorConcat<>(); // Named graphs - for ( ; gnames.hasNext() ; ) { + for (; gnames.hasNext(); ) { Node gn = gnames.next(); - Iterator<Quad> qIter = findInSpecificNamedGraph(gn, s, p, o) ; + Iterator<Quad> qIter = findInSpecificNamedGraph(gn, s, p, o); if ( qIter != null ) - iter.add(qIter) ; + iter.add(qIter); } - return iter ; + return iter; } @Override @@ -165,9 +177,9 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads @Override public Graph getGraph(Node graphNode) { if ( Quad.isUnionGraph(graphNode) ) - return GraphOps.unionGraph(this) ; + return GraphOps.unionGraph(this); if ( Quad.isDefaultGraph(graphNode)) - return getDefaultGraph() ; + return getDefaultGraph(); // Not a special case. Graph g = graphs.get(graphNode); if ( g == null ) { @@ -189,14 +201,40 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads * Sub classes can reimplement this. */ protected Graph getGraphCreate(Node graphNode) { - Graph g = graphMaker.create(graphNode) ; + Graph g = graphMaker.create(graphNode); if ( g == null ) - throw new ARQException("Can't make new graphs") ; - return g ; + throw new ARQException("Can't make new graphs"); + return g; } @Override public long size() { return graphs.size(); } + + /** + * Add a name to a graph. + * + * @see GraphView + */ + private static 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; + } + + @Override + public String toString() { + return "NamedGraphWrapper("+graphName+")"; + } + } + } 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 index 77db174c0d..8ec566df9e 100644 --- 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 @@ -27,11 +27,12 @@ import org.apache.jena.graph.Node ; * 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. - * + * This interface is for graph that has one associated name. + * What "associated" means is left open. + * <p> + * This interface is used be Jena Text. + * * @see GraphView - * @see NamedGraphWrapper */ public interface NamedGraph extends Graph { @@ -39,7 +40,7 @@ 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} + * A named graph of "null" is discouraged - use {@link Quad#defaultGraphIRI} - but is legal. * for a default graph in the context of use. */ public Node getGraphName(); 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 deleted file mode 100644 index 110d1eaa3e..0000000000 --- a/jena-arq/src/main/java/org/apache/jena/sparql/core/NamedGraphWrapper.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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; - } - - @Override - public String toString() { - return "NamedGraphWrapper("+graphName+")"; - } -}
