You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by rv...@apache.org on 2012/11/09 19:04:19 UTC

svn commit: r1407563 - in /jena/trunk/jena-arq: ReleaseNotes.txt src/main/java/com/hp/hpl/jena/sparql/modify/TemplateLib.java src/main/java/com/hp/hpl/jena/sparql/util/ModelUtils.java src/test/java/com/hp/hpl/jena/sparql/api/TestAPI.java

Author: rvesse
Date: Fri Nov  9 18:04:18 2012
New Revision: 1407563

URL: http://svn.apache.org/viewvc?rev=1407563&view=rev
Log:
Tests and fix for JENA-345, ensures that execConstructTriples() does eliminate malformed triples

Modified:
    jena/trunk/jena-arq/ReleaseNotes.txt
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/TemplateLib.java
    jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/ModelUtils.java
    jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/api/TestAPI.java

Modified: jena/trunk/jena-arq/ReleaseNotes.txt
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/ReleaseNotes.txt?rev=1407563&r1=1407562&r2=1407563&view=diff
==============================================================================
--- jena/trunk/jena-arq/ReleaseNotes.txt (original)
+++ jena/trunk/jena-arq/ReleaseNotes.txt Fri Nov  9 18:04:18 2012
@@ -12,6 +12,7 @@ ChangeLog for ARQ
   Add %-sequences, \char sequences and ':' to local part of prefixed names.
   NB.  The characters 123. are now an integer 123 and a DOT; they were a decimal, and no DOT.  
 + RIOT tokenizing now records the subtokens for language and datatype literals.   
++ JENA-345 : execConstructTriples() now excludes malformed triples (e.g. literal subjects) from it's output
 
 ==== ARQ 2.9.4
 

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/TemplateLib.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/TemplateLib.java?rev=1407563&r1=1407562&r2=1407563&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/TemplateLib.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/modify/TemplateLib.java Fri Nov  9 18:04:18 2012
@@ -29,6 +29,7 @@ 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.binding.Binding ;
+import com.hp.hpl.jena.sparql.util.ModelUtils;
 
 public class TemplateLib
 {
@@ -84,7 +85,7 @@ public class TemplateLib
                 for (Triple triple : triples)
                 {
                     Triple q = subst(triple, b, bNodeMap) ;
-                    if ( ! q.isConcrete() )
+                    if ( ! q.isConcrete() || ! ModelUtils.isValidAsStatement(q.getSubject(), q.getPredicate(), q.getObject()) )
                     {
                         //Log.warn(TemplateLib.class, "Unbound quad: "+FmtUtils.stringForQuad(quad)) ;
                         continue ;

Modified: jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/ModelUtils.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/ModelUtils.java?rev=1407563&r1=1407562&r2=1407563&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/ModelUtils.java (original)
+++ jena/trunk/jena-arq/src/main/java/com/hp/hpl/jena/sparql/util/ModelUtils.java Fri Nov  9 18:04:18 2012
@@ -69,24 +69,34 @@ public class ModelUtils
         Node pNode = t.getPredicate() ;
         Node oNode = t.getObject() ;
         
-        if ( sNode.isLiteral() || sNode.isVariable() )
-            return null ;
+        if (!isValidAsStatement(sNode, pNode, oNode)) return null;
         
-        if ( ! pNode.isURI() )  // Not variable, literal or blank.
-            return null ;
+        return model.asStatement(t) ; 
+    }
+    
+    /**
+     * Determines whether a valid Statement can be formed from the given Subject, Predicate and Object
+     * <p>
+     * This function reflects the fact that the {@link Triple} API is flexible in allowing any Node type in any position (including non-RDF node types like Variable)
+     * and as such not all Triples can be safely converted into Statements
+     * </p>
+     * @param s Subject
+     * @param p Predicate
+     * @param o Object
+     * @return True if a valid Statement can be formed
+     */
+    public static boolean isValidAsStatement(Node s, Node p, Node o)
+    {
+        if ( s.isLiteral() || s.isVariable() )
+            return false ;
+        
+        if ( ! p.isURI() )  // Not variable, literal or blank.
+            return false ;
 
-        if ( oNode.isVariable() )
-            return null ;
+        if ( o.isVariable() )
+            return false ;
         
-        return model.asStatement(t) ; 
-//        RDFNode s = convertGraphNodeToRDFNode(sNode, model) ;
-//        RDFNode p = convertGraphNodeToRDFNode(pNode, model) ;
-//        if ( p instanceof Resource )
-//            p = model.createProperty(((Resource)p).getURI()) ;
-//        RDFNode o = convertGraphNodeToRDFNode(oNode, model) ;
-//        
-//        Statement stmt = model.createStatement((Resource)s, (Property)p, o) ;
-//        return stmt ;
+        return true;
     }
     
     

Modified: jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/api/TestAPI.java
URL: http://svn.apache.org/viewvc/jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/api/TestAPI.java?rev=1407563&r1=1407562&r2=1407563&view=diff
==============================================================================
--- jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/api/TestAPI.java (original)
+++ jena/trunk/jena-arq/src/test/java/com/hp/hpl/jena/sparql/api/TestAPI.java Fri Nov  9 18:04:18 2012
@@ -18,9 +18,12 @@
 
 package com.hp.hpl.jena.sparql.api;
 
+import java.util.Iterator;
+
 import org.junit.Test ;
 import org.openjena.atlas.junit.BaseTest ;
 
+import com.hp.hpl.jena.graph.Triple;
 import com.hp.hpl.jena.query.Query ;
 import com.hp.hpl.jena.query.QueryExecution ;
 import com.hp.hpl.jena.query.QueryExecutionFactory ;
@@ -203,6 +206,33 @@ public class TestAPI extends BaseTest
         qExec.close() ;
     }
     
+    @Test public void testConstructRejectsBadTriples1()
+    {
+        String queryString = "CONSTRUCT { ?s ?p ?o } WHERE { ?o ?p ?s }";
+        Query q = QueryFactory.create(queryString);
+        
+        QueryExecution qExec = QueryExecutionFactory.create(q, m);
+        
+        Model resultModel = qExec.execConstruct();
+        assertEquals(0, resultModel.size());
+    }
+    
+    @Test public void testConstructRejectsBadTriples2()
+    {
+        String queryString = "CONSTRUCT { ?s ?p ?o } WHERE { ?o ?p ?s }";
+        Query q = QueryFactory.create(queryString);
+        
+        QueryExecution qExec = QueryExecutionFactory.create(q, m);
+        
+        Iterator<Triple> ts = qExec.execConstructTriples();
+        long count = 0;
+        while (ts.hasNext()) {
+            count++;
+            ts.next();
+        }
+        assertEquals(0, count);
+    }
+    
     
 //    // Execute a test both with and without regex optimization enabled
 //    // Check the number of results