Updated Branches:
  refs/heads/develop 8f79ef1a8 -> 430b45a16

more SPARQL improvements (implemented additional value expressions and tests)


Project: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-marmotta/commit/430b45a1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/tree/430b45a1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-marmotta/diff/430b45a1

Branch: refs/heads/develop
Commit: 430b45a1664e837a3071a77539f238794666950c
Parents: 8f79ef1
Author: Sebastian Schaffert <[email protected]>
Authored: Mon Apr 29 17:12:50 2013 +0200
Committer: Sebastian Schaffert <[email protected]>
Committed: Mon Apr 29 17:12:50 2013 +0200

----------------------------------------------------------------------
 .../evaluation/KiWiEvaluationStrategyImpl.java     |   12 +++-
 .../sparql/persistence/KiWiSparqlConnection.java   |   62 ++++++++++++++-
 .../kiwi/sparql/test/KiWiSparqlJoinTest.java       |   26 ++++++-
 .../marmotta/kiwi/sparql/test/demo-data.foaf       |    1 +
 .../marmotta/kiwi/sparql/test/query10.sparql       |   10 +++
 .../apache/marmotta/kiwi/sparql/test/query5.sparql |    2 +-
 .../apache/marmotta/kiwi/sparql/test/query6.sparql |    2 +-
 .../apache/marmotta/kiwi/sparql/test/query7.sparql |    8 ++
 .../apache/marmotta/kiwi/sparql/test/query8.sparql |    8 ++
 .../apache/marmotta/kiwi/sparql/test/query9.sparql |    8 ++
 10 files changed, 134 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java
 
b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java
index 5e2fda0..9fab185 100644
--- 
a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java
+++ 
b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/evaluation/KiWiEvaluationStrategyImpl.java
@@ -122,7 +122,7 @@ public class KiWiEvaluationStrategyImpl extends 
EvaluationStrategyImpl{
         if(expr instanceof Compare) {
             return isSupported(((Compare) expr).getLeftArg()) && 
isSupported(((Compare) expr).getRightArg());
         } else if(expr instanceof MathExpr) {
-                return isSupported(((MathExpr) expr).getLeftArg()) && 
isSupported(((MathExpr) expr).getRightArg());
+            return isSupported(((MathExpr) expr).getLeftArg()) && 
isSupported(((MathExpr) expr).getRightArg());
         } else if(expr instanceof And) {
             return isSupported(((And) expr).getLeftArg()) && 
isSupported(((And) expr).getRightArg());
         } else if(expr instanceof Or) {
@@ -133,6 +133,16 @@ public class KiWiEvaluationStrategyImpl extends 
EvaluationStrategyImpl{
             return true;
         } else if(expr instanceof Str) {
             return isAtomic(((Str) expr).getArg());
+        } else if(expr instanceof Label) {
+            return isAtomic(((UnaryValueOperator) expr).getArg());
+        } else if(expr instanceof IsResource) {
+            return isAtomic(((UnaryValueOperator) expr).getArg());
+        } else if(expr instanceof IsURI) {
+            return isAtomic(((UnaryValueOperator) expr).getArg());
+        } else if(expr instanceof IsBNode) {
+            return isAtomic(((UnaryValueOperator) expr).getArg());
+        } else if(expr instanceof IsLiteral) {
+            return isAtomic(((UnaryValueOperator) expr).getArg());
         } else if(expr instanceof Lang) {
             return isAtomic(((Lang) expr).getArg());
         } else if(expr instanceof LangMatches) {

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java
 
b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java
index 6a8566c..1bd1227 100644
--- 
a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java
+++ 
b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java
@@ -27,7 +27,9 @@ import org.apache.marmotta.kiwi.persistence.KiWiConnection;
 import org.apache.marmotta.kiwi.persistence.util.ResultSetIteration;
 import org.apache.marmotta.kiwi.persistence.util.ResultTransformerFunction;
 import org.apache.marmotta.kiwi.sail.KiWiValueFactory;
+import org.openrdf.model.BNode;
 import org.openrdf.model.Literal;
+import org.openrdf.model.URI;
 import org.openrdf.model.Value;
 import org.openrdf.query.Binding;
 import org.openrdf.query.BindingSet;
@@ -321,6 +323,14 @@ public class KiWiSparqlConnection {
             } else if(str.getArg() instanceof ValueConstant) {
                 return "'" + ((ValueConstant) 
str.getArg()).getValue().stringValue() + "'";
             }
+        } else if(expr instanceof Label) {
+            Label str = (Label)expr;
+            // get value of argument and express it as string
+            if(str.getArg() instanceof Var) {
+                return queryVariables.get(str.getArg()).get(0) + ".svalue";
+            } else if(str.getArg() instanceof ValueConstant) {
+                return "'" + ((ValueConstant) 
str.getArg()).getValue().stringValue() + "'";
+            }
         } else if(expr instanceof Lang) {
             Lang lang = (Lang)expr;
 
@@ -333,6 +343,12 @@ public class KiWiSparqlConnection {
             OPTypes ot = determineOpType(cmp.getLeftArg(), cmp.getRightArg());
 
             return evaluateExpression(cmp.getLeftArg(),queryVariables, ot) + 
getSQLOperator(cmp.getOperator()) + 
evaluateExpression(cmp.getRightArg(),queryVariables, ot);
+        } else if(expr instanceof MathExpr) {
+            MathExpr cmp = (MathExpr)expr;
+
+            OPTypes ot = determineOpType(cmp.getLeftArg(), cmp.getRightArg());
+
+            return evaluateExpression(cmp.getLeftArg(),queryVariables, ot) + 
getSQLOperator(cmp.getOperator()) + 
evaluateExpression(cmp.getRightArg(),queryVariables, ot);
         } else if(expr instanceof Regex) {
             Regex re = (Regex)expr;
 
@@ -351,6 +367,50 @@ public class KiWiSparqlConnection {
             } else {
                 return "(" + value + " = 
'"+pattern.getValue().stringValue()+"' OR " + 
parent.getDialect().getILike(value, "'" + pattern.getValue().stringValue() + 
"-%' )");
             }
+        } else if(expr instanceof IsResource) {
+            ValueExpr arg = ((UnaryValueOperator)expr).getArg();
+
+            // operator must be a variable or a constant
+            if(arg instanceof ValueConstant) {
+                return Boolean.toString(((ValueConstant) arg).getValue() 
instanceof URI || ((ValueConstant) arg).getValue() instanceof BNode);
+            } else if(arg instanceof Var) {
+                String var = queryVariables.get(arg).get(0);
+
+                return "(" + var + ".ntype = 'uri' OR " + var + ".ntype = 
'bnode')";
+            }
+        } else if(expr instanceof IsURI) {
+            ValueExpr arg = ((UnaryValueOperator)expr).getArg();
+
+            // operator must be a variable or a constant
+            if(arg instanceof ValueConstant) {
+                return Boolean.toString(((ValueConstant) arg).getValue() 
instanceof URI);
+            } else if(arg instanceof Var) {
+                String var = queryVariables.get(arg).get(0);
+
+                return var + ".ntype = 'uri'";
+            }
+        } else if(expr instanceof IsBNode) {
+            ValueExpr arg = ((UnaryValueOperator)expr).getArg();
+
+            // operator must be a variable or a constant
+            if(arg instanceof ValueConstant) {
+                return Boolean.toString(((ValueConstant) arg).getValue() 
instanceof BNode);
+            } else if(arg instanceof Var) {
+                String var = queryVariables.get(arg).get(0);
+
+                return var + ".ntype = 'bnode'";
+            }
+        } else if(expr instanceof IsLiteral) {
+            ValueExpr arg = ((UnaryValueOperator)expr).getArg();
+
+            // operator must be a variable or a constant
+            if(arg instanceof ValueConstant) {
+                return Boolean.toString(((ValueConstant) arg).getValue() 
instanceof Literal);
+            } else if(arg instanceof Var) {
+                String var = queryVariables.get(arg).get(0);
+
+                return "(" + var + ".ntype = 'string' OR " + var + ".ntype = 
'int' OR " + var + ".ntype = 'double'  OR " + var + ".ntype = 'date'  OR " + 
var + ".ntype = 'boolean')";
+            }
         } else if(expr instanceof Var) {
             String var = queryVariables.get(expr).get(0);
 
@@ -362,7 +422,7 @@ public class KiWiSparqlConnection {
                     case INT:    return var + ".ivalue";
                     case DOUBLE: return var + ".dvalue";
                     case DATE:   return var + ".tvalue";
-                    default: throw new IllegalArgumentException("unsupported 
value type: " + optype);
+                    case ANY:    return var + ".id";
                 }
             }
         } else if(expr instanceof ValueConstant) {

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java
 
b/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java
index 59455b8..861c564 100644
--- 
a/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java
+++ 
b/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java
@@ -221,7 +221,7 @@ public class KiWiSparqlJoinTest {
         testQuery("query4.sparql");
     }
 
-    // numeric operator
+    // numeric comparison
     @Test
     public void testQuery5() throws Exception {
         testQuery("query5.sparql");
@@ -233,6 +233,30 @@ public class KiWiSparqlJoinTest {
         testQuery("query6.sparql");
     }
 
+    // math expression
+    @Test
+    public void testQuery7() throws Exception {
+        testQuery("query7.sparql");
+    }
+
+    // isLiteral
+    @Test
+    public void testQuery8() throws Exception {
+        testQuery("query8.sparql");
+    }
+
+    // isURI
+    @Test
+    public void testQuery9() throws Exception {
+        testQuery("query9.sparql");
+    }
+
+    // term comparison
+    @Test
+    public void testQuery10() throws Exception {
+        testQuery("query10.sparql");
+    }
+
 
     private void testQuery(String filename) throws Exception {
         String queryString = 
IOUtils.toString(this.getClass().getResourceAsStream(filename), "UTF-8");

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/demo-data.foaf
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/demo-data.foaf
 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/demo-data.foaf
index bde1322..219c341 100644
--- 
a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/demo-data.foaf
+++ 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/demo-data.foaf
@@ -63,6 +63,7 @@
     <foaf:Person rdf:about="http://localhost:8080/LMF/resource/anna_schmidt"; 
xmlns:foaf="http://xmlns.com/foaf/0.1/";>
         <foaf:name>Anna Schmidt</foaf:name>
         <dc:description xml:lang="en">Anna Schmidt is working as PR manager 
for mountaineers coming from Garmisch-Partenkirchen. She likes mountaineering 
and is also a Linux enthusiast.</dc:description>
+        <foaf:interest>Literal Interest</foaf:interest>
         <foaf:interest 
rdf:resource="http://dbpedia.org/resource/Mountaineering"/>
         <foaf:interest rdf:resource="http://dbpedia.org/resource/Linux"/>
         <foaf:interest rdf:resource="http://localhost:8080/LMF/resource/Chess"; 
/>

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query10.sparql
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query10.sparql
 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query10.sparql
new file mode 100644
index 0000000..ef5158c
--- /dev/null
+++ 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query10.sparql
@@ -0,0 +1,10 @@
+PREFIX foaf: <http://xmlns.com/foaf/0.1/>
+PREFIX dc: <http://purl.org/dc/elements/1.1/>
+
+SELECT ?fn1 ?fn2 WHERE {
+    ?p1 foaf:name ?fn1 .
+    ?p1 foaf:interest ?interest1 .
+    ?p2 foaf:name ?fn2 .
+    ?p2 foaf:interest ?interest2 .
+    FILTER( ?interest1 = ?interest2 )
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query5.sparql
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query5.sparql
 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query5.sparql
index 325bb6b..791b163 100644
--- 
a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query5.sparql
+++ 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query5.sparql
@@ -1,7 +1,7 @@
 PREFIX foaf: <http://xmlns.com/foaf/0.1/>
 PREFIX dc: <http://purl.org/dc/elements/1.1/>
 
-SELECT ?p1 ?fn ?desc ?friend WHERE {
+SELECT ?p1 ?fn ?age WHERE {
     ?p1 foaf:name ?fn .
     ?p1 foaf:age ?age .
     FILTER( ?age > 30 )

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query6.sparql
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query6.sparql
 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query6.sparql
index 1a953df..5f82b49 100644
--- 
a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query6.sparql
+++ 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query6.sparql
@@ -1,7 +1,7 @@
 PREFIX foaf: <http://xmlns.com/foaf/0.1/>
 PREFIX dc: <http://purl.org/dc/elements/1.1/>
 
-SELECT ?p1 ?fn ?desc ?friend WHERE {
+SELECT ?p1 ?fn ?d WHERE {
     ?p1 foaf:name ?fn .
     ?p1 dc:description ?d .
     FILTER( langMatches(lang(?d), "de") )

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query7.sparql
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query7.sparql
 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query7.sparql
new file mode 100644
index 0000000..2fbf3bc
--- /dev/null
+++ 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query7.sparql
@@ -0,0 +1,8 @@
+PREFIX foaf: <http://xmlns.com/foaf/0.1/>
+PREFIX dc: <http://purl.org/dc/elements/1.1/>
+
+SELECT ?p1 ?fn ?age WHERE {
+    ?p1 foaf:name ?fn .
+    ?p1 foaf:age ?age .
+    FILTER( 2013 - ?age > 1983 )
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query8.sparql
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query8.sparql
 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query8.sparql
new file mode 100644
index 0000000..1c94f8f
--- /dev/null
+++ 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query8.sparql
@@ -0,0 +1,8 @@
+PREFIX foaf: <http://xmlns.com/foaf/0.1/>
+PREFIX dc: <http://purl.org/dc/elements/1.1/>
+
+SELECT ?p1 ?fn ?interest WHERE {
+    ?p1 foaf:name ?fn .
+    ?p1 foaf:interest ?interest .
+    FILTER( isLiteral(?interest) )
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/430b45a1/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query9.sparql
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query9.sparql
 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query9.sparql
new file mode 100644
index 0000000..a14fded
--- /dev/null
+++ 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query9.sparql
@@ -0,0 +1,8 @@
+PREFIX foaf: <http://xmlns.com/foaf/0.1/>
+PREFIX dc: <http://purl.org/dc/elements/1.1/>
+
+SELECT ?p1 ?fn ?interest WHERE {
+    ?p1 foaf:name ?fn .
+    ?p1 foaf:interest ?interest .
+    FILTER( isURI(?interest) )
+}
\ No newline at end of file

Reply via email to