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

Reply via email to