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);
-    }
-
-}

Reply via email to