Adding IntersectionDatasetGraph
Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/d0101acb Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/d0101acb Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/d0101acb Branch: refs/heads/master Commit: d0101acb89c0d9b3e265bafc6177cd7f79121de5 Parents: d967c1e Author: ajs6f <[email protected]> Authored: Sat Nov 4 13:59:16 2017 -0400 Committer: ajs6f <[email protected]> Committed: Fri Jan 5 09:26:07 2018 -0500 ---------------------------------------------------------------------- .../sparql/util/DifferenceDatasetGraph.java | 47 +--- .../sparql/util/IntersectionDatasetGraph.java | 51 ++++ .../jena/sparql/util/UnionDatasetGraph.java | 15 -- .../jena/sparql/util/ViewDatasetGraph.java | 239 ++++++++++++------- 4 files changed, 202 insertions(+), 150 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/d0101acb/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java index 556d46c..9df3622 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java @@ -1,19 +1,14 @@ package org.apache.jena.sparql.util; -import static org.apache.jena.atlas.iterator.Iter.iter; -import static org.apache.jena.ext.com.google.common.collect.Iterators.concat; import static org.apache.jena.sparql.core.Quad.ANY; -import static org.apache.jena.sparql.core.Quad.defaultGraphIRI; -import static org.apache.jena.sparql.util.graph.GraphUtils.triples2quads; +import static org.apache.jena.sparql.core.Quad.isDefaultGraph; import java.util.Iterator; import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; import org.apache.jena.graph.compose.Difference; -import org.apache.jena.graph.compose.MultiUnion; import org.apache.jena.sparql.core.DatasetGraph; -import org.apache.jena.sparql.core.Quad; public class DifferenceDatasetGraph extends ViewDatasetGraph { @@ -32,7 +27,7 @@ public class DifferenceDatasetGraph extends ViewDatasetGraph { @Override public Graph getGraph(Node graphNode) { - return Quad.isDefaultGraph(graphNode) + return isDefaultGraph(graphNode) ? getDefaultGraph() : getRight().containsGraph(graphNode) ? new Difference(getLeft().getGraph(graphNode), getRight().getGraph(graphNode)) @@ -40,11 +35,6 @@ public class DifferenceDatasetGraph extends ViewDatasetGraph { } @Override - public Graph getUnionGraph() { - return new MultiUnion(iter(listGraphNodes()).map(this::getGraph)); - } - - @Override public boolean containsGraph(Node graphNode) { return getLeft().containsGraph(graphNode); } @@ -55,44 +45,11 @@ public class DifferenceDatasetGraph extends ViewDatasetGraph { } @Override - public Iterator<Quad> find() { - return find(ANY); - } - - @Override - public Iterator<Quad> find(Quad q) { - return find(q.getGraph(), q.getSubject(), q.getPredicate(), q.getObject()); - } - - @Override - public Iterator<Quad> find(Node g, Node s, Node p, Node o) { - return g.isConcrete() - ? findInOneGraph(g, s, p, o) - : concat(findNG(null, s, p, o), findInOneGraph(defaultGraphIRI, s, p, o)); - } - - @Override - public Iterator<Quad> findNG(Node g, Node s, Node p, Node o) { - return g.isConcrete() - ? findInOneGraph(g, s, p, o) - : concat(iter(listGraphNodes()).map(gn -> findInOneGraph(gn, s, p, o))); - } - - private Iterator<Quad> findInOneGraph(Node g, Node s, Node p, Node o) { - return triples2quads(g, getGraph(g).find(s, p, o)); - } - - @Override public boolean contains(Node g, Node s, Node p, Node o) { return getLeft().contains(g, s, p, o) && !getRight().contains(g, s, p, o); } @Override - public boolean contains(Quad q) { - return contains(q.getGraph(), q.getSubject(), q.getPredicate(), q.getObject()); - } - - @Override public boolean isEmpty() { return getLeft().isEmpty() || getLeft() == getRight() || !contains(ANY); } http://git-wip-us.apache.org/repos/asf/jena/blob/d0101acb/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java new file mode 100644 index 0000000..32cc847 --- /dev/null +++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/IntersectionDatasetGraph.java @@ -0,0 +1,51 @@ +package org.apache.jena.sparql.util; + +import static org.apache.jena.atlas.iterator.Iter.filter; + +import java.util.Iterator; +import java.util.function.Function; + +import org.apache.jena.graph.Graph; +import org.apache.jena.graph.Node; +import org.apache.jena.graph.compose.Intersection; +import org.apache.jena.sparql.core.DatasetGraph; + +public class IntersectionDatasetGraph extends ViewDatasetGraph { + + public IntersectionDatasetGraph(DatasetGraph left, DatasetGraph right) { + super(left, right); + } + + public IntersectionDatasetGraph(DatasetGraph left, DatasetGraph right, Context c) { + super(left, right, c); + } + + Graph intersect(Function<DatasetGraph, Graph> mapping) { + return new Intersection(mapping.apply(getLeft()), mapping.apply(getRight())); + } + + @Override + public Graph getDefaultGraph() { + return intersect(DatasetGraph::getDefaultGraph); + } + + @Override + public Graph getGraph(Node graphNode) { + return intersect(dsg -> dsg.getGraph(graphNode)); + } + + @Override + public boolean containsGraph(Node graphNode) { + return both(dsg -> dsg.containsGraph(graphNode)); + } + + @Override + public Iterator<Node> listGraphNodes() { + return filter(getLeft().listGraphNodes(), getRight()::containsGraph); + } + + @Override + public boolean contains(Node g, Node s, Node p, Node o) { + return both(dsg -> dsg.contains(g, s, p, o)); + } +} http://git-wip-us.apache.org/repos/asf/jena/blob/d0101acb/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java index dc6bd1b..cc83b81 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/UnionDatasetGraph.java @@ -54,16 +54,6 @@ public class UnionDatasetGraph extends ViewDatasetGraph { } @Override - public Iterator<Quad> find() { - return fromEach(DatasetGraph::find); - } - - @Override - public Iterator<Quad> find(Quad quad) { - return fromEach(dsg -> dsg.find(quad)); - } - - @Override public Iterator<Quad> find(Node g, Node s, Node p, Node o) { return fromEach(dsg -> dsg.find(g, s, p, o)); } @@ -79,11 +69,6 @@ public class UnionDatasetGraph extends ViewDatasetGraph { } @Override - public boolean contains(Quad quad) { - return either(dsg -> dsg.contains(quad)); - } - - @Override public boolean isEmpty() { return both(DatasetGraph::isEmpty); } http://git-wip-us.apache.org/repos/asf/jena/blob/d0101acb/jena-arq/src/main/java/org/apache/jena/sparql/util/ViewDatasetGraph.java ---------------------------------------------------------------------- diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/util/ViewDatasetGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/util/ViewDatasetGraph.java index e27f0ae..6d07cb0 100644 --- a/jena-arq/src/main/java/org/apache/jena/sparql/util/ViewDatasetGraph.java +++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/ViewDatasetGraph.java @@ -1,143 +1,202 @@ package org.apache.jena.sparql.util; +import static org.apache.jena.atlas.iterator.Iter.count; +import static org.apache.jena.atlas.iterator.Iter.map; +import static org.apache.jena.ext.com.google.common.collect.Iterators.concat; import static org.apache.jena.query.ReadWrite.WRITE; +import static org.apache.jena.sparql.core.Quad.ANY; +import static org.apache.jena.sparql.core.Quad.defaultGraphIRI; +import static org.apache.jena.sparql.util.graph.GraphUtils.triples2quads; + +import java.util.Iterator; import org.apache.jena.atlas.lib.Pair; import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; +import org.apache.jena.graph.compose.MultiUnion; import org.apache.jena.query.ReadWrite; import org.apache.jena.shared.Lock; import org.apache.jena.sparql.core.DatasetGraph; import org.apache.jena.sparql.core.Quad; public abstract class ViewDatasetGraph extends Pair.OfSameType<DatasetGraph> implements DatasetGraph { - - private final Context context; - - private final Lock lock; + + private final Context context; + + private final Lock lock; public ViewDatasetGraph(DatasetGraph left, DatasetGraph right) { this(left, right, Context.emptyContext); } - - public ViewDatasetGraph(DatasetGraph left, DatasetGraph right, Context c) { + public ViewDatasetGraph(DatasetGraph left, DatasetGraph right, Context c) { super(left, right); this.context = c; this.lock = new PairLock(left.getLock(), right.getLock()); } + private void noMutation() { + throw new UnsupportedOperationException("Views do not allow mutation!"); + } @Override - public void commit() { - throw new UnsupportedOperationException(); - } - - @Override - public void begin(ReadWrite readWrite) { - if (readWrite.equals(WRITE)) throw new UnsupportedOperationException(); - forEach(dsg -> dsg.begin(readWrite)); - } + public void commit() { + noMutation(); + } - @Override - public void abort() { - throw new UnsupportedOperationException(); - } - @Override - public void end() { - forEach(DatasetGraph::end); - } + @Override + public void begin(ReadWrite readWrite) { + if (readWrite.equals(WRITE)) noMutation(); + forEach(dsg -> dsg.begin(readWrite)); + } + @Override + public void abort() { + noMutation(); + } - @Override - public boolean isInTransaction() { - return either(DatasetGraph::isInTransaction); - } + @Override + public void end() { + forEach(DatasetGraph::end); + } - @Override - public void setDefaultGraph(Graph g) { - throw new UnsupportedOperationException(); - } + @Override + public boolean isInTransaction() { + return either(DatasetGraph::isInTransaction); + } - @Override - public void addGraph(Node graphName, Graph graph) { - throw new UnsupportedOperationException(); - } + @Override + public void setDefaultGraph(Graph g) { + throw new UnsupportedOperationException(); + } - @Override - public void removeGraph(Node graphName) { - throw new UnsupportedOperationException(); - } + @Override + public void addGraph(Node graphName, Graph graph) { + noMutation(); + } - @Override - public void add(Quad quad) { - throw new UnsupportedOperationException(); - } + @Override + public void removeGraph(Node graphName) { + noMutation(); + } - @Override - public void delete(Quad quad) { - throw new UnsupportedOperationException(); - } + @Override + public void add(Quad quad) { + noMutation(); + } - @Override - public void add(Node g, Node s, Node p, Node o) { - throw new UnsupportedOperationException(); - } + @Override + public void delete(Quad quad) { + noMutation(); + } - @Override - public void delete(Node g, Node s, Node p, Node o) { - throw new UnsupportedOperationException(); - } + @Override + public void add(Node g, Node s, Node p, Node o) { + noMutation(); + } - @Override - public void deleteAny(Node g, Node s, Node p, Node o) { - throw new UnsupportedOperationException(); - } + @Override + public void delete(Node g, Node s, Node p, Node o) { + noMutation(); + } - @Override - public void clear() { - throw new UnsupportedOperationException(); - } + @Override + public void deleteAny(Node g, Node s, Node p, Node o) { + noMutation(); + } - @Override - public Lock getLock() { - return lock; - } + @Override + public void clear() { + noMutation(); + } + @Override + public Iterator<Quad> find() { + return find(ANY); + } + + @Override + public Iterator<Quad> find(Quad q) { + return find(q.getGraph(), q.getSubject(), q.getPredicate(), q.getObject()); + } + + @Override + public Iterator<Quad> find(Node g, Node s, Node p, Node o) { + return g.isConcrete() + ? findInOneGraph(g, s, p, o) + : concat(findNG(null, s, p, o), findInOneGraph(defaultGraphIRI, s, p, o)); + } + + @Override + public Iterator<Quad> findNG(Node g, Node s, Node p, Node o) { + return g.isConcrete() + ? findInOneGraph(g, s, p, o) + : concat(map(listGraphNodes(), gn -> findInOneGraph(gn, s, p, o))); + } + + protected Iterator<Quad> findInOneGraph(Node g, Node s, Node p, Node o) { + return triples2quads(g, getGraph(g).find(s, p, o)); + } + + @Override + public Graph getUnionGraph() { + return new MultiUnion(map(listGraphNodes(), this::getGraph)); + } + + @Override + public boolean contains(Quad q) { + return contains(q.getGraph(), q.getSubject(), q.getPredicate(), q.getObject()); + } + + @Override + public Lock getLock() { + return lock; + } @Override public Context getContext() { return context; } - @Override - public void close() {} + @Override + public void close() { + } + + @Override + public boolean supportsTransactions() { + return both(DatasetGraph::supportsTransactions); + } + + @Override + public boolean supportsTransactionAbort() { + return false; + } - @Override - public boolean supportsTransactions() { - return both(DatasetGraph::supportsTransactions); - } + @Override + public long size() { + return count(listGraphNodes()); + } - @Override - public boolean supportsTransactionAbort() { - return false; - } + @Override + public boolean isEmpty() { + return listGraphNodes().hasNext(); + } - private static class PairLock extends Pair.OfSameType<Lock> implements Lock { + private static class PairLock extends Pair.OfSameType<Lock> implements Lock { - public PairLock(Lock left, Lock right) { - super(left, right); - } + public PairLock(Lock left, Lock right) { + super(left, right); + } - @Override - public void enterCriticalSection(boolean readLockRequested) { - forEach(lock -> lock.enterCriticalSection(readLockRequested)); - } + @Override + public void enterCriticalSection(boolean readLockRequested) { + forEach(lock -> lock.enterCriticalSection(readLockRequested)); + } - @Override - public void leaveCriticalSection() { - forEach(Lock::leaveCriticalSection); - } - } + @Override + public void leaveCriticalSection() { + forEach(Lock::leaveCriticalSection); + } + } }
