Repository: marmotta Updated Branches: refs/heads/develop 2cfd480ad -> 4b41f6f92
join NODES table to subquery results if necessary Project: http://git-wip-us.apache.org/repos/asf/marmotta/repo Commit: http://git-wip-us.apache.org/repos/asf/marmotta/commit/4b41f6f9 Tree: http://git-wip-us.apache.org/repos/asf/marmotta/tree/4b41f6f9 Diff: http://git-wip-us.apache.org/repos/asf/marmotta/diff/4b41f6f9 Branch: refs/heads/develop Commit: 4b41f6f929911974cef304d26c283382c24c4d1b Parents: 2cfd480 Author: Sebastian Schaffert <[email protected]> Authored: Thu Sep 18 14:42:49 2014 +0200 Committer: Sebastian Schaffert <[email protected]> Committed: Thu Sep 18 14:42:49 2014 +0200 ---------------------------------------------------------------------- .../sparql/builder/SQLAbstractSubquery.java | 15 +++++ .../kiwi/sparql/builder/SQLBuilder.java | 6 +- .../kiwi/sparql/builder/SQLSubQuery.java | 8 +++ .../marmotta/kiwi/sparql/builder/SQLUnion.java | 8 +++ .../kiwi/sparql/builder/VariableMapping.java | 62 ++++++++++++++++++++ .../kiwi/sparql/test/KiWiSparqlJoinTest.java | 6 ++ .../marmotta/kiwi/sparql/test/query31.sparql | 29 +++++++++ .../src/main/resources/web/admin/squebi.html | 1 - 8 files changed, 132 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/marmotta/blob/4b41f6f9/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 f2dd814..a0857ad 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 @@ -17,6 +17,7 @@ package org.apache.marmotta.kiwi.sparql.builder; +import java.util.HashSet; import java.util.Set; /** @@ -28,6 +29,15 @@ public abstract class SQLAbstractSubquery extends SQLClause { protected String alias; + + /** + * This set contains variable names describing those variables of the subquery that need to be joined with the NODES + * table. This is typically the case when there is a condition or function referring to the actual value of the node + * and not only the ID. The joined NODES table will be aliased with {alias}_{name}. + */ + private Set<VariableMapping> joinFields = new HashSet<>(); + + public SQLAbstractSubquery(String alias) { this.alias = alias; } @@ -36,6 +46,11 @@ public abstract class SQLAbstractSubquery extends SQLClause { return alias; } + + public Set<VariableMapping> getJoinFields() { + return joinFields; + } + /** * 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/4b41f6f9/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 cca14a3..d65eac1 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 @@ -504,8 +504,10 @@ public class SQLBuilder { for(SQLAbstractSubquery sq : f.getSubqueries()) { for(SQLVariable sq_v : sq.getQueryVariables()) { - if(hasNodeCondition(sq_v.getSparqlName(),query)) { - // TODO: this is needed in case we need to JOIN with the NODES table to retrieve values + if(hasNodeCondition(sq_v.getSparqlName(),query) && sq_v.getProjectionType() == ProjectionType.NODE) { + // this is needed in case we need to JOIN with the NODES table to retrieve values + SQLVariable sv = variables.get(sq_v.getSparqlName()); // fetch the name of the variable in the enclosing query + sq.getJoinFields().add(new VariableMapping(sv.getName(), sq_v.getName())); } } } http://git-wip-us.apache.org/repos/asf/marmotta/blob/4b41f6f9/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 4f6ca41..3c535cc 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 @@ -74,6 +74,14 @@ public class SQLSubQuery extends SQLAbstractSubquery { .append(builder.build()) .append(") AS ") .append(alias); + + for(VariableMapping var : getJoinFields()) { + fromClause.append(" INNER JOIN nodes AS "); + fromClause.append(alias + "_" + var.getParentName()); + + fromClause.append(" ON " + alias + "." + var.getSubqueryName() + " = " + alias + "_" + var.getParentName() + ".id "); + } + return fromClause.toString(); } http://git-wip-us.apache.org/repos/asf/marmotta/blob/4b41f6f9/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 bb93260..b270fb9 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 @@ -121,6 +121,14 @@ public class SQLUnion extends SQLAbstractSubquery { .append(right.build()) .append(")) AS ") .append(alias); + + for(VariableMapping var : getJoinFields()) { + fromClause.append(" INNER JOIN nodes AS "); + fromClause.append(alias + "_" + var.getParentName()); + + fromClause.append(" ON " + alias + "." + var.getSubqueryName() + " = " + alias + "_" + var.getParentName() + ".id "); + } + return fromClause.toString(); } http://git-wip-us.apache.org/repos/asf/marmotta/blob/4b41f6f9/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableMapping.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableMapping.java b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableMapping.java new file mode 100644 index 0000000..fd5df18 --- /dev/null +++ b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/builder/VariableMapping.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.marmotta.kiwi.sparql.builder; + +/** + * Mapping for a variable between its name in a subquery and its name in the parent query. Used for resolving join + * fields in subqueries. + * + * @author Sebastian Schaffert ([email protected]) + */ +public class VariableMapping { + + private String parentName, subqueryName; + + public VariableMapping(String parentName, String subqueryName) { + this.parentName = parentName; + this.subqueryName = subqueryName; + } + + public String getParentName() { + return parentName; + } + + public String getSubqueryName() { + return subqueryName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + VariableMapping that = (VariableMapping) o; + + if (!parentName.equals(that.parentName)) return false; + if (!subqueryName.equals(that.subqueryName)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = parentName.hashCode(); + result = 31 * result + subqueryName.hashCode(); + return result; + } +} http://git-wip-us.apache.org/repos/asf/marmotta/blob/4b41f6f9/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java b/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java index c1149e2..e19c83b 100644 --- a/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java +++ b/libraries/kiwi/kiwi-sparql/src/test/java/org/apache/marmotta/kiwi/sparql/test/KiWiSparqlJoinTest.java @@ -312,6 +312,12 @@ public class KiWiSparqlJoinTest { } + // subquery with outer order by + @Test + public void testQuery31() throws Exception { + testQuery("query31.sparql"); + } + // INSERT/UPDATE @Test http://git-wip-us.apache.org/repos/asf/marmotta/blob/4b41f6f9/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query31.sparql ---------------------------------------------------------------------- diff --git a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query31.sparql b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query31.sparql new file mode 100644 index 0000000..53ac2a2 --- /dev/null +++ b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query31.sparql @@ -0,0 +1,29 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +PREFIX foaf: <http://xmlns.com/foaf/0.1/> +PREFIX dc: <http://purl.org/dc/elements/1.1/> + +SELECT ?p1 ?fn ?friend ?interest WHERE { + ?p1 foaf:name ?fn . + { + SELECT ?p1 ?friend WHERE { + ?p1 foaf:knows ?friend + } + } + OPTIONAL { ?friend foaf:interest ?interest } +} ORDER BY ASC(?friend) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/marmotta/blob/4b41f6f9/platform/marmotta-sparql/src/main/resources/web/admin/squebi.html ---------------------------------------------------------------------- diff --git a/platform/marmotta-sparql/src/main/resources/web/admin/squebi.html b/platform/marmotta-sparql/src/main/resources/web/admin/squebi.html index 4a663b2..6f89579 100644 --- a/platform/marmotta-sparql/src/main/resources/web/admin/squebi.html +++ b/platform/marmotta-sparql/src/main/resources/web/admin/squebi.html @@ -66,7 +66,6 @@ </div> <div style="margin-top:50px;position: relative;" ng-controller="QueryCtrl" class="jumbotron"> - <a href="https://github.com/tkurz/squebi"><img style="position: absolute; top: 0; right: 0; border: 0;z-index: 20" src="https://camo.githubusercontent.com/652c5b9acfaddf3a9c326fa6bde407b87f7be0f4/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f6f72616e67655f6666373630302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_orange_ff7600.png"></a> <div id="query-container"> <textarea id="input" ng-model="query" ui-codemirror="editorOptions"></textarea> </div>
