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 2012/01/31 18:47:31 UTC

svn commit: r1238712 - in /incubator/jena/Jena2/ARQ/trunk: src/main/java/com/hp/hpl/jena/sparql/core/ src/main/java/com/hp/hpl/jena/sparql/modify/ src/test/java/com/hp/hpl/jena/sparql/modify/ testing/Update/

Author: andy
Date: Tue Jan 31 17:47:30 2012
New Revision: 1238712

URL: http://svn.apache.org/viewvc?rev=1238712&view=rev
Log:
Fix for adding illegal triples via SPARQl Update.

Added:
    incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-1.ru
    incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-2.ru
    incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-3.ru
Modified:
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/core/Quad.java
    incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/UpdateEngineWorker.java
    incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateGraph.java

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/core/Quad.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/core/Quad.java?rev=1238712&r1=1238711&r2=1238712&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/core/Quad.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/core/Quad.java Tue Jan 31 17:47:30 2012
@@ -148,6 +148,29 @@ public class Quad
     /** Is it really a triple? */  
     public boolean isTriple()               { return equal(graph, tripleInQuad) ; } 
 
+    /** Is this quad a legal data quad (legal data triple, IRI for graph) */   
+    public boolean isLegalAsData()
+    {
+        Node sNode = getSubject() ;
+        Node pNode = getPredicate() ;
+        Node oNode = getObject() ;
+        Node gNode = getGraph() ;
+        
+        if ( sNode.isLiteral() || sNode.isVariable() )
+            return false ;
+        
+        if ( ! pNode.isURI() )  // Not variable, literal or blank.
+            return false ;
+
+        if ( oNode.isVariable() )
+            return false ;
+        
+        if ( gNode != null && ! gNode.isURI() )
+            return false ;
+        
+        return true ;
+    }
+    
     @Override
     public int hashCode() 
     { 
@@ -162,6 +185,8 @@ public class Quad
         return x ;
     }
     
+    
+    
     @Override
     public boolean equals(Object other) 
     { 

Modified: incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/UpdateEngineWorker.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/UpdateEngineWorker.java?rev=1238712&r1=1238711&r2=1238712&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/UpdateEngineWorker.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/main/java/com/hp/hpl/jena/sparql/modify/UpdateEngineWorker.java Tue Jan 31 17:47:30 2012
@@ -278,14 +278,14 @@ public class UpdateEngineWorker implemen
     public void visit(UpdateDataInsert update)
     {
         for ( Quad quad : update.getQuads() )
-            graphStore.add(quad) ;
+            addToGraphStore(graphStore, quad) ;
     }
 
     @Override
     public void visit(UpdateDataDelete update)
     {
         for ( Quad quad : update.getQuads() )
-            graphStore.delete(quad) ;
+            deleteFromGraphStore(graphStore, quad) ;
     }
 
     @Override
@@ -368,10 +368,6 @@ public class UpdateEngineWorker implemen
         if ( update.getUsing().size() == 0 && update.getUsingNamed().size() == 0 )
             return null ;
         
-//        if ( update.getUsing().size() > 0 || update.getUsingNamed().size() > 0 )
-//            Log.warn(this, "Graph selection from the dataset not supported very well") ;
-//        //return null ;
-        
         DatasetGraphMap dsg = new DatasetGraphMap(graphStore) ;
         if ( update.getUsing().size() > 0  )
         {
@@ -476,9 +472,24 @@ public class UpdateEngineWorker implemen
         while (it.hasNext())
         {
             Quad q = it.next();
-            graphStore.add(q);
+            addToGraphStore(graphStore, q);
         }
     }
+    
+    // Catch all individual adds of quads (and deletes - mainly for symmetry). 
+    private static void addToGraphStore(GraphStore graphStore, Quad quad) 
+    {
+        // Check legal triple.
+        if ( quad.isLegalAsData() )
+            graphStore.add(quad);
+        // Else drop.
+        //Log.warn(UpdateEngineWorker.class, "Bad quad as data: "+quad) ;
+    }
+
+    private static void deleteFromGraphStore(GraphStore graphStore, Quad quad)
+    {
+        graphStore.delete(quad) ;
+    }
 
     protected Query elementToQuery(Element pattern)
     {

Modified: incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateGraph.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateGraph.java?rev=1238712&r1=1238711&r2=1238712&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateGraph.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/test/java/com/hp/hpl/jena/sparql/modify/TestUpdateGraph.java Tue Jan 31 17:47:30 2012
@@ -20,6 +20,7 @@ package com.hp.hpl.jena.sparql.modify;
 
 
 import org.junit.Test ;
+import org.openjena.atlas.iterator.Iter ;
 
 import com.hp.hpl.jena.graph.Factory ;
 import com.hp.hpl.jena.graph.Graph ;
@@ -27,28 +28,17 @@ import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.graph.Triple ;
 import com.hp.hpl.jena.query.ARQ ;
 import com.hp.hpl.jena.query.QueryFactory ;
+import com.hp.hpl.jena.sparql.core.DatasetGraph ;
 import com.hp.hpl.jena.sparql.core.Quad ;
 import com.hp.hpl.jena.sparql.core.Var ;
 import com.hp.hpl.jena.sparql.engine.binding.Binding ;
 import com.hp.hpl.jena.sparql.engine.binding.BindingFactory ;
 import com.hp.hpl.jena.sparql.graph.GraphFactory ;
-import com.hp.hpl.jena.sparql.modify.request.QuadAcc ;
-import com.hp.hpl.jena.sparql.modify.request.QuadDataAcc ;
-import com.hp.hpl.jena.sparql.modify.request.Target ;
-import com.hp.hpl.jena.sparql.modify.request.UpdateCopy ;
-import com.hp.hpl.jena.sparql.modify.request.UpdateDataDelete ;
-import com.hp.hpl.jena.sparql.modify.request.UpdateDataInsert ;
-import com.hp.hpl.jena.sparql.modify.request.UpdateDeleteWhere ;
-import com.hp.hpl.jena.sparql.modify.request.UpdateModify ;
+import com.hp.hpl.jena.sparql.modify.request.* ;
 import com.hp.hpl.jena.sparql.sse.SSE ;
 import com.hp.hpl.jena.sparql.syntax.Element ;
 import com.hp.hpl.jena.sparql.util.NodeFactory ;
-import com.hp.hpl.jena.update.GraphStore ;
-import com.hp.hpl.jena.update.UpdateAction ;
-import com.hp.hpl.jena.update.UpdateExecutionFactory ;
-import com.hp.hpl.jena.update.UpdateFactory ;
-import com.hp.hpl.jena.update.UpdateProcessor ;
-import com.hp.hpl.jena.update.UpdateRequest ;
+import com.hp.hpl.jena.update.* ;
 
 public abstract class TestUpdateGraph extends TestUpdateBase
 {
@@ -344,52 +334,66 @@ public abstract class TestUpdateGraph ex
                                  new Triple(s,p,o2))) ;
     }
     
+    @Test public void testUpdateBad1()      { testBad("bad-1.ru", 1) ; }
+    @Test public void testUpdateBad2()      { testBad("bad-2.ru", 1) ; }
+    @Test public void testUpdateBad3()      { testBad("bad-3.ru", 0) ; }
+
+    private void testBad(String file, int expectedSize)
+    {
+        GraphStore gStore = getEmptyGraphStore() ;
+        script(gStore, file) ;
+        assertEquals(expectedSize, countQuads(gStore)) ;
+    }
+    
+    private static long countQuads(DatasetGraph dsg) { return Iter.count(dsg.find()); }
+
+    
+    private Graph testUpdateInitialBindingWorker(Var v, Node n)
+    {
+        GraphStore gStore = getEmptyGraphStore() ;
+        
+        UpdateRequest req = UpdateFactory.create() ;
+
+        {
+            QuadDataAcc acc = new QuadDataAcc() ;
+            acc.addTriple(triple1) ;
+            acc.addTriple(triple2) ;
+            UpdateDataInsert ins = new UpdateDataInsert(acc) ;
+            req.add(ins) ;
+        }
+        {
+            UpdateModify mod = new UpdateModify() ;
+            mod.getDeleteAcc().addTriple(new Triple(s,p, Var.alloc("o"))) ;
+            req.add(mod) ;
+        }
+        Binding b = BindingFactory.binding(null, v, n) ;
+        UpdateAction.execute(req, gStore, b) ;
+        
+        return gStore.getDefaultGraph() ;
+    }
+    
+    @Test public void testUpdateInitialBinding1()
+    {
+        Graph graph = testUpdateInitialBindingWorker(Var.alloc("o"), o1) ;
+        assertEquals(graph.size(), 1) ;
+        assertFalse(graphContains(graph, triple1)) ;
+        assertTrue(graphContains(graph, triple2)) ;
+    }
     
-//    private Graph testUpdateInitialBindingWorker(Var v, Node n)
-//    {
-//        GraphStore gStore = getEmptyGraphStore() ;
-//        UpdateRequest req = UpdateFactory.create() ;
-//
-//        UpdateInsert ins = new UpdateInsert() ;
-//        TemplateGroup template = new TemplateGroup() ;
-//        template.addTriple(triple1) ;
-//        template.addTriple(triple2) ;
-//        ins.setInsertTemplate(template) ;
-//        req.add(ins) ;
-//
-//        UpdateDelete delete = new UpdateDelete() ;
-//        delete.setPattern("{ ?s <http://example/p> ?o } ") ;
-//        delete.setDeleteTemplate("{ ?s <http://example/p> ?o}") ;
-//        req.add(delete) ;
-//        
-//        Binding b = BindingFactory.binding(null, v, n) ;
-//        UpdateAction.execute(req, gStore, b) ;
-//        
-//        return gStore.getDefaultGraph() ;
-//    }
-//    
-//    @Test public void testUpdateInitialBinding1()
-//    {
-//        Graph graph = testUpdateInitialBindingWorker(Var.alloc("o"), o1) ;
-//        assertEquals(graph.size(), 1) ;
-//        assertFalse(graphContains(graph, triple1)) ;
-//        assertTrue(graphContains(graph, triple2)) ;
-//    }
-//    
-//    @Test public void testUpdateInitialBinding2()
-//    {
-//        Graph graph = testUpdateInitialBindingWorker(Var.alloc("o"), o2) ;
-//        assertEquals(graph.size(), 1) ;
-//        assertTrue(graphContains(graph, triple1)) ;
-//        assertFalse(graphContains(graph, triple2)) ;
-//    }
-//
-//    @Test public void testUpdateInitialBinding3()
-//    {
-//        // Does not affect the delete
-//        Graph graph = testUpdateInitialBindingWorker(Var.alloc("FF"), o1) ;
-//        assertTrue(graphEmpty(graph)) ;
-//    }
+    @Test public void testUpdateInitialBinding2()
+    {
+        Graph graph = testUpdateInitialBindingWorker(Var.alloc("o"), o2) ;
+        assertEquals(graph.size(), 1) ;
+        assertTrue(graphContains(graph, triple1)) ;
+        assertFalse(graphContains(graph, triple2)) ;
+    }
+
+    @Test public void testUpdateInitialBinding3()
+    {
+        // Does not affect the delete
+        Graph graph = testUpdateInitialBindingWorker(Var.alloc("FF"), o1) ;
+        assertEquals(2, graph.size()) ;
+    }
     
     @Test public void testUpdateInitialBinding4()
     {

Added: incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-1.ru
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-1.ru?rev=1238712&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-1.ru (added)
+++ incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-1.ru Tue Jan 31 17:47:30 2012
@@ -0,0 +1,5 @@
+BASE <http://example/> 
+
+INSERT DATA { "s" <p> <o>
+               GRAPH <g> { "S" <P> <O> . <X> <Y> <Z> }
+            } ;

Added: incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-2.ru
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-2.ru?rev=1238712&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-2.ru (added)
+++ incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-2.ru Tue Jan 31 17:47:30 2012
@@ -0,0 +1,8 @@
+BASE <http://example/> 
+
+INSERT { ?o <p> <s> .
+         <s> <p> ?o 
+} 
+WHERE 
+{ BIND("object" AS ?o) }
+

Added: incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-3.ru
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-3.ru?rev=1238712&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-3.ru (added)
+++ incubator/jena/Jena2/ARQ/trunk/testing/Update/bad-3.ru Tue Jan 31 17:47:30 2012
@@ -0,0 +1,4 @@
+BASE <http://example/> 
+
+INSERT { GRAPH ?g { <s> <p> <o> .  <s> <p> "obj" } } WHERE { BIND("g" AS ?g) }
+