first working SPARQL optimization: joins

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

Branch: refs/heads/develop
Commit: f6f5001fdd19dd661bdc642a40e3d6ef0f2dc2bd
Parents: 5f4d8f6
Author: Sebastian Schaffert <[email protected]>
Authored: Wed Apr 24 17:26:46 2013 +0200
Committer: Sebastian Schaffert <[email protected]>
Committed: Wed Apr 24 17:26:46 2013 +0200

----------------------------------------------------------------------
 .../sparql/persistence/KiWiSparqlConnection.java   |    9 ++-
 .../marmotta/kiwi/sparql/sail/KiWiSparqlSail.java  |    2 +-
 .../kiwi/sparql/sail/KiWiSparqlSailConnection.java |    5 +-
 .../kiwi/sparql/test/KiWiSparqlJoinTest.java       |   63 ++++++++++++++-
 .../apache/marmotta/kiwi/sparql/test/query1.sparql |    6 ++
 .../marmotta/kiwi/persistence/KiWiConnection.java  |    4 +-
 6 files changed, 78 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java
 
b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java
index 8c23d2a..92bbcb6 100644
--- 
a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java
+++ 
b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/persistence/KiWiSparqlConnection.java
@@ -26,6 +26,7 @@ import org.apache.marmotta.kiwi.persistence.KiWiDialect;
 import org.apache.marmotta.kiwi.persistence.KiWiPersistence;
 import org.apache.marmotta.kiwi.persistence.util.ResultSetIteration;
 import org.apache.marmotta.kiwi.persistence.util.ResultTransformerFunction;
+import org.apache.marmotta.kiwi.sail.KiWiValueFactory;
 import org.openrdf.model.Value;
 import org.openrdf.query.Binding;
 import org.openrdf.query.BindingSet;
@@ -55,9 +56,11 @@ public class KiWiSparqlConnection {
     private static Logger log = 
LoggerFactory.getLogger(KiWiSparqlConnection.class);
 
     private KiWiConnection parent;
+    private KiWiValueFactory valueFactory;
 
-    public KiWiSparqlConnection(KiWiConnection parent) throws SQLException {
+    public KiWiSparqlConnection(KiWiConnection parent, KiWiValueFactory 
valueFactory) throws SQLException {
         this.parent = parent;
+        this.valueFactory = valueFactory;
     }
 
     /**
@@ -199,7 +202,7 @@ public class KiWiSparqlConnection {
                 // in this way we can avoid setting too many query parameters
                 Long nodeId = null;
                 if(fields[i] != null && fields[i].hasValue()) {
-                    Value v = fields[i].getValue();
+                    Value v = valueFactory.convert(fields[i].getValue());
                     if(v instanceof KiWiNode) {
                         nodeId = ((KiWiNode) v).getId();
                     } else {
@@ -233,7 +236,7 @@ public class KiWiSparqlConnection {
                             entry.getValue() != null && 
entry.getValue().size() > 0) {
                         List<String> vNames = queryVariables.get(v);
                         String vName = vNames.get(0);
-                        Value binding = bindings.getValue(v);
+                        Value binding = 
valueFactory.convert(bindings.getValue(v));
                         if(binding instanceof KiWiNode) {
                             whereConditions.add(vName+".id = 
"+((KiWiNode)binding).getId());
                         } else {

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSail.java
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSail.java
 
b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSail.java
index 88a37ef..eb1b810 100644
--- 
a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSail.java
+++ 
b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSail.java
@@ -79,7 +79,7 @@ public class KiWiSparqlSail extends NotifyingSailWrapper {
         KiWiSailConnection root   = getRootConnection(connection);
 
         try {
-            return new KiWiSparqlSailConnection(connection, new 
KiWiSparqlConnection(root.getDatabaseConnection()), root.getValueFactory());
+            return new KiWiSparqlSailConnection(connection, new 
KiWiSparqlConnection(root.getDatabaseConnection(), root.getValueFactory()), 
root.getValueFactory());
         } catch (SQLException e) {
             throw new SailException(e);
         }

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java
 
b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java
index 8ddc846..d1a798f 100644
--- 
a/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java
+++ 
b/libraries/kiwi/kiwi-sparql/src/main/java/org/apache/marmotta/kiwi/sparql/sail/KiWiSparqlSailConnection.java
@@ -19,6 +19,7 @@ package org.apache.marmotta.kiwi.sparql.sail;
 
 import info.aduna.iteration.CloseableIteration;
 import org.apache.marmotta.kiwi.sail.KiWiSailConnection;
+import org.apache.marmotta.kiwi.sail.KiWiValueFactory;
 import org.apache.marmotta.kiwi.sparql.evaluation.KiWiEvaluationStatistics;
 import org.apache.marmotta.kiwi.sparql.evaluation.KiWiEvaluationStrategyImpl;
 import org.apache.marmotta.kiwi.sparql.evaluation.KiWiTripleSource;
@@ -44,9 +45,9 @@ import 
org.openrdf.sail.helpers.NotifyingSailConnectionWrapper;
 public class KiWiSparqlSailConnection extends NotifyingSailConnectionWrapper {
 
     private KiWiSparqlConnection connection;
-    private ValueFactory valueFactory;
+    private KiWiValueFactory valueFactory;
 
-    public KiWiSparqlSailConnection(NotifyingSailConnection parent, 
KiWiSparqlConnection connection, ValueFactory valueFactory) {
+    public KiWiSparqlSailConnection(NotifyingSailConnection parent, 
KiWiSparqlConnection connection, KiWiValueFactory valueFactory) {
         super(parent);
         this.connection = connection;
         this.valueFactory = valueFactory;

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/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 bead1d5..325eaa6 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
@@ -17,6 +17,8 @@
 
 package org.apache.marmotta.kiwi.sparql.test;
 
+import info.aduna.iteration.Iterations;
+import org.apache.commons.io.IOUtils;
 import org.apache.marmotta.kiwi.persistence.KiWiDialect;
 import org.apache.marmotta.kiwi.persistence.h2.H2Dialect;
 import org.apache.marmotta.kiwi.persistence.mysql.MySQLDialect;
@@ -24,23 +26,31 @@ import 
org.apache.marmotta.kiwi.persistence.pgsql.PostgreSQLDialect;
 import org.apache.marmotta.kiwi.sail.KiWiStore;
 import org.apache.marmotta.kiwi.sparql.sail.KiWiSparqlSail;
 import org.apache.marmotta.kiwi.test.helper.DBConnectionChecker;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.*;
 import org.junit.rules.TestWatcher;
 import org.junit.runner.Description;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.openrdf.query.BindingSet;
+import org.openrdf.query.QueryLanguage;
+import org.openrdf.query.TupleQuery;
+import org.openrdf.query.TupleQueryResult;
 import org.openrdf.repository.Repository;
+import org.openrdf.repository.RepositoryConnection;
 import org.openrdf.repository.RepositoryException;
 import org.openrdf.repository.sail.SailRepository;
+import org.openrdf.rio.RDFFormat;
+import org.openrdf.rio.RDFParseException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.hamcrest.CoreMatchers.hasItem;
+
 /**
  * Test the KiWi SPARQL Join optimization.
  *
@@ -128,11 +138,23 @@ public class KiWiSparqlJoinTest {
 
 
     @Before
-    public void initDatabase() throws RepositoryException {
+    public void initDatabase() throws RepositoryException, IOException, 
RDFParseException {
         store = new KiWiStore("test",jdbcUrl,jdbcUser,jdbcPass,dialect, 
"http://localhost/context/default";, "http://localhost/context/inferred";);
         ssail = new KiWiSparqlSail(store);
         repository = new SailRepository(ssail);
         repository.initialize();
+
+        // load demo data
+        RepositoryConnection con = repository.getConnection();
+        try {
+            con.begin();
+
+            con.add(this.getClass().getResourceAsStream("demo-data.foaf"), 
"http://localhost/test/";, RDFFormat.RDFXML);
+
+            con.commit();
+        } finally {
+            con.close();
+        }
     }
 
     @After
@@ -155,4 +177,37 @@ public class KiWiSparqlJoinTest {
         }
     };
 
+
+    /**
+     * This method tests a simple triple join with two triple patterns.
+     * @throws Exception
+     */
+    @Test
+    public void testQuery1() throws Exception {
+        String queryString = 
IOUtils.toString(this.getClass().getResourceAsStream("query1.sparql"), "UTF-8");
+
+        RepositoryConnection con = repository.getConnection();
+        try {
+            con.begin();
+
+
+            TupleQuery query = con.prepareTupleQuery(QueryLanguage.SPARQL, 
queryString);
+            TupleQueryResult result = query.evaluate();
+
+            con.commit();
+
+            Assert.assertTrue(result.hasNext());
+
+            List<BindingSet> bindingSets = Iterations.asList(result);
+
+            for(BindingSet bindings : bindingSets) {
+                System.err.println(bindings);
+            }
+        } catch(RepositoryException ex) {
+            con.rollback();
+        } finally {
+            con.close();
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query1.sparql
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query1.sparql
 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query1.sparql
new file mode 100644
index 0000000..bc05292
--- /dev/null
+++ 
b/libraries/kiwi/kiwi-sparql/src/test/resources/org/apache/marmotta/kiwi/sparql/test/query1.sparql
@@ -0,0 +1,6 @@
+PREFIX foaf: <http://xmlns.com/foaf/0.1/>
+
+SELECT ?p1 ?p3 WHERE {
+    ?p1 foaf:knows ?p2 .
+    ?p2 foaf:knows ?p3
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/f6f5001f/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/persistence/KiWiConnection.java
----------------------------------------------------------------------
diff --git 
a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/persistence/KiWiConnection.java
 
b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/persistence/KiWiConnection.java
index e582631..fa9834a 100644
--- 
a/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/persistence/KiWiConnection.java
+++ 
b/libraries/kiwi/kiwi-triplestore/src/main/java/org/apache/marmotta/kiwi/persistence/KiWiConnection.java
@@ -170,7 +170,9 @@ public class KiWiConnection {
      *
      * @return
      */
-    public Connection getJDBCConnection() {
+    public Connection getJDBCConnection() throws SQLException {
+        requireJDBCConnection();
+
         return connection;
     }
 

Reply via email to