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 2013/07/24 22:18:42 UTC

svn commit: r1506692 - in /jena/trunk/jena-tdb/src: main/java/com/hp/hpl/jena/tdb/solver/ main/java/com/hp/hpl/jena/tdb/sys/ test/java/com/hp/hpl/jena/tdb/store/

Author: andy
Date: Wed Jul 24 20:18:42 2013
New Revision: 1506692

URL: http://svn.apache.org/r1506692
Log:
JENA-492
Carry out different tests for whether "GRAPH ?g" or "GRAPH <uri>"

Modified:
    jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/solver/OpExecutorTDB.java
    jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/solver/SolverLib.java
    jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/sys/TDBInternal.java
    jena/trunk/jena-tdb/src/test/java/com/hp/hpl/jena/tdb/store/Test_SPARQL_TDB.java

Modified: jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/solver/OpExecutorTDB.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/solver/OpExecutorTDB.java?rev=1506692&r1=1506691&r2=1506692&view=diff
==============================================================================
--- jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/solver/OpExecutorTDB.java (original)
+++ jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/solver/OpExecutorTDB.java Wed Jul 24 20:18:42 2013
@@ -33,6 +33,7 @@ import com.hp.hpl.jena.sparql.algebra.op
 import com.hp.hpl.jena.sparql.core.BasicPattern ;
 import com.hp.hpl.jena.sparql.core.Quad ;
 import com.hp.hpl.jena.sparql.core.Substitute ;
+import com.hp.hpl.jena.sparql.core.Var ;
 import com.hp.hpl.jena.sparql.engine.ExecutionContext ;
 import com.hp.hpl.jena.sparql.engine.QueryIterator ;
 import com.hp.hpl.jena.sparql.engine.iterator.QueryIterPeek ;
@@ -337,9 +338,13 @@ public class OpExecutorTDB extends OpExe
     { 
         DatasetGraphTDB ds = (DatasetGraphTDB)execCxt.getDataset() ;
         Filter<Tuple<NodeId>> filter = QC2.getFilter(execCxt.getContext()) ;
-        return SolverLib.graphNames(ds, dsNames.getGraphNode(), input, filter, execCxt) ;
+        Node gn = dsNames.getGraphNode() ;
+        if ( Var.isVar(gn) )
+            return SolverLib.graphNames(ds, dsNames.getGraphNode(), input, filter, execCxt) ;
+        else
+            return SolverLib.testForGraphName(ds, dsNames.getGraphNode(), input, filter, execCxt) ;
     }
-    
+
     // ---- OpExecute factories and plain executor.
     
     private static OpExecutorFactory plainFactory = new OpExecutorPlainFactoryTDB() ;

Modified: jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/solver/SolverLib.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/solver/SolverLib.java?rev=1506692&r1=1506691&r2=1506692&view=diff
==============================================================================
--- jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/solver/SolverLib.java (original)
+++ jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/solver/SolverLib.java Wed Jul 24 20:18:42 2013
@@ -37,6 +37,7 @@ import com.hp.hpl.jena.sparql.engine.Que
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
 import com.hp.hpl.jena.sparql.engine.binding.BindingFactory ;
 import com.hp.hpl.jena.sparql.engine.binding.BindingMap ;
+import com.hp.hpl.jena.sparql.engine.iterator.QueryIterNullIterator ;
 import com.hp.hpl.jena.tdb.TDBException ;
 import com.hp.hpl.jena.tdb.lib.NodeLib ;
 import com.hp.hpl.jena.tdb.nodetable.NodeTable ;
@@ -44,6 +45,7 @@ import com.hp.hpl.jena.tdb.nodetable.Nod
 import com.hp.hpl.jena.tdb.store.DatasetGraphTDB ;
 import com.hp.hpl.jena.tdb.store.GraphTDB ;
 import com.hp.hpl.jena.tdb.store.NodeId ;
+import com.hp.hpl.jena.tdb.sys.TDBInternal ;
 
 /** Utilities used within the TDB BGP solver : local TDB store */
 public class SolverLib
@@ -278,35 +280,55 @@ public class SolverLib
             }
         } ;
     }
+    
+    /** Find whether a specific graph name is in the quads table. */
+    public static QueryIterator testForGraphName(DatasetGraphTDB ds, Node graphNode, QueryIterator input,
+                                                 Filter<Tuple<NodeId>> filter, ExecutionContext execCxt) {
+        NodeId nid = TDBInternal.getNodeId(ds, graphNode) ;
+        boolean exists = !NodeId.isDoesNotExist(nid) ;
+        if ( exists ) {
+            // Node exists but is it used in the quad position?
+            NodeTupleTable ntt = ds.getQuadTable().getNodeTupleTable() ;
+            Iterator<Tuple<NodeId>> iter1 = ntt.find(nid, NodeId.NodeIdAny, NodeId.NodeIdAny, NodeId.NodeIdAny) ;
+            if ( filter != null )
+                iter1 = Iter.filter(iter1, filter) ;
+            exists = iter1.hasNext() ;
+        }
 
-    /** Find all the graph names in the quads table. */ 
-    public static QueryIterator graphNames(DatasetGraphTDB ds, Node graphNode,
-                                           QueryIterator input, Filter<Tuple<NodeId>> filter,
-                                           ExecutionContext execCxt)
-    {
+        if ( exists )
+            return input ;
+        else {
+            input.close() ;
+            return QueryIterNullIterator.create(execCxt) ;
+        }
+    }
+
+    /** Find all the graph names in the quads table. */
+    public static QueryIterator graphNames(DatasetGraphTDB ds, Node graphNode, QueryIterator input,
+                                           Filter<Tuple<NodeId>> filter, ExecutionContext execCxt) {
         List<Abortable> killList = new ArrayList<Abortable>() ;
-        Iterator<Tuple<NodeId>> iter1 = ds.getQuadTable().getNodeTupleTable().find(NodeId.NodeIdAny, NodeId.NodeIdAny, NodeId.NodeIdAny, NodeId.NodeIdAny) ;
+        Iterator<Tuple<NodeId>> iter1 = ds.getQuadTable().getNodeTupleTable().find(NodeId.NodeIdAny, NodeId.NodeIdAny,
+                                                                                   NodeId.NodeIdAny, NodeId.NodeIdAny) ;
         if ( filter != null )
             iter1 = Iter.filter(iter1, filter) ;
-        
+
         Iterator<NodeId> iter2 = Tuple.project(0, iter1) ;
-        // Project is cheap - don't brother wrapping iter1 
+        // Project is cheap - don't brother wrapping iter1
         iter2 = makeAbortable(iter2, killList) ;
-        
+
         Iterator<NodeId> iter3 = Iter.distinct(iter2) ;
         iter3 = makeAbortable(iter3, killList) ;
-        
+
         Iterator<Node> iter4 = NodeLib.nodes(ds.getQuadTable().getNodeTupleTable().getNodeTable(), iter3) ;
-        
+
         final Var var = Var.alloc(graphNode) ;
-        Transform<Node, Binding> bindGraphName = new Transform<Node, Binding>(){
+        Transform<Node, Binding> bindGraphName = new Transform<Node, Binding>() {
             @Override
-            public Binding convert(Node node)
-            {
+            public Binding convert(Node node) {
                 return BindingFactory.binding(var, node) ;
             }
         } ;
-        
+
         Iterator<Binding> iterBinding = Iter.map(iter4, bindGraphName) ;
         // Not abortable.
         return new QueryIterTDB(iterBinding, killList, input, execCxt) ;

Modified: jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/sys/TDBInternal.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/sys/TDBInternal.java?rev=1506692&r1=1506691&r2=1506692&view=diff
==============================================================================
--- jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/sys/TDBInternal.java (original)
+++ jena/trunk/jena-tdb/src/main/java/com/hp/hpl/jena/tdb/sys/TDBInternal.java Wed Jul 24 20:18:42 2013
@@ -49,13 +49,22 @@ public class TDBInternal
     public static NodeId getNodeId(DatasetGraph ds, Node node)
     {
         DatasetGraphTDB dsg = getDatasetGraphTDB(ds) ;
+        return getNodeId(dsg, node) ;
+    }
+    
+    /** Return the NodeId for a node.
+     * Returns NodeId.NodeDoesNotExist when the node is not found. 
+     * Returns null when not a TDB-backed dataset.
+     */
+    public static NodeId getNodeId(DatasetGraphTDB dsg, Node node)
+    {
         if ( dsg == null )
             return null ;
         NodeTable nodeTable = dsg.getQuadTable().getNodeTupleTable().getNodeTable() ;
         NodeId nodeId = nodeTable.getNodeIdForNode(node) ;
         return nodeId ;
     }
-    
+
     /** Return the node for a NodeId (if any).
      *  Returns null if the NodeId does not exist in the dataset. 
      */
@@ -70,6 +79,14 @@ public class TDBInternal
     public static Node getNode(DatasetGraph ds, NodeId nodeId)
     {
         DatasetGraphTDB dsg = getDatasetGraphTDB(ds) ;
+        return getNode(dsg, nodeId) ;
+    }
+
+    /** Return the node for a NodeId (if any).
+     *  Returns null if the NodeId does not exist in the dataset. 
+     */
+    public static Node getNode(DatasetGraphTDB dsg, NodeId nodeId)
+    {
         if ( dsg == null )
             return null ;
         NodeTable nodeTable = dsg.getQuadTable().getNodeTupleTable().getNodeTable() ;

Modified: jena/trunk/jena-tdb/src/test/java/com/hp/hpl/jena/tdb/store/Test_SPARQL_TDB.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-tdb/src/test/java/com/hp/hpl/jena/tdb/store/Test_SPARQL_TDB.java?rev=1506692&r1=1506691&r2=1506692&view=diff
==============================================================================
--- jena/trunk/jena-tdb/src/test/java/com/hp/hpl/jena/tdb/store/Test_SPARQL_TDB.java (original)
+++ jena/trunk/jena-tdb/src/test/java/com/hp/hpl/jena/tdb/store/Test_SPARQL_TDB.java Wed Jul 24 20:18:42 2013
@@ -99,7 +99,7 @@ public class Test_SPARQL_TDB extends Bas
     
     @Test public void sparql4()
     {
-        // Requires OpDatasetNames 
+        // OpDatasetNames 
         Dataset dataset = create() ;
         
         String graphName = "http://example/" ;
@@ -115,6 +115,36 @@ public class Test_SPARQL_TDB extends Bas
         assertEquals(1, n) ;
     }
     
+    @Test public void sparql5()
+    {
+        Dataset dataset = create() ;
+        
+        String graphName = "http://example/" ;
+        Triple triple = SSE.parseTriple("(<x> <y> 123)") ;
+        Graph g2 = dataset.asDatasetGraph().getGraph(NodeFactory.createURI(graphName)) ;
+        // Graphs only exists if they have a triple in them
+        g2.add(triple) ;
+        
+        Query query = QueryFactory.create("ASK { GRAPH <"+graphName+"> {} }") ;
+        boolean b = QueryExecutionFactory.create(query, dataset).execAsk() ;
+        assertEquals(true, b) ;
+    }
+    
+    @Test public void sparql6()
+    {
+        Dataset dataset = create() ;
+        
+        String graphName = "http://example/" ;
+        Triple triple = SSE.parseTriple("(<http://example/x> <http://example/y> 123)") ;
+        Graph g2 = dataset.asDatasetGraph().getGraph(NodeFactory.createURI(graphName)) ;
+        // Graphs only exists if they have a triple in them
+        g2.add(triple) ;
+        
+        Query query = QueryFactory.create("ASK { GRAPH <http://example/x> {} }") ;
+        boolean b = QueryExecutionFactory.create(query, dataset).execAsk() ;
+        assertEquals(false, b) ;
+    }
+
     // Test transactions effective.
     
     @Test public void sparql_txn_1()