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/10/30 12:21:53 UTC

git commit: fix complex subselects

Repository: marmotta
Updated Branches:
  refs/heads/develop 71d5dd167 -> 4daf7bdf7


fix complex subselects


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

Branch: refs/heads/develop
Commit: 4daf7bdf7eb8a61cfbfa5f8463269fc8523843e7
Parents: 71d5dd1
Author: Sebastian Schaffert <ss...@apache.org>
Authored: Thu Oct 30 12:22:29 2014 +0100
Committer: Sebastian Schaffert <ss...@apache.org>
Committed: Thu Oct 30 12:22:29 2014 +0100

----------------------------------------------------------------------
 .../kiwi/sparql/builder/SQLBuilder.java         | 20 ++++++++++++++------
 .../kiwi/sparql/builder/SQLFragment.java        |  5 ++++-
 .../kiwi/sparql/builder/SQLSubQuery.java        |  4 +++-
 3 files changed, 21 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/4daf7bdf/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 41fc13e..8087a16 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
@@ -487,8 +487,8 @@ public class SQLBuilder {
                 // the conditions of the first fragment need to be placed in the WHERE part of the query, because
                 // there is not necessarily a JOIN ... ON where we can put it
                 f.setConditionPosition(SQLFragment.ConditionPosition.WHERE);
-                first = false;
             }
+            first = false;
 
             for (SQLPattern p : f.getPatterns()) {
                 for(Map.Entry<SQLPattern.TripleColumns, Var> fieldEntry : p.getTripleFields().entrySet()) {
@@ -584,7 +584,7 @@ public class SQLBuilder {
         // 1. for the first pattern of the first fragment, we add the conditions to the WHERE clause
 
         for(SQLFragment fragment : fragments) {
-            if(fragment.getConditionPosition() == SQLFragment.ConditionPosition.WHERE) {
+            if(fragment.getConditionPosition() != SQLFragment.ConditionPosition.JOIN) {
                 whereConditions.add(fragment.buildConditionClause());
             }
         }
@@ -627,20 +627,28 @@ public class SQLBuilder {
     private StringBuilder buildHavingClause()  {
 
         // list of where conditions that will later be connected by AND
-        List<String> havingConditions = new LinkedList<String>();
+        List<CharSequence> havingConditions = new LinkedList<CharSequence>();
 
         // 1. for the first pattern of the first fragment, we add the conditions to the WHERE clause
 
         for(SQLFragment fragment : fragments) {
             if(fragment.getConditionPosition() == SQLFragment.ConditionPosition.HAVING) {
-                havingConditions.add(fragment.buildConditionClause());
+                StringBuilder conditionClause = new StringBuilder();
+                for(Iterator<String> cit = fragment.getConditions().iterator(); cit.hasNext(); ) {
+                    if(conditionClause.length() > 0) {
+                        conditionClause.append("\n       AND ");
+                    }
+                    conditionClause.append(cit.next());
+                }
+
+                havingConditions.add(conditionClause);
             }
         }
 
         // construct the having clause
         StringBuilder havingClause = new StringBuilder();
-        for(Iterator<String> it = havingConditions.iterator(); it.hasNext(); ) {
-            String condition = it.next();
+        for(Iterator<CharSequence> it = havingConditions.iterator(); it.hasNext(); ) {
+            CharSequence condition = it.next();
             if(condition.length() > 0) {
                 havingClause.append(condition);
                 havingClause.append("\n ");

http://git-wip-us.apache.org/repos/asf/marmotta/blob/4daf7bdf/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 155339b..552f08b 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
@@ -151,6 +151,7 @@ public class SQLFragment extends SQLClause {
      * Build the combined condition clause for this fragment. This will be the empty string when the conditionPosition is JOIN.
      * @return
      */
+    @Override
     public String buildConditionClause() {
         StringBuilder conditionClause = new StringBuilder();
 
@@ -160,13 +161,15 @@ public class SQLFragment extends SQLClause {
 
                 // 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(conditionClause.length() > 0) {
+                if (conditionClause.length() > 0) {
                     conditionClause.append("\n       AND ");
                 }
                 conditionClause.append(p.buildConditionClause());
 
             }
+        }
 
+        if(conditionPosition == ConditionPosition.WHERE) {
             // in case the pattern is the last of the fragment, also add the filter conditions of the fragment
             // if this is the last pattern of the fragment, add the filter conditions
             for(Iterator<String> cit = getConditions().iterator(); cit.hasNext(); ) {

http://git-wip-us.apache.org/repos/asf/marmotta/blob/4daf7bdf/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLSubQuery.java
----------------------------------------------------------------------
diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLSubQuery.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLSubQuery.java
index d2bb74a..08acda5 100644
--- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLSubQuery.java
+++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLSubQuery.java
@@ -54,7 +54,9 @@ public class SQLSubQuery extends SQLAbstractSubquery {
         builder = new SQLBuilder(query.getArg(), bindings, dataset, converter, dialect, projectedVars);
 
         for(SQLVariable svl : builder.getVariables().values()) {
-            variables.add(svl);
+            if(projectedVars.contains(svl.getSparqlName())) {
+                variables.add(svl);
+            }
         }
     }