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 <[email protected]> Authored: Thu Oct 30 12:22:29 2014 +0100 Committer: Sebastian Schaffert <[email protected]> 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); + } } }
