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 <[email protected]> Authored: Wed Nov 5 15:04:56 2014 +0100 Committer: Sebastian Schaffert <[email protected]> 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);
