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);