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

Reply via email to