You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rya.apache.org by mi...@apache.org on 2016/02/22 20:52:54 UTC
[2/3] incubator-rya git commit: RYA-41 Fixed a bug where
AccumuloIndexSet assumes the first node of a ParsedQuery is always a
Projection node.
RYA-41 Fixed a bug where AccumuloIndexSet assumes the first node of a ParsedQuery is always a Projection node.
Project: http://git-wip-us.apache.org/repos/asf/incubator-rya/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-rya/commit/8db5bbc3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-rya/tree/8db5bbc3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-rya/diff/8db5bbc3
Branch: refs/heads/develop
Commit: 8db5bbc3aa0256426c1c9ec925a31bf9e177ff3b
Parents: 3157bc4
Author: Kevin Chilton <ke...@localhost.localdomain>
Authored: Fri Feb 19 17:22:15 2016 -0500
Committer: Kevin Chilton <ke...@localhost.localdomain>
Committed: Fri Feb 19 17:22:15 2016 -0500
----------------------------------------------------------------------
.../external/tupleSet/AccumuloIndexSet.java | 9 ++-
.../external/tupleSet/ParsedQueryUtil.java | 60 ++++++++++++++++++
.../external/tupleSet/ParsedQueryUtilTest.java | 67 ++++++++++++++++++++
3 files changed, 135 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/8db5bbc3/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/AccumuloIndexSet.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/AccumuloIndexSet.java b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/AccumuloIndexSet.java
index 456c465..9c1bc7b 100644
--- a/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/AccumuloIndexSet.java
+++ b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/AccumuloIndexSet.java
@@ -58,6 +58,7 @@ import org.openrdf.query.parser.sparql.SPARQLParser;
import org.openrdf.sail.SailException;
import com.google.common.base.Joiner;
+import com.google.common.base.Optional;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -123,7 +124,13 @@ public class AccumuloIndexSet extends ExternalTupleSet implements ExternalBatchi
this.accCon = accCon;
final SPARQLParser sp = new SPARQLParser();
final ParsedTupleQuery pq = (ParsedTupleQuery) sp.parseQuery(sparql, null);
- setProjectionExpr((Projection) pq.getTupleExpr());
+
+ Optional<Projection> projection = new ParsedQueryUtil().findProjection(pq);
+ if(!projection.isPresent()) {
+ throw new MalformedQueryException("SPARQL query '" + sparql + "' does not contain a Projection.");
+ }
+ setProjectionExpr(projection.get());
+
Set<VariableOrder> orders = null;
try {
orders = pcj.getPcjMetadata(accCon, tablename).getVarOrders();
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/8db5bbc3/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/ParsedQueryUtil.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/ParsedQueryUtil.java b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/ParsedQueryUtil.java
new file mode 100644
index 0000000..b41c9c9
--- /dev/null
+++ b/extras/indexing/src/main/java/mvm/rya/indexing/external/tupleSet/ParsedQueryUtil.java
@@ -0,0 +1,60 @@
+/*
+ * 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 mvm.rya.indexing.external.tupleSet;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import org.openrdf.query.algebra.Projection;
+import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.openrdf.query.parser.ParsedQuery;
+
+import com.google.common.base.Optional;
+
+/**
+ * Utilities that help applications inspect {@link ParsedQuery} objects.
+ */
+@ParametersAreNonnullByDefault
+public class ParsedQueryUtil {
+
+ /**
+ * Finds the first {@link Projection} node within a {@link ParsedQuery}.
+ *
+ * @param query - The query that will be searched. (not null)
+ * @return The first projection encountered if the query has one; otherwise absent.
+ */
+ public Optional<Projection> findProjection(final ParsedQuery query) {
+ checkNotNull(query);
+
+ // When a projection is encountered for the requested index, store it in atomic reference and quit searching.
+ final AtomicReference<Projection> projectionRef = new AtomicReference<>();
+
+ query.getTupleExpr().visit(new QueryModelVisitorBase<RuntimeException>() {
+ @Override
+ public void meet(Projection projection) {
+ projectionRef.set(projection);
+ }
+ });
+
+ return Optional.fromNullable( projectionRef.get() );
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/8db5bbc3/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/ParsedQueryUtilTest.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/ParsedQueryUtilTest.java b/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/ParsedQueryUtilTest.java
new file mode 100644
index 0000000..d3755b3
--- /dev/null
+++ b/extras/indexing/src/test/java/mvm/rya/indexing/external/tupleSet/ParsedQueryUtilTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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 mvm.rya.indexing.external.tupleSet;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.openrdf.query.MalformedQueryException;
+import org.openrdf.query.algebra.Projection;
+import org.openrdf.query.parser.ParsedQuery;
+import org.openrdf.query.parser.sparql.SPARQLParser;
+
+import com.google.common.base.Optional;
+
+/**
+ * Tests the methods of {@link ParsedQueryUtil}.
+ */
+public class ParsedQueryUtilTest {
+
+ @Test
+ public void findProjection_distinctIsTopNode() throws MalformedQueryException {
+ // A SPARQL query that uses the DISTINCT keyword.
+ String sparql =
+ "SELECT DISTINCT ?a ?b " +
+ "WHERE {" +
+ "?a <http://talksTo> ?b" +
+ "}";
+
+ // Run the test.
+ SPARQLParser parser = new SPARQLParser();
+ ParsedQuery query = parser.parseQuery(sparql, null);
+ Optional<Projection> projection = new ParsedQueryUtil().findProjection(query);
+ assertTrue(projection.isPresent());
+ }
+
+ @Test
+ public void findProjection_projectionIsTopNode() throws MalformedQueryException {
+ // A SPARQL query that will result in the Projection node being the top node.
+ String sparql =
+ "SELECT ?a ?b " +
+ "WHERE {" +
+ "?a <http://talksTo> ?b" +
+ "}";
+
+ // Run the test.
+ SPARQLParser parser = new SPARQLParser();
+ ParsedQuery query = parser.parseQuery(sparql, null);
+ Optional<Projection> projection = new ParsedQueryUtil().findProjection(query);
+ assertTrue(projection.isPresent());
+ }
+}
\ No newline at end of file