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>

Reply via email to