Better use of preexisting Pair type, refactoring, introducing DifferenceDatasetGraph
Project: http://git-wip-us.apache.org/repos/asf/jena/repo Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/ad3bcaac Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/ad3bcaac Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/ad3bcaac Branch: refs/heads/master Commit: ad3bcaaca61a7c0c3dac5a3ff2bcad4b0f35c806 Parents: 79b0654 Author: ajs6f <[email protected]> Authored: Fri Nov 3 14:06:22 2017 -0400 Committer: ajs6f <[email protected]> Committed: Fri Jan 5 09:26:07 2018 -0500 ---------------------------------------------------------------------- .../sparql/util/DifferenceDatasetGraph.java | 104 ++++++++++++++ .../jena/sparql/util/UnionDatasetGraph.java | 131 +---------------- .../jena/sparql/util/ViewDatasetGraph.java | 143 +++++++++++++++++++ .../java/org/apache/jena/atlas/lib/Pair.java | 24 +++- .../java/org/apache/jena/atlas/lib/Union.java | 28 ---- 5 files changed, 274 insertions(+), 156 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jena/blob/ad3bcaac/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 new file mode 100644 index 0000000..556d46c --- /dev/null +++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/DifferenceDatasetGraph.java @@ -0,0 +1,104 @@ +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 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 { + + public DifferenceDatasetGraph(DatasetGraph left, DatasetGraph right) { + this(left, right, Context.emptyContext); + } + + public DifferenceDatasetGraph(DatasetGraph left, DatasetGraph right, Context c) { + super(left, right, c); + } + + @Override + public Graph getDefaultGraph() { + return new Difference(getRight().getDefaultGraph(), getLeft().getDefaultGraph()); + } + + @Override + public Graph getGraph(Node graphNode) { + return Quad.isDefaultGraph(graphNode) + ? getDefaultGraph() + : getRight().containsGraph(graphNode) + ? new Difference(getLeft().getGraph(graphNode), getRight().getGraph(graphNode)) + : getLeft().getGraph(graphNode); + } + + @Override + public Graph getUnionGraph() { + return new MultiUnion(iter(listGraphNodes()).map(this::getGraph)); + } + + @Override + public boolean containsGraph(Node graphNode) { + return getLeft().containsGraph(graphNode); + } + + @Override + public Iterator<Node> listGraphNodes() { + return getLeft().listGraphNodes(); + } + + @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); + } + + @Override + public long size() { + return getLeft().size(); + } +} http://git-wip-us.apache.org/repos/asf/jena/blob/ad3bcaac/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 e799531..dc6bd1b 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 @@ -1,7 +1,5 @@ package org.apache.jena.sparql.util; -import static org.apache.jena.query.ReadWrite.WRITE; - import java.util.Iterator; import java.util.function.Function; @@ -9,16 +7,10 @@ import org.apache.jena.ext.com.google.common.collect.Iterators; import org.apache.jena.graph.Graph; import org.apache.jena.graph.Node; import org.apache.jena.graph.compose.Union; -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 class UnionDatasetGraph extends org.apache.jena.atlas.lib.Union<DatasetGraph> implements DatasetGraph { - - private final Lock lock; - - private final Context context; +public class UnionDatasetGraph extends ViewDatasetGraph { public UnionDatasetGraph(DatasetGraph left, DatasetGraph right) { this(left, right, Context.emptyContext); @@ -26,42 +18,14 @@ public class UnionDatasetGraph extends org.apache.jena.atlas.lib.Union<DatasetGr public UnionDatasetGraph(DatasetGraph left, DatasetGraph right, Context context) { super(left, right); - this.context = context; - this.lock = new UnionLock(left.getLock(), right.getLock()); } private Graph union(Function<DatasetGraph, Graph> op) { - return new Union(op.apply(left), op.apply(right)); + return new Union(op.apply(getLeft()), op.apply(getRight())); } <T> Iterator<T> fromEach(Function<DatasetGraph, Iterator<T>> op) { - return Iterators.concat(op.apply(left), op.apply(right)); - } - - @Override - public void begin(ReadWrite readWrite) { - if (readWrite.equals(WRITE)) throw new UnsupportedOperationException(); - forEach(dsg -> dsg.begin(readWrite)); - } - - @Override - public void commit() { - throw new UnsupportedOperationException(); - } - - @Override - public void abort() { - throw new UnsupportedOperationException(); - } - - @Override - public void end() { - forEach(DatasetGraph::end); - } - - @Override - public boolean isInTransaction() { - return either(DatasetGraph::isInTransaction); + return Iterators.concat(op.apply(getLeft()), op.apply(getRight())); } @Override @@ -85,51 +49,11 @@ public class UnionDatasetGraph extends org.apache.jena.atlas.lib.Union<DatasetGr } @Override - public void setDefaultGraph(Graph g) { - throw new UnsupportedOperationException(); - } - - @Override - public void addGraph(Node graphName, Graph graph) { - throw new UnsupportedOperationException(); - } - - @Override - public void removeGraph(Node graphName) { - throw new UnsupportedOperationException(); - } - - @Override public Iterator<Node> listGraphNodes() { return fromEach(DatasetGraph::listGraphNodes); } @Override - public void add(Quad quad) { - throw new UnsupportedOperationException(); - } - - @Override - public void delete(Quad quad) { - throw new UnsupportedOperationException(); - } - - @Override - public void add(Node g, Node s, Node p, Node o) { - throw new UnsupportedOperationException(); - } - - @Override - public void delete(Node g, Node s, Node p, Node o) { - throw new UnsupportedOperationException(); - } - - @Override - public void deleteAny(Node g, Node s, Node p, Node o) { - throw new UnsupportedOperationException(); - } - - @Override public Iterator<Quad> find() { return fromEach(DatasetGraph::find); } @@ -160,59 +84,12 @@ public class UnionDatasetGraph extends org.apache.jena.atlas.lib.Union<DatasetGr } @Override - public void clear() { - throw new UnsupportedOperationException(); - } - - @Override public boolean isEmpty() { return both(DatasetGraph::isEmpty); } @Override - public Lock getLock() { - return lock; - } - - @Override - public Context getContext() { - return context; - } - - @Override public long size() { - return left.size() + right.size(); - } - - @Override - public void close() { - throw new UnsupportedOperationException(); - } - - @Override - public boolean supportsTransactions() { - return both(DatasetGraph::supportsTransactions); - } - - @Override - public boolean supportsTransactionAbort() { - return both(DatasetGraph::supportsTransactionAbort); - } - - private static class UnionLock extends org.apache.jena.atlas.lib.Union<Lock> implements Lock { - - public UnionLock(Lock left, Lock right) { - super(left, right); - } - - @Override - public void enterCriticalSection(boolean readLockRequested) { - forEach(lock -> lock.enterCriticalSection(readLockRequested)); - } - - @Override - public void leaveCriticalSection() { - forEach(Lock::leaveCriticalSection); - } + return getLeft().size() + getRight().size(); } } http://git-wip-us.apache.org/repos/asf/jena/blob/ad3bcaac/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 new file mode 100644 index 0000000..e27f0ae --- /dev/null +++ b/jena-arq/src/main/java/org/apache/jena/sparql/util/ViewDatasetGraph.java @@ -0,0 +1,143 @@ +package org.apache.jena.sparql.util; + +import static org.apache.jena.query.ReadWrite.WRITE; + +import org.apache.jena.atlas.lib.Pair; +import org.apache.jena.graph.Graph; +import org.apache.jena.graph.Node; +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; + + public ViewDatasetGraph(DatasetGraph left, DatasetGraph right) { + this(left, right, Context.emptyContext); + } + + + public ViewDatasetGraph(DatasetGraph left, DatasetGraph right, Context c) { + super(left, right); + this.context = c; + this.lock = new PairLock(left.getLock(), right.getLock()); + } + + + @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)); + } + + @Override + public void abort() { + throw new UnsupportedOperationException(); + } + + @Override + public void end() { + forEach(DatasetGraph::end); + } + + + @Override + public boolean isInTransaction() { + return either(DatasetGraph::isInTransaction); + } + + @Override + public void setDefaultGraph(Graph g) { + throw new UnsupportedOperationException(); + } + + @Override + public void addGraph(Node graphName, Graph graph) { + throw new UnsupportedOperationException(); + } + + @Override + public void removeGraph(Node graphName) { + throw new UnsupportedOperationException(); + } + + @Override + public void add(Quad quad) { + throw new UnsupportedOperationException(); + } + + @Override + public void delete(Quad quad) { + throw new UnsupportedOperationException(); + } + + @Override + public void add(Node g, Node s, Node p, Node o) { + throw new UnsupportedOperationException(); + } + + @Override + public void delete(Node g, Node s, Node p, Node o) { + throw new UnsupportedOperationException(); + } + + @Override + public void deleteAny(Node g, Node s, Node p, Node o) { + throw new UnsupportedOperationException(); + } + + @Override + public void clear() { + throw new UnsupportedOperationException(); + } + + @Override + public Lock getLock() { + return lock; + } + + + @Override + public Context getContext() { + return context; + } + + @Override + public void close() {} + + @Override + public boolean supportsTransactions() { + return both(DatasetGraph::supportsTransactions); + } + + @Override + public boolean supportsTransactionAbort() { + return false; + } + + private static class PairLock extends Pair.OfSameType<Lock> implements Lock { + + public PairLock(Lock left, Lock right) { + super(left, right); + } + + @Override + public void enterCriticalSection(boolean readLockRequested) { + forEach(lock -> lock.enterCriticalSection(readLockRequested)); + } + + @Override + public void leaveCriticalSection() { + forEach(Lock::leaveCriticalSection); + } + } +} http://git-wip-us.apache.org/repos/asf/jena/blob/ad3bcaac/jena-base/src/main/java/org/apache/jena/atlas/lib/Pair.java ---------------------------------------------------------------------- diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/Pair.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/Pair.java index b472f3d..855495a 100644 --- a/jena-base/src/main/java/org/apache/jena/atlas/lib/Pair.java +++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/Pair.java @@ -22,6 +22,8 @@ import static org.apache.jena.atlas.lib.Lib.hashCodeObject ; import static org.apache.jena.atlas.lib.StrUtils.str ; import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Function; public class Pair<A, B> { @@ -37,6 +39,26 @@ public class Pair<A, B> public A car() { return a ; } public B cdr() { return b ; } + public static class OfSameType<T> extends Pair<T, T> { + + public OfSameType(T a, T b) { + super(a, b); + } + + public void forEach(Consumer<T> op) { + op.accept(a); + op.accept(b); + } + + public boolean both(Function<T, Boolean> op) { + return op.apply(a) && op.apply(b); + } + + public boolean either(Function<T, Boolean> op) { + return op.apply(a) || op.apply(b); + } + } + @Override public int hashCode() { @@ -60,5 +82,5 @@ public class Pair<A, B> } @Override - public String toString() { return "("+str(a)+", "+str(b)+")" ; } + public String toString() { return "("+str(a)+", "+str(b)+")" ; } } http://git-wip-us.apache.org/repos/asf/jena/blob/ad3bcaac/jena-base/src/main/java/org/apache/jena/atlas/lib/Union.java ---------------------------------------------------------------------- diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/Union.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/Union.java deleted file mode 100644 index c5ff0c6..0000000 --- a/jena-base/src/main/java/org/apache/jena/atlas/lib/Union.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.apache.jena.atlas.lib; - -import java.util.function.Consumer; -import java.util.function.Function; - -public class Union<T> { - - protected final T left, right; - - public Union(T left, T right) { - this.left = left; - this.right = right; - } - - protected boolean both(Function<T, Boolean> op) { - return op.apply(left) && op.apply(right); - } - - protected boolean either(Function<T, Boolean> op) { - return op.apply(left) || op.apply(right); - } - - protected void forEach(Consumer<T> op) { - op.accept(left); - op.accept(right); - } - -}
