You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2016/07/09 09:39:06 UTC

[10/18] jena git commit: JENA-1158: union default graph tests and clearup.

JENA-1158: union default graph tests and clearup.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/9ddfccac
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/9ddfccac
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/9ddfccac

Branch: refs/heads/master
Commit: 9ddfccac29b4d7dbc17c920035045846b38523cc
Parents: 145b713
Author: Andy Seaborne <an...@apache.org>
Authored: Fri Jul 8 18:05:38 2016 +0100
Committer: Andy Seaborne <an...@apache.org>
Committed: Fri Jul 8 18:05:38 2016 +0100

----------------------------------------------------------------------
 .../jena/sparql/core/DatasetGraphMap.java       |   8 +-
 .../jena/sparql/core/DatasetGraphMapLink.java   |   8 +-
 .../jena/sparql/engine/main/OpExecutor.java     |   4 -
 .../engine/main/iterator/QueryIterGraph.java    |   2 +-
 .../uniongraph/AbstractTestUnionTransform.java  |  95 --------
 .../algebra/uniongraph/Dev_TS_UnionGraph.java   |  35 ---
 .../algebra/uniongraph/TestUnionGraph.java      | 100 ---------
 .../uniongraph/TestUnionTransformQuads.java     |  34 ---
 .../uniongraph/TestUnionTransformTriples.java   |  33 ---
 .../org/apache/jena/sparql/core/TS_Core.java    |   2 +
 .../jena/sparql/core/TestSpecialGraphs.java     | 218 +++++++++++++++++++
 11 files changed, 235 insertions(+), 304 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/9ddfccac/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMap.java
----------------------------------------------------------------------
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 4679776..dc06ca7 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
@@ -32,6 +32,7 @@ import org.apache.jena.graph.Triple ;
 import org.apache.jena.query.ReadWrite ;
 import org.apache.jena.sparql.ARQException ;
 import org.apache.jena.sparql.core.DatasetGraphFactory.GraphMaker ;
+import org.apache.jena.sparql.graph.GraphUnionRead ;
 
 /** Implementation of a {@code DatasetGraph} as an extensible set of graphs.
  *  Subclasses need to manage any implicit graph creation.
@@ -136,6 +137,11 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
 
     @Override
     public Graph getGraph(Node graphNode) {
+        if ( Quad.isUnionGraph(graphNode) ) 
+            return new GraphUnionRead(this) ;
+        if ( Quad.isDefaultGraph(graphNode))
+            return getDefaultGraph() ;
+        // Not a special case.
         Graph g = graphs.get(graphNode);
         if ( g == null ) {
             g = getGraphCreate();
@@ -147,7 +153,7 @@ public class DatasetGraphMap extends DatasetGraphTriplesQuads
 
     /** Called from getGraph when a nonexistent graph is asked for.
      * Return null for "nothing created as a graph".
-     * Sub classes reimplement this or pr  
+     * Sub classes can reimplement this.  
      */
     protected Graph getGraphCreate() { 
         Graph g = graphMaker.create() ;

http://git-wip-us.apache.org/repos/asf/jena/blob/9ddfccac/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
index 4835aed..41f5169 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/DatasetGraphMapLink.java
@@ -26,6 +26,7 @@ import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.query.ReadWrite ;
 import org.apache.jena.sparql.core.DatasetGraphFactory.GraphMaker ;
+import org.apache.jena.sparql.graph.GraphUnionRead ;
 
 /** Implementation of a DatasetGraph as an extensible set of graphs.
  *  <p>
@@ -138,11 +139,16 @@ public class DatasetGraphMapLink extends DatasetGraphCollection
 
     @Override
     public Graph getGraph(Node graphNode) {
+        if ( Quad.isUnionGraph(graphNode) ) 
+            return new GraphUnionRead(this) ;
+        if ( Quad.isDefaultGraph(graphNode))
+            return getDefaultGraph() ;
+        // Not a special case.
         Graph g = graphs.get(graphNode);
         if ( g == null ) {
             g = getGraphCreate();
             if ( g != null )
-                addGraph(graphNode, g);
+                graphs.put(graphNode, g);
         }
         return g;
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/9ddfccac/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java
index d301a38..f97c5c1 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/OpExecutor.java
@@ -24,7 +24,6 @@ import java.util.List ;
 import java.util.Set ;
 
 import org.apache.jena.atlas.iterator.Iter ;
-import org.apache.jena.atlas.logging.Log ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.query.ARQ ;
 import org.apache.jena.query.QueryExecException ;
@@ -152,9 +151,6 @@ public class OpExecutor
             return execute(subOp, input, cxt2) ;
         }
 
-        if ( Quad.isUnionGraph(gn) )
-            Log.warn(this, "Not implemented yet: union default graph in general OpExecutor") ;
-
         // Bad news -- if ( Lib.equals(gn, Quad.tripleInQuad) ) {}
         return null ;
     }

http://git-wip-us.apache.org/repos/asf/jena/blob/9ddfccac/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/iterator/QueryIterGraph.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/iterator/QueryIterGraph.java b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/iterator/QueryIterGraph.java
index bd957f8..0d36902 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/iterator/QueryIterGraph.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/engine/main/iterator/QueryIterGraph.java
@@ -82,7 +82,7 @@ public class QueryIterGraph extends QueryIterRepeatApply
 
     protected static Iterator<Node> makeSources(DatasetGraph data, Binding b, Node graphVar) {
         Node n2 = resolve(b, graphVar) ;
-        if ( n2 != null && ! n2.isURI() )
+        if ( n2 != null && n2.isLiteral() ) 
             // Blank node or literal possible after resolving
             return Iter.nullIterator() ;
         

http://git-wip-us.apache.org/repos/asf/jena/blob/9ddfccac/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/AbstractTestUnionTransform.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/AbstractTestUnionTransform.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/AbstractTestUnionTransform.java
deleted file mode 100644
index 1fc50bf..0000000
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/AbstractTestUnionTransform.java
+++ /dev/null
@@ -1,95 +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.algebra.uniongraph;
-
-import java.util.List ;
-
-import org.apache.jena.atlas.iterator.Iter ;
-import org.apache.jena.atlas.junit.BaseTest ;
-import org.apache.jena.sparql.algebra.Algebra ;
-import org.apache.jena.sparql.algebra.Op ;
-import org.apache.jena.sparql.core.Quad ;
-import org.apache.jena.sparql.engine.QueryIterator ;
-import org.apache.jena.sparql.engine.binding.Binding ;
-import org.junit.Test ;
-
-public abstract class AbstractTestUnionTransform extends BaseTest
-{
-    // Tests of patterns over the implicit union of all named graphs.
-    // Two sets - for triples and for quads
-    
-    // TODO need multiple triple pattern BGPs. 
-    
-    @Test public void union_1()
-    {
-        List<Binding> results = exec("(bgp (?s ?p ?o))") ;
-        assertEquals(2, results.size()) ;
-    }
-    
-    @Test public void union_2()
-    {
-        List<Binding> results = exec("(bgp (<s2> ?p ?o))") ;
-        assertEquals(1, results.size()) ;
-    }
-    
-    @Test public void union_3()
-    {
-        List<Binding> results = exec("(graph <g1> (bgp (<s1> ?p ?o)))") ;
-        assertEquals(1, results.size()) ;
-    }
-
-    @Test public void union_4()
-    {
-        List<Binding> results = exec("(graph <g1> (bgp (<s2> ?p ?o)))") ;
-        assertEquals(0, results.size()) ;
-    }
-
-    @Test public void union_5()
-    {
-        List<Binding> results = exec("(graph <g2> (bgp (<s2> ?p ?o)))") ;
-        assertEquals(1, results.size()) ;
-    }
-
-    @Test public void union_6()
-    {
-        List<Binding> results = exec("(graph <"+Quad.defaultGraphIRI+"> (bgp (<s2> ?p ?o)))") ;
-        assertEquals(0, results.size()) ;
-    }
-
-    @Test public void union_7()
-    {
-        List<Binding> results = exec("(graph <"+Quad.defaultGraphIRI+"> (bgp (<x2> ?p ?o)))") ;
-        assertEquals(3, results.size()) ;
-    }
- 
-//    @Test public void union_7()
-//    {
-//        List<Binding> results = exec("(graph <"+Quad.defaultGraphNodeGenerated+"> (bgp (<s2> ?p ?o)))") ;
-//        assertEquals(1, results.size()) ;
-//    }
-    
-    private List<Binding> exec(String pattern)
-    {
-        Op op = op(pattern) ;
-        QueryIterator qIter = Algebra.exec(op, TestUnionGraph.dsg1) ;
-        return  Iter.toList(qIter) ;
-    }
-    
-    protected abstract Op op(String pattern) ;
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/9ddfccac/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/Dev_TS_UnionGraph.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/Dev_TS_UnionGraph.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/Dev_TS_UnionGraph.java
deleted file mode 100644
index 6bffe16..0000000
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/Dev_TS_UnionGraph.java
+++ /dev/null
@@ -1,35 +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.algebra.uniongraph;
-
-import org.junit.runner.RunWith ;
-import org.junit.runners.Suite ;
-
-@RunWith(Suite.class)
-@Suite.SuiteClasses( {
-    TestUnionGraph.class
-    , TestUnionTransformTriples.class
-    , TestUnionTransformQuads.class
-})
-
-// Not active (hence does not get named TS_* because the POM names them for surefire tests) 
-
-public class Dev_TS_UnionGraph
-{ }
-

http://git-wip-us.apache.org/repos/asf/jena/blob/9ddfccac/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionGraph.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionGraph.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionGraph.java
deleted file mode 100644
index b54f5df..0000000
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionGraph.java
+++ /dev/null
@@ -1,100 +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.algebra.uniongraph;
-
-import java.util.List ;
-
-import org.apache.jena.atlas.iterator.Iter ;
-import org.apache.jena.atlas.junit.BaseTest ;
-import org.apache.jena.atlas.lib.StrUtils ;
-import org.apache.jena.sparql.algebra.Algebra ;
-import org.apache.jena.sparql.algebra.Op ;
-import org.apache.jena.sparql.core.DatasetGraph ;
-import org.apache.jena.sparql.core.Quad ;
-import org.apache.jena.sparql.engine.QueryIterator ;
-import org.apache.jena.sparql.engine.binding.Binding ;
-import org.apache.jena.sparql.sse.SSE ;
-import org.apache.jena.sparql.sse.builders.BuilderGraph ;
-import org.junit.Test ;
-
-public class TestUnionGraph extends BaseTest
-{
-    static String x1 = StrUtils.strjoinNL("(dataset",
-                                         "  (graph (<s> <p> <o>) (<x> <p> <o>) (<x2> <p> <o1>) (<x2> <p> <o3>) (<x2> <p> <o4>))",
-                                         "  (graph <g1> (triple <s1> <p1> <o1>))",
-                                         "  (graph <g2> (triple <s2> <p2> <o2>))",
-                                         "  (graph <g3> (triple <s2> <p2> <o2>))", // Duplicate triple
-                                         ")") ;
-    static DatasetGraph dsg1 = BuilderGraph.buildDataset(SSE.parse(x1)) ;
-
-    static String x2 = StrUtils.strjoinNL("(dataset",
-                                         "  (graph (<s> <p1> 10) (<s> <p1> 11) (<s> <p2> 20) )",
-                                         "  (graph <g1> (<s1> <p1> <z>) (<z> <p2> 1) )",
-                                         "  (graph <g2> (<s1> <p1> <z>) (<z> <p2> 2) )",
-                                         "  (graph <g3> (<s>  <p1> 10))",
-                                         ")") ;
-    
-    static DatasetGraph dsg2 = BuilderGraph.buildDataset(SSE.parse(x2)) ;
-
-    @Test
-    public void union_graph_triples_1() {
-        List<Binding> results = exec("(graph <" + Quad.unionGraph + "> (bgp (<s2> ?p ?o)))", false, dsg1) ;
-        assertEquals(1, results.size()) ;
-    }
-
-    @Test
-    public void union_graph_triples_2() {
-        List<Binding> results = exec("(graph <" + Quad.unionGraph + "> (bgp (<x2> ?p ?o)))", false, dsg1) ;
-        assertEquals(0, results.size()) ;
-    }
-
-    @Test
-    public void union_graph_quads_1() {
-        List<Binding> results = exec("(graph <" + Quad.unionGraph + "> (bgp (<s2> ?p ?o)))", true, dsg1) ;
-        assertEquals(1, results.size()) ;
-    }
-
-    @Test
-    public void union_graph_quads_2() {
-        List<Binding> results = exec("(graph <" + Quad.unionGraph + "> (bgp (<x2> ?p ?o)))", true, dsg1) ;
-        assertEquals(0, results.size()) ;
-    }
-
-    // Patterns
-    @Test
-    public void union_graph_triples_10() {
-        List<Binding> results = exec("(graph <" + Quad.unionGraph + "> (bgp (<s1> ?p ?z) (?z ?q ?o) ))", false, dsg2) ;
-        assertEquals(2, results.size()) ;
-    }
-
-    @Test
-    public void union_graph_quads_10() {
-        List<Binding> results = exec("(graph <" + Quad.unionGraph + "> (bgp (<s1> ?p ?z) (?z ?q ?o) ))", false, dsg2) ;
-        assertEquals(2, results.size()) ;
-    }
-
-    static private List<Binding> exec(String pattern, boolean applyQuad, DatasetGraph dsg) {
-        Op op = SSE.parseOp(pattern) ;
-        if ( applyQuad )
-            op = Algebra.toQuadForm(op) ;
-        Op op2 = Algebra.unionDefaultGraph(op) ;
-        QueryIterator qIter = Algebra.exec(op, TestUnionGraph.dsg1) ;
-        return Iter.toList(qIter) ;
-    }
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/9ddfccac/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionTransformQuads.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionTransformQuads.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionTransformQuads.java
deleted file mode 100644
index 8477421..0000000
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionTransformQuads.java
+++ /dev/null
@@ -1,34 +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.algebra.uniongraph;
-
-import org.apache.jena.sparql.algebra.Algebra ;
-import org.apache.jena.sparql.algebra.Op ;
-import org.apache.jena.sparql.sse.SSE ;
-
-public class TestUnionTransformQuads extends AbstractTestUnionTransform  
-{
-    @Override
-    protected Op op(String pattern) {
-        Op op = SSE.parseOp(pattern) ;
-        op = Algebra.toQuadForm(op) ;
-        Op op2 = Algebra.unionDefaultGraph(op) ;
-        return op2 ;
-    }
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/9ddfccac/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionTransformTriples.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionTransformTriples.java b/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionTransformTriples.java
deleted file mode 100644
index 5506480..0000000
--- a/jena-arq/src/test/java/org/apache/jena/sparql/algebra/uniongraph/TestUnionTransformTriples.java
+++ /dev/null
@@ -1,33 +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.algebra.uniongraph;
-
-import org.apache.jena.sparql.algebra.Algebra ;
-import org.apache.jena.sparql.algebra.Op ;
-import org.apache.jena.sparql.sse.SSE ;
-
-public class TestUnionTransformTriples extends AbstractTestUnionTransform  
-{
-    @Override
-    protected Op op(String pattern) {
-        Op op = SSE.parseOp(pattern) ;
-        Op op2 = Algebra.unionDefaultGraph(op) ;
-        return op2 ;
-    }
-}

http://git-wip-us.apache.org/repos/asf/jena/blob/9ddfccac/jena-arq/src/test/java/org/apache/jena/sparql/core/TS_Core.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/core/TS_Core.java b/jena-arq/src/test/java/org/apache/jena/sparql/core/TS_Core.java
index e31fe46..e17aed9 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/core/TS_Core.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/TS_Core.java
@@ -40,6 +40,8 @@ import org.junit.runners.Suite ;
     , TestDatasetGraphBaseFind_Mem.class
     , TestDatasetGraphBaseFindPattern_General.class
     , TestDatasetGraphBaseFindPattern_Mem.class
+    
+    , TestSpecialGraphs.class
 })
 
 public class TS_Core

http://git-wip-us.apache.org/repos/asf/jena/blob/9ddfccac/jena-arq/src/test/java/org/apache/jena/sparql/core/TestSpecialGraphs.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/core/TestSpecialGraphs.java b/jena-arq/src/test/java/org/apache/jena/sparql/core/TestSpecialGraphs.java
new file mode 100644
index 0000000..613994f
--- /dev/null
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/TestSpecialGraphs.java
@@ -0,0 +1,218 @@
+/**
+ * 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 static org.apache.jena.sparql.core.TestSpecialGraphs.Mode.QUADS ;
+import static org.apache.jena.sparql.core.TestSpecialGraphs.Mode.TRIPLES ;
+import static org.junit.Assert.assertEquals ;
+
+import java.util.Arrays ;
+import java.util.Collection ;
+import java.util.List ;
+
+import org.apache.jena.atlas.iterator.Iter ;
+import org.apache.jena.atlas.lib.Creator ;
+import org.apache.jena.atlas.lib.StrUtils ;
+import org.apache.jena.sparql.algebra.Algebra ;
+import org.apache.jena.sparql.algebra.Op ;
+import org.apache.jena.sparql.core.DatasetGraph ;
+import org.apache.jena.sparql.core.DatasetGraphFactory ;
+import org.apache.jena.sparql.core.Quad ;
+import org.apache.jena.sparql.engine.QueryIterator ;
+import org.apache.jena.sparql.engine.binding.Binding ;
+import org.apache.jena.sparql.sse.SSE ;
+import org.apache.jena.sparql.sse.builders.BuilderGraph ;
+import org.junit.Test ;
+import org.junit.runner.RunWith ;
+import org.junit.runners.Parameterized ;
+import org.junit.runners.Parameterized.Parameters ;
+
+/** Test special graphs */
+@RunWith(Parameterized.class)
+public class TestSpecialGraphs {
+    @Parameters(name = "{index}: {0}")
+    public static Collection<Object[]> data() {
+        Creator<DatasetGraph> datasetGeneralMaker = ()-> DatasetGraphFactory.createGeneral() ; 
+        Creator<DatasetGraph> datasetTxnMemMaker  = ()-> DatasetGraphFactory.createTxnMem() ;
+        Creator<DatasetGraph> datasetMemMaker     = ()-> DatasetGraphFactory.create() ;
+        return Arrays.asList(new Object[][] {
+            { "General",  datasetGeneralMaker },
+            { "Plain",    datasetMemMaker} ,
+            { "TxnMem",   datasetTxnMemMaker}
+            });
+    }
+    
+    static enum Mode { TRIPLES, QUADS } 
+    
+    static String x1 = StrUtils.strjoinNL("(dataset",
+                                          "  (graph (<s> <p> <x>) (<x> <p> <o>) (<x2> <p> <o1>) (<x2> <p> <o3>) (<x2> <p> <o4>))",
+                                          "  (graph <g1> (<s1> <p1> <s1>) (<s1> <p1> <s2>))",
+                                          "  (graph <g2> (triple <s2> <p2> <o2>) (triple <s2> <p3> <o3>))",
+                                          "  (graph <g3> (triple <s2> <p2> <o2>))", // Duplicate triple
+                                          ")") ;
+    private DatasetGraph dsg ;
+    
+    public TestSpecialGraphs(String label, Creator<DatasetGraph> maker) {
+        this.dsg = BuilderGraph.buildDataset(maker.create(), SSE.parse(x1)) ;
+    }
+
+    @Test
+    public void union_dft_1t() {
+        union_dft_1(TRIPLES) ;
+    }
+    
+    @Test
+    public void union_dft_1q() {
+        union_dft_1(QUADS) ;
+    }
+    
+    private void union_dft_1(Mode mode) {
+        Op op = op("(bgp (?s ?p ?o))", mode) ;
+        List<Binding> results = exec(op) ;
+        assertEquals(5, results.size()) ;
+        Op op2 = Algebra.unionDefaultGraph(op) ;
+        List<Binding> results2 = exec(op2) ;
+        assertEquals(4, results2.size()) ;
+    }
+    
+    @Test
+    public void graph_union_1t() {
+        List<Binding> results = exec("(graph <" + Quad.unionGraph.getURI() + "> (bgp (<s2> ?p ?o)))", TRIPLES) ;
+        assertEquals(2, results.size()) ;
+    }
+
+    @Test
+    public void graph_union_1q() {
+        List<Binding> results = exec("(graph <" + Quad.unionGraph.getURI() + "> (bgp (<s2> ?p ?o)))", QUADS) ;
+        assertEquals(2, results.size()) ;
+    }
+
+    @Test
+    public void graph_union_2t() {
+        List<Binding> results = exec("(graph <" + Quad.unionGraph.getURI() + "> (bgp (<s1> ?p ?o) (?o ?q ?z)  ))", TRIPLES) ;
+        assertEquals(4, results.size()) ;
+    }
+
+    @Test
+    public void graph_union_2q() {
+        List<Binding> results = exec("(graph <" + Quad.unionGraph.getURI() + "> (bgp (<s1> ?p ?o) (?o ?q ?z)  ))", QUADS) ;
+        assertEquals(4, results.size()) ;
+    }
+
+    @Test
+    public void graph_dft_1t() {
+        List<Binding> results = exec("(graph <" + Quad.defaultGraphIRI.getURI() + "> (bgp (<s2> ?p ?o)))", TRIPLES) ;
+        assertEquals(0, results.size()) ;
+    }
+
+    @Test
+    public void graph_dft_1q() {
+        List<Binding> results = exec("(graph <" + Quad.defaultGraphIRI.getURI() + "> (bgp (<s2> ?p ?o)))", QUADS) ;
+        assertEquals(0, results.size()) ;
+    }
+
+    @Test
+    public void graph_dft_2t() {
+        List<Binding> results = exec("(graph <" + Quad.defaultGraphIRI.getURI() + "> (bgp (<s> ?p ?o)))", TRIPLES) ;
+        assertEquals(1, results.size()) ;
+    }
+
+    @Test
+    public void graph_dft_2q() {
+        List<Binding> results = exec("(graph <" + Quad.defaultGraphIRI.getURI() + "> (bgp (<s> ?p ?o)))", QUADS) ;
+        assertEquals(1, results.size()) ;
+    }
+
+    @Test
+    public void graph_dft_3t() {
+        List<Binding> results = exec("(graph <" + Quad.defaultGraphIRI.getURI() + "> (bgp (?x ?p ?z) (?z ?q ?y) ))", TRIPLES) ;
+        assertEquals(1, results.size()) ;
+    }
+
+    @Test
+    public void graph_dft_3q() {
+        List<Binding> results = exec("(graph <" + Quad.defaultGraphIRI.getURI() + "> (bgp (?x ?p ?z) (?z ?q ?y) ))", QUADS) ;
+        assertEquals(1, results.size()) ;
+    }
+
+    @Test
+    public void graph_dftg_1t() {
+        List<Binding> results = exec("(graph <" + Quad.defaultGraphNodeGenerated.getURI() + "> (bgp (<s2> ?p ?o)))", TRIPLES) ;
+        assertEquals(0, results.size()) ;
+    }
+    
+    @Test
+    public void graph_dftg_2t() {
+        List<Binding> results = exec("(graph <" + Quad.defaultGraphNodeGenerated.getURI() + "> (bgp (<x2> ?p ?o)))", TRIPLES) ;
+        assertEquals(3, results.size()) ;
+    }
+    
+    @Test
+    public void graph_dftg_1q() {
+        List<Binding> results = exec("(graph <" + Quad.defaultGraphNodeGenerated.getURI() + "> (bgp (<s2> ?p ?o)))", QUADS) ;
+        assertEquals(0, results.size()) ;
+    }
+
+    @Test
+    public void graph_dftg_2q() {
+        List<Binding> results = exec("(graph <" + Quad.defaultGraphNodeGenerated.getURI() + "> (bgp (<x2> ?p ?o)))", QUADS) ;
+        assertEquals(3, results.size()) ;
+    }
+
+    @Test
+    public void direct_3t() {
+        List<Binding> results = exec("(graph <g1> (bgp (<s1> ?p ?o)))", TRIPLES) ;
+        assertEquals(2, results.size()) ;
+    }
+
+    @Test
+    public void direct_3q() {
+        List<Binding> results = exec("(graph <g1> (bgp (<s1> ?p ?o)))", QUADS) ;
+        assertEquals(2, results.size()) ;
+    }
+
+    @Test
+    public void direct_4() {
+        List<Binding> results = exec("(graph <g1> (bgp (<s2> ?p ?o)))", TRIPLES) ;
+        assertEquals(0, results.size()) ;
+    }
+
+    @Test
+    public void direct_5() {
+        List<Binding> results = exec("(graph <g2> (bgp (<s2> ?p ?o)))", TRIPLES) ;
+        assertEquals(2, results.size()) ;
+    }
+
+    private List<Binding> exec(String string, Mode mode) {
+        Op op = op(string, mode) ;
+        return exec(op) ;
+    }
+    
+    private List<Binding> exec(Op op) {
+        QueryIterator qIter = Algebra.exec(op, dsg) ;
+        return Iter.toList(qIter) ;
+    }
+
+    protected Op op(String pattern, Mode mode) {
+        Op op = SSE.parseOp(pattern) ;
+        if ( mode == Mode.QUADS )
+            op = Algebra.toQuadForm(op) ;
+        return op ;
+    }
+}