Repository: marmotta Updated Branches: refs/heads/develop 4b41f6f92 -> f1e457b77
internal test case with complex query now running Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/f1e457b7 Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/f1e457b7 Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/f1e457b7 Branch: refs/heads/develop Commit: f1e457b778410f2c787ec603b476c9014a3e88f9 Parents: 4b41f6f Author: Sebastian Schaffert <[email protected]> Authored: Thu Sep 18 15:08:34 2014 +0200 Committer: Sebastian Schaffert <[email protected]> Committed: Thu Sep 18 15:08:34 2014 +0200 ---------------------------------------------------------------------- .../sparql/builder/SQLAbstractSubquery.java | 21 ++++++++++++++++++++ .../kiwi/sparql/builder/SQLBuilder.java | 9 +++++++++ .../kiwi/sparql/builder/SQLSubQuery.java | 2 +- .../marmotta/kiwi/sparql/builder/SQLUnion.java | 2 +- 4 files changed, 32 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/marmotta/blob/f1e457b7/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLAbstractSubquery.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLAbstractSubquery.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLAbstractSubquery.java index a0857ad..e57eeed 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLAbstractSubquery.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLAbstractSubquery.java @@ -52,6 +52,27 @@ public abstract class SQLAbstractSubquery extends SQLClause { } /** + * Return true when the pattern involves JOINs with the NODES table; in this case we need to enclose the + * FROM clause with parentheses before joining with previous clauses. + * @return + */ + public boolean hasJoinFields() { + return joinFields.size() > 0; + } + + + /** + * Return true if the FROM clause requires parenthesis before + * + * @return + */ + @Override + public boolean needsParentheses() { + return hasJoinFields(); + } + + + /** * Return the SQL variables used by the subquery; we need this to do proper mapping in the parent query. * @return */ http://git-wip-us.apache.org/repos/asf/marmotta/blob/f1e457b7/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 d65eac1..c6f3eb4 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 @@ -522,6 +522,7 @@ public class SQLBuilder { List<SQLVariable> vars = new ArrayList<>(variables.values()); Collections.sort(vars, SQLVariable.sparqlNameComparator); + for(SQLVariable v : vars) { if(v.getProjectionType() != ProjectionType.NONE) { String projectedName = v.getName(); @@ -531,6 +532,14 @@ public class SQLBuilder { } } + // SQL enforces ORDER BY variables to occur in the select part in case distinct is set + int counter = 0; + if(distinct) { + for(OrderElem e : orderby) { + projections.add(evaluateExpression(e.getExpr(), OPTypes.VALUE) + " AS _OB" + (++counter)); + } + } + StringBuilder selectClause = new StringBuilder(); http://git-wip-us.apache.org/repos/asf/marmotta/blob/f1e457b7/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 3c535cc..99da670 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 @@ -76,7 +76,7 @@ public class SQLSubQuery extends SQLAbstractSubquery { .append(alias); for(VariableMapping var : getJoinFields()) { - fromClause.append(" INNER JOIN nodes AS "); + fromClause.append(" LEFT OUTER JOIN nodes AS "); // outer join because binding might be NULL fromClause.append(alias + "_" + var.getParentName()); fromClause.append(" ON " + alias + "." + var.getSubqueryName() + " = " + alias + "_" + var.getParentName() + ".id "); http://git-wip-us.apache.org/repos/asf/marmotta/blob/f1e457b7/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLUnion.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLUnion.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLUnion.java index b270fb9..dbc1fd8 100644 --- a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLUnion.java +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/SQLUnion.java @@ -123,7 +123,7 @@ public class SQLUnion extends SQLAbstractSubquery { .append(alias); for(VariableMapping var : getJoinFields()) { - fromClause.append(" INNER JOIN nodes AS "); + fromClause.append(" LEFT OUTER JOIN nodes AS "); // outer join because binding might be NULL fromClause.append(alias + "_" + var.getParentName()); fromClause.append(" ON " + alias + "." + var.getSubqueryName() + " = " + alias + "_" + var.getParentName() + ".id ");
