You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by ss...@apache.org on 2014/11/05 15:04:19 UTC

git commit: SPARQL: - implementation of SingletonSet

Repository: marmotta
Updated Branches:
  refs/heads/develop 048994403 -> dd40a4b81


SPARQL:
- implementation of SingletonSet


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

Branch: refs/heads/develop
Commit: dd40a4b810f88f0294739756c03eff6d7a950f46
Parents: 0489944
Author: Sebastian Schaffert <ss...@apache.org>
Authored: Wed Nov 5 15:04:56 2014 +0100
Committer: Sebastian Schaffert <ss...@apache.org>
Committed: Wed Nov 5 15:04:56 2014 +0100

----------------------------------------------------------------------
 .../kiwi/sparql/builder/SQLBuilder.java         | 20 ++++--
 .../kiwi/sparql/builder/SQLFragment.java        | 76 +++++++++++---------
 .../evaluation/KiWiEvaluationStrategyImpl.java  |  2 +
 .../sparql/sail/KiWiSparqlSailConnection.java   |  2 +-
 4 files changed, 59 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/dd40a4b8/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLBuilder.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLBuilder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLBuilder.java
index 46f601c..8ffd094 100644
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLBuilder.java
+++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLBuilder.java
@@ -803,8 +803,16 @@ public class SQLBuilder {
         } else if(expr instanceof IRIFunction) {
             IRIFunction str = (IRIFunction)expr;
 
-            // get value of argument and express it as string
-            return evaluateExpression(str.getArg(), OPTypes.STRING);
+            if(str.getBaseURI() != null) {
+                String ex = evaluateExpression(str.getArg(), OPTypes.STRING);
+
+                return "CASE WHEN position(':' IN " + ex +") > 0 THEN " + ex + " ELSE " +
+                    NativeFunctionRegistry.getInstance().get(FN.CONCAT.stringValue()).getNative(dialect,"'"+str.getBaseURI()+"'", ex) +
+                        " END ";
+            } else {
+                // get value of argument and express it as string
+                return evaluateExpression(str.getArg(), OPTypes.STRING);
+            }
         } else if(expr instanceof Lang) {
             Lang lang = (Lang)expr;
 
@@ -1315,9 +1323,11 @@ public class SQLBuilder {
 
 
         StringBuilder queryString = new StringBuilder();
-        queryString
-                .append("SELECT ").append(selectClause).append("\n ")
-                .append("FROM ").append(fromClause).append("\n ");
+        queryString.append("SELECT ").append(selectClause).append("\n ");
+
+        if(fromClause.length() > 0) {
+            queryString.append("FROM ").append(fromClause).append("\n ");
+        }
 
         if(whereClause.length() > 0) {
             queryString.append("WHERE ").append(whereClause).append("\n ");

http://git-wip-us.apache.org/repos/asf/marmotta/blob/dd40a4b8/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLFragment.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLFragment.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLFragment.java
index b2d1fac..58350f6 100644
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLFragment.java
+++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLFragment.java
@@ -23,6 +23,7 @@ import org.openrdf.query.algebra.ValueExpr;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Random;
 
 /**
  * An SQL fragment is a part of the SQL query where all patterns are joinedwith  INNER JOINS and not LEFT JOINS. Several
@@ -41,6 +42,7 @@ public class SQLFragment extends SQLClause {
         JOIN, WHERE, HAVING
     };
 
+    private static Random singletonSetGenerator = new Random();
 
     /**
      * The patterns contained in this fragment. All patterns are joined using an INNER JOIN.
@@ -92,57 +94,61 @@ public class SQLFragment extends SQLClause {
     public String buildFromClause() {
         StringBuilder fromClause = new StringBuilder();
 
-        for (Iterator<SQLClause> it = Iterators.concat(patterns.iterator(), subqueries.iterator()); it.hasNext(); ) {
+        if(patterns.size() > 0 || subqueries.size() > 0) {
+            for (Iterator<SQLClause> it = Iterators.concat(patterns.iterator(), subqueries.iterator()); it.hasNext(); ) {
 
-            SQLClause p = it.next();
+                SQLClause p = it.next();
 
 
-            StringBuilder conditionClause = new StringBuilder();
+                StringBuilder conditionClause = new StringBuilder();
 
-            // in case we add the condition to the JOIN, build first the conditions for the pattern; otherwise, the
-            // conditions for the pattern will be added to the WHERE clause
-            if(conditionPosition == ConditionPosition.JOIN) {
-                conditionClause.append(p.buildConditionClause());
-            }
+                // in case we add the condition to the JOIN, build first the conditions for the pattern; otherwise, the
+                // conditions for the pattern will be added to the WHERE clause
+                if (conditionPosition == ConditionPosition.JOIN) {
+                    conditionClause.append(p.buildConditionClause());
+                }
 
 
-            // in case the pattern is the last of the fragment, also add the filter conditions of the fragment (TODO: verify this does indeed the right thing)
-            if(conditionPosition == ConditionPosition.JOIN && !it.hasNext()) {
-                // if this is the last pattern of the fragment, add the filter conditions
-                for(Iterator<String> cit = getConditions().iterator(); cit.hasNext(); ) {
-                    String next = cit.next();
-                    if(conditionClause.length() > 0 && next.length() > 0) {
-                        conditionClause.append("\n       AND ");
+                // in case the pattern is the last of the fragment, also add the filter conditions of the fragment (TODO: verify this does indeed the right thing)
+                if (conditionPosition == ConditionPosition.JOIN && !it.hasNext()) {
+                    // if this is the last pattern of the fragment, add the filter conditions
+                    for (Iterator<String> cit = getConditions().iterator(); cit.hasNext(); ) {
+                        String next = cit.next();
+                        if (conditionClause.length() > 0 && next.length() > 0) {
+                            conditionClause.append("\n       AND ");
+                        }
+                        conditionClause.append(next);
                     }
-                    conditionClause.append(next);
                 }
-            }
 
 
-            // when the pattern builds a join with the nodes table and we have fragment-wide conditions, we need to
-            // wrap the pattern's from clause in parentheses
-            if(conditionClause.length() > 0) {
-                if(p.needsParentheses())
-                    fromClause.append("(");
-                fromClause.append(p.buildFromClause());
-                if(p.needsParentheses())
+                // when the pattern builds a join with the nodes table and we have fragment-wide conditions, we need to
+                // wrap the pattern's from clause in parentheses
+                if (conditionClause.length() > 0) {
+                    if (p.needsParentheses())
+                        fromClause.append("(");
+                    fromClause.append(p.buildFromClause());
+                    if (p.needsParentheses())
+                        fromClause.append(")");
+                    fromClause.append(" ON (");
+                    fromClause.append(conditionClause);
                     fromClause.append(")");
-                fromClause.append(" ON (");
-                fromClause.append(conditionClause);
-                fromClause.append(")");
 
-            } else {
-                fromClause.append(p.buildFromClause());
-            }
+                } else {
+                    fromClause.append(p.buildFromClause());
+                }
 
 
-            if (it.hasNext()) {
-                if(conditionPosition == ConditionPosition.JOIN) {
-                    fromClause.append("\n JOIN \n  ");
-                } else {
-                    fromClause.append("\n CROSS JOIN \n  ");
+                if (it.hasNext()) {
+                    if (conditionPosition == ConditionPosition.JOIN) {
+                        fromClause.append("\n JOIN \n  ");
+                    } else {
+                        fromClause.append("\n CROSS JOIN \n  ");
+                    }
                 }
             }
+        } else {
+            fromClause.append("(SELECT true) AS _EMPTY"+singletonSetGenerator.nextInt(1000));
         }
 
         return fromClause.toString();

http://git-wip-us.apache.org/repos/asf/marmotta/blob/dd40a4b8/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 9737463..b21b2ab 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
@@ -279,6 +279,8 @@ public class KiWiEvaluationStrategyImpl extends EvaluationStrategyImpl{
                 }
             }
             return isSupported(((Group) expr).getArg());
+        } else if(expr instanceof SingletonSet) {
+            return true;
         } else {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/marmotta/blob/dd40a4b8/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java
index 74ddb8d..1006ebb 100644
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java
+++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java
@@ -73,7 +73,7 @@ public class KiWiSparqlSailConnection extends NotifyingSailConnectionWrapper {
             EvaluationStrategy strategy = new KiWiEvaluationStrategyImpl(tripleSource, dataset, connection);
 
             new BindingAssigner().optimize(tupleExpr, dataset, bindings);
-            new ConstantOptimizer(strategy).optimize(tupleExpr, dataset, bindings);
+            //new ConstantOptimizer(strategy).optimize(tupleExpr, dataset, bindings);
             new CompareOptimizer().optimize(tupleExpr, dataset, bindings);
             new ConjunctiveConstraintSplitter().optimize(tupleExpr, dataset, bindings);