You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by ss...@apache.org on 2015/12/12 18:31:10 UTC

marmotta git commit: support native SPARQL query evaluation for tuple queries

Repository: marmotta
Updated Branches:
  refs/heads/develop 0ff22a0c3 -> 47ed3b633


support native SPARQL query evaluation for tuple queries


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

Branch: refs/heads/develop
Commit: 47ed3b6333c81a6235c2e920206e87799ed5edbf
Parents: 0ff22a0
Author: Sebastian Schaffert <ss...@apache.org>
Authored: Sat Dec 12 18:32:43 2015 +0100
Committer: Sebastian Schaffert <ss...@apache.org>
Committed: Sat Dec 12 18:32:43 2015 +0100

----------------------------------------------------------------------
 .../ostrich/backend/sparql/rasqal_model.cc      |  12 ++
 .../ostrich/sail/OstrichSailConnection.java     |  14 ++-
 .../backend/ostrich/OstrichProvider.java        |   3 +
 .../backend/ostrich/OstrichSailRepository.java  | 112 +++++++++++++++++++
 .../main/resources/config-defaults.properties   |   3 +-
 .../resources/config-descriptions.properties    |   7 +-
 6 files changed, 146 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/marmotta/blob/47ed3b63/libraries/ostrich/backend/sparql/rasqal_model.cc
----------------------------------------------------------------------
diff --git a/libraries/ostrich/backend/sparql/rasqal_model.cc b/libraries/ostrich/backend/sparql/rasqal_model.cc
index 346b831..e7dbbf1 100644
--- a/libraries/ostrich/backend/sparql/rasqal_model.cc
+++ b/libraries/ostrich/backend/sparql/rasqal_model.cc
@@ -29,6 +29,10 @@ namespace rasqal {
 #define CPSTR(s) (const unsigned char*)strdup(s.c_str())
 
 rdf::Resource ConvertResource(rasqal_literal *node) {
+    if (node == nullptr) {
+        return rdf::Resource();
+    }
+
     switch (node->type) {
         case RASQAL_LITERAL_URI:
             return rdf::URI(std::string((const char*)raptor_uri_as_string(node->value.uri)));
@@ -42,6 +46,10 @@ rdf::Resource ConvertResource(rasqal_literal *node) {
 
 
 rdf::Value ConvertValue(rasqal_literal *node) {
+    if (node == nullptr) {
+        return rdf::Value();
+    }
+
     std::string label((const char*)node->string, node->string_len);
     rdf::Value r;
     char* s;
@@ -99,6 +107,10 @@ rdf::Value ConvertValue(rasqal_literal *node) {
 
 
 rdf::URI ConvertURI(rasqal_literal *node) {
+    if (node == nullptr) {
+        return rdf::URI();
+    }
+
     switch (node->type) {
         case RASQAL_LITERAL_URI:
             return rdf::URI((const char*)raptor_uri_as_string(node->value.uri));

http://git-wip-us.apache.org/repos/asf/marmotta/blob/47ed3b63/libraries/ostrich/client/src/main/java/org/apache/marmotta/ostrich/sail/OstrichSailConnection.java
----------------------------------------------------------------------
diff --git a/libraries/ostrich/client/src/main/java/org/apache/marmotta/ostrich/sail/OstrichSailConnection.java b/libraries/ostrich/client/src/main/java/org/apache/marmotta/ostrich/sail/OstrichSailConnection.java
index bb80665..93e21ac 100644
--- a/libraries/ostrich/client/src/main/java/org/apache/marmotta/ostrich/sail/OstrichSailConnection.java
+++ b/libraries/ostrich/client/src/main/java/org/apache/marmotta/ostrich/sail/OstrichSailConnection.java
@@ -197,18 +197,24 @@ public class OstrichSailConnection extends NotifyingSailConnectionBase {
                                     switch(b.getValue().getResource().getResourcesCase()) {
                                         case URI:
                                             v = new ProtoURI(b.getValue().getResource().getUri());
+                                            break;
                                         case BNODE:
                                             v = new ProtoBNode(b.getValue().getResource().getBnode());
+                                            break;
                                     }
                                 case LITERAL:
                                     switch(b.getValue().getLiteral().getLiteralsCase()) {
                                         case STRINGLITERAL:
                                             v = new ProtoStringLiteral(b.getValue().getLiteral().getStringliteral());
+                                            break;
                                         case DATALITERAL:
                                             v = new ProtoDatatypeLiteral(b.getValue().getLiteral().getDataliteral());
+                                            break;
                                     }
                             }
-                            result.addBinding(b.getVariable(), v);
+                            if (v != null) {
+                                result.addBinding(b.getVariable(), v);
+                            }
                         }
                         return result;
                     }
@@ -305,8 +311,10 @@ public class OstrichSailConnection extends NotifyingSailConnectionBase {
 
     @Override
     protected void rollbackInternal() throws SailException {
-        updateRequestObserver.onError(new Exception("transaction rollback"));
-        updateRequestObserver = null;
+        if (updateRequestObserver != null) {
+            updateRequestObserver.onError(new Exception("transaction rollback"));
+            updateRequestObserver = null;
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/marmotta/blob/47ed3b63/platform/backends/marmotta-backend-ostrich/src/main/java/org/apache/marmotta/platform/backend/ostrich/OstrichProvider.java
----------------------------------------------------------------------
diff --git a/platform/backends/marmotta-backend-ostrich/src/main/java/org/apache/marmotta/platform/backend/ostrich/OstrichProvider.java b/platform/backends/marmotta-backend-ostrich/src/main/java/org/apache/marmotta/platform/backend/ostrich/OstrichProvider.java
index e62d639..9afa74b 100644
--- a/platform/backends/marmotta-backend-ostrich/src/main/java/org/apache/marmotta/platform/backend/ostrich/OstrichProvider.java
+++ b/platform/backends/marmotta-backend-ostrich/src/main/java/org/apache/marmotta/platform/backend/ostrich/OstrichProvider.java
@@ -68,6 +68,9 @@ public class OstrichProvider implements StoreProvider {
      */
     @Override
     public SailRepository createRepository(Sail sail) {
+        if (configurationService.getBooleanConfiguration("ostrich.sparql.native", true)) {
+            return new OstrichSailRepository(sail);
+        }
         return new SailRepository(sail);
     }
 

http://git-wip-us.apache.org/repos/asf/marmotta/blob/47ed3b63/platform/backends/marmotta-backend-ostrich/src/main/java/org/apache/marmotta/platform/backend/ostrich/OstrichSailRepository.java
----------------------------------------------------------------------
diff --git a/platform/backends/marmotta-backend-ostrich/src/main/java/org/apache/marmotta/platform/backend/ostrich/OstrichSailRepository.java b/platform/backends/marmotta-backend-ostrich/src/main/java/org/apache/marmotta/platform/backend/ostrich/OstrichSailRepository.java
new file mode 100644
index 0000000..0dbf1e8
--- /dev/null
+++ b/platform/backends/marmotta-backend-ostrich/src/main/java/org/apache/marmotta/platform/backend/ostrich/OstrichSailRepository.java
@@ -0,0 +1,112 @@
+/*
+ * 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.platform.backend.ostrich;
+
+import info.aduna.iteration.CloseableIteration;
+import org.apache.marmotta.ostrich.sail.OstrichSailConnection;
+import org.openrdf.query.*;
+import org.openrdf.query.impl.TupleQueryResultImpl;
+import org.openrdf.query.parser.ParsedQuery;
+import org.openrdf.query.parser.ParsedTupleQuery;
+import org.openrdf.query.parser.QueryParserUtil;
+import org.openrdf.repository.RepositoryException;
+import org.openrdf.repository.sail.SailQuery;
+import org.openrdf.repository.sail.SailRepository;
+import org.openrdf.repository.sail.SailRepositoryConnection;
+import org.openrdf.repository.sail.SailTupleQuery;
+import org.openrdf.sail.Sail;
+import org.openrdf.sail.SailConnection;
+import org.openrdf.sail.SailException;
+import org.openrdf.sail.helpers.SailConnectionWrapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+
+/**
+ * A wrapper SailRepository for Ostrich allowing access to direct SPARQL support.
+ *
+ * @author Sebastian Schaffert (sschaffert@apache.org)
+ */
+public class OstrichSailRepository extends SailRepository {
+    private static Logger log = LoggerFactory.getLogger(OstrichSailRepository.class);
+
+    public OstrichSailRepository(Sail sail) {
+        super(sail);
+    }
+
+    @Override
+    public SailRepositoryConnection getConnection() throws RepositoryException {
+        try {
+            final SailConnection con = getSail().getConnection();
+
+            return new SailRepositoryConnection(this, con) {
+                @Override
+                public SailTupleQuery prepareTupleQuery(final QueryLanguage ql, final String queryString, final String baseURI) throws MalformedQueryException {
+                    if (ql == QueryLanguage.SPARQL) {
+                        return new SailTupleQuery(null, this) {
+                            @Override
+                            public TupleQueryResult evaluate() throws QueryEvaluationException {
+                                try {
+                                    log.info("Running native SPARQL query: {}", queryString);
+                                    CloseableIteration<? extends BindingSet, QueryEvaluationException> bindingsIter;
+
+                                    // Let Sesame still parse the query for better error messages and for the binding names.
+                                    ParsedTupleQuery parsedQuery = QueryParserUtil.parseTupleQuery(ql, queryString, baseURI);
+                                    OstrichSailConnection sailCon = findConnection(getConnection().getSailConnection());
+                                    bindingsIter = sailCon.directTupleQuery(queryString);
+                                    bindingsIter = enforceMaxQueryTime(bindingsIter);
+
+                                    return new TupleQueryResultImpl(new ArrayList<String>(parsedQuery.getTupleExpr().getBindingNames()), bindingsIter);
+                                } catch (SailException e) {
+                                    throw new QueryEvaluationException(e.getMessage(), e);
+                                } catch (MalformedQueryException e) {
+                                    throw new QueryEvaluationException(e.getMessage(), e);
+                                }
+                            }
+                        };
+                    } else {
+                        return super.prepareTupleQuery(ql, queryString, baseURI);
+                    }
+                }
+
+                @Override
+                public SailQuery prepareQuery(QueryLanguage ql, String queryString, String baseURI) throws MalformedQueryException {
+                    ParsedQuery parsedQuery = QueryParserUtil.parseQuery(ql, queryString, baseURI);
+
+                    if (parsedQuery instanceof ParsedTupleQuery) {
+                        return prepareTupleQuery(ql, queryString, baseURI);
+                    } else {
+                        return super.prepareQuery(ql, queryString, baseURI);
+                    }
+                }
+            };
+        } catch (SailException e) {
+            throw new RepositoryException("could not create repository connection",e);
+        }
+    }
+
+    private static OstrichSailConnection findConnection(SailConnection current) {
+        if (current instanceof OstrichSailConnection) {
+            return (OstrichSailConnection)current;
+        } else if (current instanceof SailConnectionWrapper) {
+            return findConnection(((SailConnectionWrapper) current).getWrappedConnection());
+        }
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/marmotta/blob/47ed3b63/platform/backends/marmotta-backend-ostrich/src/main/resources/config-defaults.properties
----------------------------------------------------------------------
diff --git a/platform/backends/marmotta-backend-ostrich/src/main/resources/config-defaults.properties b/platform/backends/marmotta-backend-ostrich/src/main/resources/config-defaults.properties
index 0bad4d9..c374747 100644
--- a/platform/backends/marmotta-backend-ostrich/src/main/resources/config-defaults.properties
+++ b/platform/backends/marmotta-backend-ostrich/src/main/resources/config-defaults.properties
@@ -21,4 +21,5 @@
 ###############################################################################
 
 ostrich.host = localhost
-ostrich.port = 10000
\ No newline at end of file
+ostrich.port = 10000
+ostrich.sparql.native = true
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/marmotta/blob/47ed3b63/platform/backends/marmotta-backend-ostrich/src/main/resources/config-descriptions.properties
----------------------------------------------------------------------
diff --git a/platform/backends/marmotta-backend-ostrich/src/main/resources/config-descriptions.properties b/platform/backends/marmotta-backend-ostrich/src/main/resources/config-descriptions.properties
index 378d664..6fbab48 100644
--- a/platform/backends/marmotta-backend-ostrich/src/main/resources/config-descriptions.properties
+++ b/platform/backends/marmotta-backend-ostrich/src/main/resources/config-descriptions.properties
@@ -22,5 +22,10 @@
 ostrich.host.description = Host name of the server running the LevelDB/Ostrich backend server,
 ostrich.host.type = java.lang.String
 
-ostrich.portt.description = Port of the server running the LevelDB/Ostrich backend server.
+ostrich.port.description = Port of the server running the LevelDB/Ostrich backend server.
 ostrich.port.type = java.lang.Integer
+
+ostrich.sparql.native.description = Use faster native SPARQL support where possible instead of \
+  interpreted client side support.
+ostrich.sparql.native.type = java.lang.Booleanr
+