Repository: marmotta Updated Branches: refs/heads/develop 713669d1b -> d63fbaedf
SPARQL: - avoid joins with nodes table for expressions where the value is not needed Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/d63fbaed Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/d63fbaed Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/d63fbaed Branch: refs/heads/develop Commit: d63fbaedf27dc94fc2d3a551e67cdf219254b80e Parents: 713669d Author: Sebastian Schaffert <[email protected]> Authored: Thu Nov 6 19:08:55 2014 +0100 Committer: Sebastian Schaffert <[email protected]> Committed: Thu Nov 6 19:09:05 2014 +0100 ---------------------------------------------------------------------- .../kiwi/sparql/builder/SQLBuilder.java | 64 +++---- .../sparql/builder/collect/ConditionFinder.java | 169 ++++++++++++++++++- .../builder/eval/ExpressionEvaluator.java | 9 +- 3 files changed, 197 insertions(+), 45 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/marmotta/blob/d63fbaed/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 6915aaf..ea2ae56 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 @@ -290,38 +290,6 @@ public class SQLBuilder { - // add all extensions to the variable list so they are properly considered in projections and clauses - // TODO: order by variable dependency, or otherwise the evaluateExpression might fail - for(ExtensionElem ext : extensions) { - Var v = new Var(ext.getName()); - - SQLVariable sv = variables.get(v.getName()); - if(!variables.containsKey(v.getName())) { - sv = new SQLVariable("V" + (++variableCount), v.getName()); - - // select those variables that are really projected and not only needed in a grouping construct - if(projectedVars.contains(sv.getSparqlName()) || new SQLProjectionFinder(query,v.getName()).found) { - sv.setProjectionType(getProjectionType(ext.getExpr())); - } - - // Functions that return a string literal do so with the string literal of the same kind as the first - // argument (simple literal, plain literal with same language tag, xsd:string). - sv.setLiteralTypeExpression(getLiteralTypeExpression(ext.getExpr())); - sv.setLiteralLangExpression(getLiteralLangExpression(ext.getExpr())); - - addVariable(sv); - } - - // TODO: ANY as OPType here is dangerous, because the OPType should depends on projection and actual use - // of variables in conditions etc - if (new ConditionFinder(v.getName(), query).found) { - //sv.getAliases().add(evaluateExpression(ext.getExpr(), OPTypes.VALUE)); - sv.getBindings().add(ext.getExpr()); - } - - sv.getExpressions().add(evaluateExpression(ext.getExpr(), OPTypes.ANY)); - - } // calculate for each variable the SQL expressions representing them and any necessary JOIN conditions @@ -365,6 +333,38 @@ public class SQLBuilder { } } + // add all extensions to the variable list so they are properly considered in projections and clauses + // TODO: order by variable dependency, or otherwise the evaluateExpression might fail + for(ExtensionElem ext : extensions) { + Var v = new Var(ext.getName()); + + SQLVariable sv = variables.get(v.getName()); + if(!variables.containsKey(v.getName())) { + sv = new SQLVariable("V" + (++variableCount), v.getName()); + + // select those variables that are really projected and not only needed in a grouping construct + if(projectedVars.contains(sv.getSparqlName()) || new SQLProjectionFinder(query,v.getName()).found) { + sv.setProjectionType(getProjectionType(ext.getExpr())); + } + + // Functions that return a string literal do so with the string literal of the same kind as the first + // argument (simple literal, plain literal with same language tag, xsd:string). + sv.setLiteralTypeExpression(getLiteralTypeExpression(ext.getExpr())); + sv.setLiteralLangExpression(getLiteralLangExpression(ext.getExpr())); + + addVariable(sv); + } + + // TODO: ANY as OPType here is dangerous, because the OPType should depends on projection and actual use + // of variables in conditions etc + if (new ConditionFinder(v.getName(), query).found) { + //sv.getAliases().add(evaluateExpression(ext.getExpr(), OPTypes.VALUE)); + sv.getBindings().add(ext.getExpr()); + } + + sv.getExpressions().add(evaluateExpression(ext.getExpr(), OPTypes.ANY)); + + } // find context restrictions of patterns and match them with potential restrictions given in the http://git-wip-us.apache.org/repos/asf/marmotta/blob/d63fbaed/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/collect/ConditionFinder.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/collect/ConditionFinder.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/collect/ConditionFinder.java index b2aef1d..9f1f944 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/collect/ConditionFinder.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/collect/ConditionFinder.java @@ -30,6 +30,7 @@ public class ConditionFinder extends QueryModelVisitorBase<RuntimeException> { public boolean found = false; private String varName; + private boolean valueNeeded = false; // indicate if the value of the node is actually needed or the id is sufficient public ConditionFinder(String varName, TupleExpr expr) { this.varName = varName; @@ -37,15 +38,9 @@ public class ConditionFinder extends QueryModelVisitorBase<RuntimeException> { expr.visit(this); } - public ConditionFinder(String varName, ValueExpr expr) { - this.varName = varName; - - expr.visit(this); - } - @Override public void meet(Var node) throws RuntimeException { - if(!found) { + if(valueNeeded && !found) { found = node.getName().equals(varName); } } @@ -75,4 +70,164 @@ public class ConditionFinder extends QueryModelVisitorBase<RuntimeException> { public void meet(Projection node) throws RuntimeException { // stop, subquery } + + + // the following constructs all need the value, so set the flag + + @Override + public void meet(Avg node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(BNodeGenerator node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(Compare node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(Datatype node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(IRIFunction node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(IsBNode node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(IsLiteral node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(IsNumeric node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(IsResource node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(IsURI node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(Label node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(Lang node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(LangMatches node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(Like node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(MathExpr node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(LocalName node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(Max node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(Min node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(Namespace node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(Regex node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(SameTerm node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(Str node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(Sum node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(FunctionCall node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(OrderElem node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + + @Override + public void meet(GroupElem node) throws RuntimeException { + valueNeeded = true; + super.meet(node); + } + } http://git-wip-us.apache.org/repos/asf/marmotta/blob/d63fbaed/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/eval/ExpressionEvaluator.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/eval/ExpressionEvaluator.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/eval/ExpressionEvaluator.java index 8eb2e46..04f75ae 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/eval/ExpressionEvaluator.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/eval/ExpressionEvaluator.java @@ -540,17 +540,14 @@ public class ExpressionEvaluator extends QueryModelVisitorBase<RuntimeException> builder.append(var).append(".svalue"); break; case TERM: - if(var == null) { - // might happen in case the variable has been bound to a constant value and not - // joined in a pattern query + case ANY: + if(sv.getExpressions().size() > 0) { + // this allows us to avoid joins with the nodes table for simple expressions that only need the ID builder.append(sv.getExpressions().get(0)); } else { builder.append(var).append(".id"); } break; - case ANY: - builder.append(var).append(".id"); - break; } } }
