http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java index c4db88e..647e3cc 100644 --- a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java +++ b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java @@ -33,7 +33,7 @@ import org.apache.rya.api.domain.StatementMetadata; import org.apache.rya.api.persist.RyaDAOException; import org.apache.rya.mongodb.MongoDBRdfConfiguration; import org.apache.rya.mongodb.MongoDBRyaDAO; -import org.apache.rya.mongodb.MongoTestBase; +import org.apache.rya.mongodb.MongoITBase; import org.apache.rya.sail.config.RyaSailFactory; import org.junit.Test; import org.openrdf.model.impl.LiteralImpl; @@ -49,7 +49,7 @@ import org.openrdf.repository.sail.SailRepository; import org.openrdf.repository.sail.SailRepositoryConnection; import org.openrdf.sail.Sail; -public class MongoStatementMetadataIT extends MongoTestBase { +public class MongoStatementMetadataIT extends MongoITBase { private final String query1 = "prefix owl: <http://www.w3.org/2002/07/owl#> prefix ano: <http://www.w3.org/2002/07/owl#annotated> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode rdf:type owl:Annotation; ano:Source <http://Joe>; " + "ano:Property <http://worksAt>; ano:Target ?x; <http://createdBy> ?y; <http://createdOn> \'2017-01-04\'^^xsd:date }";
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java new file mode 100644 index 0000000..cab6c35 --- /dev/null +++ b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java @@ -0,0 +1,368 @@ +package org.apache.rya.indexing.statement.metadata; +/* + * 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. + */ +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.rya.api.domain.RyaStatement; +import org.apache.rya.api.domain.RyaType; +import org.apache.rya.api.domain.RyaURI; +import org.apache.rya.api.domain.StatementMetadata; +import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataNode; +import org.apache.rya.mongodb.MongoDBRdfConfiguration; +import org.apache.rya.mongodb.MongoDBRyaDAO; +import org.apache.rya.mongodb.MongoITBase; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.openrdf.model.impl.LiteralImpl; +import org.openrdf.model.impl.URIImpl; +import org.openrdf.model.vocabulary.XMLSchema; +import org.openrdf.query.BindingSet; +import org.openrdf.query.QueryEvaluationException; +import org.openrdf.query.algebra.StatementPattern; +import org.openrdf.query.algebra.evaluation.QueryBindingSet; +import org.openrdf.query.algebra.helpers.StatementPatternCollector; +import org.openrdf.query.parser.ParsedQuery; +import org.openrdf.query.parser.sparql.SPARQLParser; + +import info.aduna.iteration.CloseableIteration; + +public class MongoStatementMetadataNodeIT extends MongoITBase { + private final String query = "prefix owl: <http://www.w3.org/2002/07/owl#> prefix ano: <http://www.w3.org/2002/07/owl#annotated> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode rdf:type owl:Annotation; ano:Source <http://Joe>; " + + "ano:Property <http://worksAt>; ano:Target ?x; <http://createdBy> ?y; <http://createdOn> \'2017-01-04\'^^xsd:date }"; + private final String query2 = "prefix owl: <http://www.w3.org/2002/07/owl#> prefix ano: <http://www.w3.org/2002/07/owl#annotated> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode rdf:type owl:Annotation; ano:Source ?x; " + + "ano:Property <http://worksAt>; ano:Target ?y; <http://createdBy> ?x; <http://createdOn> \'2017-01-04\'^^xsd:date }"; + + @Before + public void init() throws Exception { + final Set<RyaURI> propertySet = new HashSet<RyaURI>(Arrays.asList(new RyaURI("http://createdBy"), new RyaURI("http://createdOn"))); + conf.setUseStatementMetadata(true); + conf.setStatementMetadataProperties(propertySet); + } + + @Test + public void simpleQueryWithoutBindingSet() throws Exception { + MongoDBRyaDAO dao = new MongoDBRyaDAO(); + try { + dao.setConf(conf); + dao.init(); + StatementMetadata metadata = new StatementMetadata(); + metadata.addMetadata(new RyaURI("http://createdBy"), new RyaType("Joe")); + metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04")); + + RyaStatement statement = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), + new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); + dao.add(statement); + + SPARQLParser parser = new SPARQLParser(); + ParsedQuery pq = parser.parseQuery(query, null); + List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); + + StatementMetadataNode<?> node = new StatementMetadataNode<>(spList, conf); + CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(new QueryBindingSet()); + + QueryBindingSet bs = new QueryBindingSet(); + bs.addBinding("x", new LiteralImpl("CoffeeShop")); + bs.addBinding("y", new LiteralImpl("Joe")); + + List<BindingSet> bsList = new ArrayList<>(); + while (iteration.hasNext()) { + bsList.add(iteration.next()); + } + + Assert.assertEquals(1, bsList.size()); + Assert.assertEquals(bs, bsList.get(0)); + dao.delete(statement, conf); + } finally { + dao.destroy(); + } + } + + /** + * Tests if results are filtered correctly using the metadata properties. In + * this case, the date for the ingested RyaStatement differs from the date + * specified in the query. + */ + @Test + public void simpleQueryWithoutBindingSetInvalidProperty() throws Exception { + MongoDBRyaDAO dao = new MongoDBRyaDAO(); + try { + dao.setConf(conf); + dao.init(); + + StatementMetadata metadata = new StatementMetadata(); + metadata.addMetadata(new RyaURI("http://createdBy"), new RyaType("Doug")); + metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-02-15")); + + RyaStatement statement = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), + new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); + dao.add(statement); + + SPARQLParser parser = new SPARQLParser(); + ParsedQuery pq = parser.parseQuery(query, null); + List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); + StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf); + CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(new QueryBindingSet()); + + List<BindingSet> bsList = new ArrayList<>(); + while (iteration.hasNext()) { + bsList.add(iteration.next()); + } + Assert.assertEquals(0, bsList.size()); + dao.delete(statement, conf); + } finally { + dao.destroy(); + } + } + + @Test + public void simpleQueryWithBindingSet() throws Exception { + MongoDBRyaDAO dao = new MongoDBRyaDAO(); + try { + dao.setConf(conf); + dao.init(); + StatementMetadata metadata = new StatementMetadata(); + metadata.addMetadata(new RyaURI("http://createdBy"), new RyaType("Joe")); + metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04")); + + RyaStatement statement1 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), + new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); + RyaStatement statement2 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), + new RyaType("HardwareStore"), new RyaURI("http://context"), "", metadata); + dao.add(statement1); + dao.add(statement2); + + SPARQLParser parser = new SPARQLParser(); + ParsedQuery pq = parser.parseQuery(query, null); + List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); + StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf); + + QueryBindingSet bsConstraint = new QueryBindingSet(); + bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop")); + bsConstraint.addBinding("z", new LiteralImpl("Virginia")); + + CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint); + + QueryBindingSet expected = new QueryBindingSet(); + expected.addBinding("x", new LiteralImpl("CoffeeShop")); + expected.addBinding("y", new LiteralImpl("Joe")); + expected.addBinding("z", new LiteralImpl("Virginia")); + + List<BindingSet> bsList = new ArrayList<>(); + while (iteration.hasNext()) { + bsList.add(iteration.next()); + } + + Assert.assertEquals(1, bsList.size()); + Assert.assertEquals(expected, bsList.get(0)); + + dao.delete(statement1, conf); + dao.delete(statement2, conf); + } finally { + dao.destroy(); + } + } + + /** + * Tests to see if correct result is passed back when a metadata statement + * is joined with a StatementPattern statement (i.e. a common variable + * appears in a StatementPattern statement and a metadata statement). + * StatementPattern statements have either rdf:subject, rdf:predicate, or + * rdf:object as the predicate while a metadata statement is any statement + * in the reified query whose predicate is not rdf:type and not a + * StatementPattern predicate. + */ + @Test + public void simpleQueryWithBindingSetJoinPropertyToSubject() throws Exception { + MongoDBRyaDAO dao = new MongoDBRyaDAO(); + try { + dao.setConf(conf); + dao.init(); + StatementMetadata metadata = new StatementMetadata(); + metadata.addMetadata(new RyaURI("http://createdBy"), new RyaURI("http://Joe")); + metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04")); + + RyaStatement statement1 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), + new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); + RyaStatement statement2 = new RyaStatement(new RyaURI("http://Bob"), new RyaURI("http://worksAt"), + new RyaType("HardwareStore"), new RyaURI("http://context"), "", metadata); + dao.add(statement1); + dao.add(statement2); + + SPARQLParser parser = new SPARQLParser(); + ParsedQuery pq = parser.parseQuery(query2, null); + List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); + StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf); + + List<BindingSet> bsCollection = new ArrayList<>(); + QueryBindingSet bsConstraint1 = new QueryBindingSet(); + bsConstraint1.addBinding("y", new LiteralImpl("CoffeeShop")); + bsConstraint1.addBinding("z", new LiteralImpl("Virginia")); + + QueryBindingSet bsConstraint2 = new QueryBindingSet(); + bsConstraint2.addBinding("y", new LiteralImpl("HardwareStore")); + bsConstraint2.addBinding("z", new LiteralImpl("Maryland")); + bsCollection.add(bsConstraint1); + bsCollection.add(bsConstraint2); + + CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection); + + QueryBindingSet expected = new QueryBindingSet(); + expected.addBinding("y", new LiteralImpl("CoffeeShop")); + expected.addBinding("x", new URIImpl("http://Joe")); + expected.addBinding("z", new LiteralImpl("Virginia")); + + List<BindingSet> bsList = new ArrayList<>(); + while (iteration.hasNext()) { + bsList.add(iteration.next()); + } + + Assert.assertEquals(1, bsList.size()); + Assert.assertEquals(expected, bsList.get(0)); + + dao.delete(statement1, conf); + dao.delete(statement2, conf); + } finally { + dao.destroy(); + } + } + + /** + * Tests if the StatementMetadataNode joins BindingSet correctly for + * variables appearing in metadata statements. In this case, the metadata + * statements are (_:blankNode <http://createdOn 2017-01-04 ) and + * (_:blankNode <http://createdBy> ?y). The variable ?y appears as the + * object in the above metadata statement and its values are joined to the + * constraint BindingSets in the example below. + */ + @Test + public void simpleQueryWithBindingSetJoinOnProperty() throws Exception { + MongoDBRyaDAO dao = new MongoDBRyaDAO(); + try { + dao.setConf(conf); + dao.init(); + StatementMetadata metadata = new StatementMetadata(); + metadata.addMetadata(new RyaURI("http://createdBy"), new RyaType("Joe")); + metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04")); + + RyaStatement statement1 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), + new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); + dao.add(statement1); + + SPARQLParser parser = new SPARQLParser(); + ParsedQuery pq = parser.parseQuery(query, null); + List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); + StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf); + + QueryBindingSet bsConstraint = new QueryBindingSet(); + bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop")); + bsConstraint.addBinding("y", new LiteralImpl("Doug")); + + CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint); + + List<BindingSet> bsList = new ArrayList<>(); + while (iteration.hasNext()) { + bsList.add(iteration.next()); + } + + Assert.assertEquals(0, bsList.size()); + dao.delete(statement1, conf); + } finally { + dao.destroy(); + } + } + + /** + * Tests if StatementMetadataNode joins BindingSet values correctly for + * variables appearing as the object in one of the StatementPattern + * statements (in the case ?x appears as the Object in the statement + * _:blankNode rdf:object ?x). StatementPattern statements have either + * rdf:subject, rdf:predicate, or rdf:object as the predicate. + */ + @Test + public void simpleQueryWithBindingSetCollection() throws Exception { + MongoDBRyaDAO dao = new MongoDBRyaDAO(); + try { + dao.setConf(conf); + dao.init(); + StatementMetadata metadata = new StatementMetadata(); + metadata.addMetadata(new RyaURI("http://createdBy"), new RyaType("Joe")); + metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04")); + + RyaStatement statement1 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), + new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); + RyaStatement statement2 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), + new RyaType("HardwareStore"), new RyaURI("http://context"), "", metadata); + dao.add(statement1); + dao.add(statement2); + + SPARQLParser parser = new SPARQLParser(); + ParsedQuery pq = parser.parseQuery(query, null); + List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); + StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf); + + List<BindingSet> bsCollection = new ArrayList<>(); + QueryBindingSet bsConstraint1 = new QueryBindingSet(); + bsConstraint1.addBinding("x", new LiteralImpl("CoffeeShop")); + bsConstraint1.addBinding("z", new LiteralImpl("Virginia")); + + QueryBindingSet bsConstraint2 = new QueryBindingSet(); + bsConstraint2.addBinding("x", new LiteralImpl("HardwareStore")); + bsConstraint2.addBinding("z", new LiteralImpl("Maryland")); + + QueryBindingSet bsConstraint3 = new QueryBindingSet(); + bsConstraint3.addBinding("x", new LiteralImpl("BurgerShack")); + bsConstraint3.addBinding("z", new LiteralImpl("Delaware")); + bsCollection.add(bsConstraint1); + bsCollection.add(bsConstraint2); + bsCollection.add(bsConstraint3); + + CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection); + + Set<BindingSet> expected = new HashSet<>(); + QueryBindingSet expected1 = new QueryBindingSet(); + expected1.addBinding("x", new LiteralImpl("CoffeeShop")); + expected1.addBinding("y", new LiteralImpl("Joe")); + expected1.addBinding("z", new LiteralImpl("Virginia")); + + QueryBindingSet expected2 = new QueryBindingSet(); + expected2.addBinding("x", new LiteralImpl("HardwareStore")); + expected2.addBinding("y", new LiteralImpl("Joe")); + expected2.addBinding("z", new LiteralImpl("Maryland")); + expected.add(expected1); + expected.add(expected2); + + Set<BindingSet> bsSet = new HashSet<>(); + while (iteration.hasNext()) { + bsSet.add(iteration.next()); + } + + Assert.assertEquals(expected, bsSet); + + dao.delete(statement1, conf); + dao.delete(statement2, conf); + } finally { + dao.destroy(); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeTest.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeTest.java deleted file mode 100644 index a45197c..0000000 --- a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeTest.java +++ /dev/null @@ -1,368 +0,0 @@ -package org.apache.rya.indexing.statement.metadata; -/* - * 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. - */ -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.apache.rya.api.domain.RyaStatement; -import org.apache.rya.api.domain.RyaType; -import org.apache.rya.api.domain.RyaURI; -import org.apache.rya.api.domain.StatementMetadata; -import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataNode; -import org.apache.rya.mongodb.MongoDBRdfConfiguration; -import org.apache.rya.mongodb.MongoDBRyaDAO; -import org.apache.rya.mongodb.MongoTestBase; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.openrdf.model.impl.LiteralImpl; -import org.openrdf.model.impl.URIImpl; -import org.openrdf.model.vocabulary.XMLSchema; -import org.openrdf.query.BindingSet; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.evaluation.QueryBindingSet; -import org.openrdf.query.algebra.helpers.StatementPatternCollector; -import org.openrdf.query.parser.ParsedQuery; -import org.openrdf.query.parser.sparql.SPARQLParser; - -import info.aduna.iteration.CloseableIteration; - -public class MongoStatementMetadataNodeTest extends MongoTestBase { - private final String query = "prefix owl: <http://www.w3.org/2002/07/owl#> prefix ano: <http://www.w3.org/2002/07/owl#annotated> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode rdf:type owl:Annotation; ano:Source <http://Joe>; " - + "ano:Property <http://worksAt>; ano:Target ?x; <http://createdBy> ?y; <http://createdOn> \'2017-01-04\'^^xsd:date }"; - private final String query2 = "prefix owl: <http://www.w3.org/2002/07/owl#> prefix ano: <http://www.w3.org/2002/07/owl#annotated> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode rdf:type owl:Annotation; ano:Source ?x; " - + "ano:Property <http://worksAt>; ano:Target ?y; <http://createdBy> ?x; <http://createdOn> \'2017-01-04\'^^xsd:date }"; - - @Before - public void init() throws Exception { - final Set<RyaURI> propertySet = new HashSet<RyaURI>(Arrays.asList(new RyaURI("http://createdBy"), new RyaURI("http://createdOn"))); - conf.setUseStatementMetadata(true); - conf.setStatementMetadataProperties(propertySet); - } - - @Test - public void simpleQueryWithoutBindingSet() throws Exception { - MongoDBRyaDAO dao = new MongoDBRyaDAO(); - try { - dao.setConf(conf); - dao.init(); - StatementMetadata metadata = new StatementMetadata(); - metadata.addMetadata(new RyaURI("http://createdBy"), new RyaType("Joe")); - metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04")); - - RyaStatement statement = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), - new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); - dao.add(statement); - - SPARQLParser parser = new SPARQLParser(); - ParsedQuery pq = parser.parseQuery(query, null); - List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); - - StatementMetadataNode<?> node = new StatementMetadataNode<>(spList, conf); - CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(new QueryBindingSet()); - - QueryBindingSet bs = new QueryBindingSet(); - bs.addBinding("x", new LiteralImpl("CoffeeShop")); - bs.addBinding("y", new LiteralImpl("Joe")); - - List<BindingSet> bsList = new ArrayList<>(); - while (iteration.hasNext()) { - bsList.add(iteration.next()); - } - - Assert.assertEquals(1, bsList.size()); - Assert.assertEquals(bs, bsList.get(0)); - dao.delete(statement, conf); - } finally { - dao.destroy(); - } - } - - /** - * Tests if results are filtered correctly using the metadata properties. In - * this case, the date for the ingested RyaStatement differs from the date - * specified in the query. - */ - @Test - public void simpleQueryWithoutBindingSetInvalidProperty() throws Exception { - MongoDBRyaDAO dao = new MongoDBRyaDAO(); - try { - dao.setConf(conf); - dao.init(); - - StatementMetadata metadata = new StatementMetadata(); - metadata.addMetadata(new RyaURI("http://createdBy"), new RyaType("Doug")); - metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-02-15")); - - RyaStatement statement = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), - new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); - dao.add(statement); - - SPARQLParser parser = new SPARQLParser(); - ParsedQuery pq = parser.parseQuery(query, null); - List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); - StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf); - CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(new QueryBindingSet()); - - List<BindingSet> bsList = new ArrayList<>(); - while (iteration.hasNext()) { - bsList.add(iteration.next()); - } - Assert.assertEquals(0, bsList.size()); - dao.delete(statement, conf); - } finally { - dao.destroy(); - } - } - - @Test - public void simpleQueryWithBindingSet() throws Exception { - MongoDBRyaDAO dao = new MongoDBRyaDAO(); - try { - dao.setConf(conf); - dao.init(); - StatementMetadata metadata = new StatementMetadata(); - metadata.addMetadata(new RyaURI("http://createdBy"), new RyaType("Joe")); - metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04")); - - RyaStatement statement1 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), - new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); - RyaStatement statement2 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), - new RyaType("HardwareStore"), new RyaURI("http://context"), "", metadata); - dao.add(statement1); - dao.add(statement2); - - SPARQLParser parser = new SPARQLParser(); - ParsedQuery pq = parser.parseQuery(query, null); - List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); - StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf); - - QueryBindingSet bsConstraint = new QueryBindingSet(); - bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop")); - bsConstraint.addBinding("z", new LiteralImpl("Virginia")); - - CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint); - - QueryBindingSet expected = new QueryBindingSet(); - expected.addBinding("x", new LiteralImpl("CoffeeShop")); - expected.addBinding("y", new LiteralImpl("Joe")); - expected.addBinding("z", new LiteralImpl("Virginia")); - - List<BindingSet> bsList = new ArrayList<>(); - while (iteration.hasNext()) { - bsList.add(iteration.next()); - } - - Assert.assertEquals(1, bsList.size()); - Assert.assertEquals(expected, bsList.get(0)); - - dao.delete(statement1, conf); - dao.delete(statement2, conf); - } finally { - dao.destroy(); - } - } - - /** - * Tests to see if correct result is passed back when a metadata statement - * is joined with a StatementPattern statement (i.e. a common variable - * appears in a StatementPattern statement and a metadata statement). - * StatementPattern statements have either rdf:subject, rdf:predicate, or - * rdf:object as the predicate while a metadata statement is any statement - * in the reified query whose predicate is not rdf:type and not a - * StatementPattern predicate. - */ - @Test - public void simpleQueryWithBindingSetJoinPropertyToSubject() throws Exception { - MongoDBRyaDAO dao = new MongoDBRyaDAO(); - try { - dao.setConf(conf); - dao.init(); - StatementMetadata metadata = new StatementMetadata(); - metadata.addMetadata(new RyaURI("http://createdBy"), new RyaURI("http://Joe")); - metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04")); - - RyaStatement statement1 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), - new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); - RyaStatement statement2 = new RyaStatement(new RyaURI("http://Bob"), new RyaURI("http://worksAt"), - new RyaType("HardwareStore"), new RyaURI("http://context"), "", metadata); - dao.add(statement1); - dao.add(statement2); - - SPARQLParser parser = new SPARQLParser(); - ParsedQuery pq = parser.parseQuery(query2, null); - List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); - StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf); - - List<BindingSet> bsCollection = new ArrayList<>(); - QueryBindingSet bsConstraint1 = new QueryBindingSet(); - bsConstraint1.addBinding("y", new LiteralImpl("CoffeeShop")); - bsConstraint1.addBinding("z", new LiteralImpl("Virginia")); - - QueryBindingSet bsConstraint2 = new QueryBindingSet(); - bsConstraint2.addBinding("y", new LiteralImpl("HardwareStore")); - bsConstraint2.addBinding("z", new LiteralImpl("Maryland")); - bsCollection.add(bsConstraint1); - bsCollection.add(bsConstraint2); - - CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection); - - QueryBindingSet expected = new QueryBindingSet(); - expected.addBinding("y", new LiteralImpl("CoffeeShop")); - expected.addBinding("x", new URIImpl("http://Joe")); - expected.addBinding("z", new LiteralImpl("Virginia")); - - List<BindingSet> bsList = new ArrayList<>(); - while (iteration.hasNext()) { - bsList.add(iteration.next()); - } - - Assert.assertEquals(1, bsList.size()); - Assert.assertEquals(expected, bsList.get(0)); - - dao.delete(statement1, conf); - dao.delete(statement2, conf); - } finally { - dao.destroy(); - } - } - - /** - * Tests if the StatementMetadataNode joins BindingSet correctly for - * variables appearing in metadata statements. In this case, the metadata - * statements are (_:blankNode <http://createdOn 2017-01-04 ) and - * (_:blankNode <http://createdBy> ?y). The variable ?y appears as the - * object in the above metadata statement and its values are joined to the - * constraint BindingSets in the example below. - */ - @Test - public void simpleQueryWithBindingSetJoinOnProperty() throws Exception { - MongoDBRyaDAO dao = new MongoDBRyaDAO(); - try { - dao.setConf(conf); - dao.init(); - StatementMetadata metadata = new StatementMetadata(); - metadata.addMetadata(new RyaURI("http://createdBy"), new RyaType("Joe")); - metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04")); - - RyaStatement statement1 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), - new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); - dao.add(statement1); - - SPARQLParser parser = new SPARQLParser(); - ParsedQuery pq = parser.parseQuery(query, null); - List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); - StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf); - - QueryBindingSet bsConstraint = new QueryBindingSet(); - bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop")); - bsConstraint.addBinding("y", new LiteralImpl("Doug")); - - CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint); - - List<BindingSet> bsList = new ArrayList<>(); - while (iteration.hasNext()) { - bsList.add(iteration.next()); - } - - Assert.assertEquals(0, bsList.size()); - dao.delete(statement1, conf); - } finally { - dao.destroy(); - } - } - - /** - * Tests if StatementMetadataNode joins BindingSet values correctly for - * variables appearing as the object in one of the StatementPattern - * statements (in the case ?x appears as the Object in the statement - * _:blankNode rdf:object ?x). StatementPattern statements have either - * rdf:subject, rdf:predicate, or rdf:object as the predicate. - */ - @Test - public void simpleQueryWithBindingSetCollection() throws Exception { - MongoDBRyaDAO dao = new MongoDBRyaDAO(); - try { - dao.setConf(conf); - dao.init(); - StatementMetadata metadata = new StatementMetadata(); - metadata.addMetadata(new RyaURI("http://createdBy"), new RyaType("Joe")); - metadata.addMetadata(new RyaURI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04")); - - RyaStatement statement1 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), - new RyaType("CoffeeShop"), new RyaURI("http://context"), "", metadata); - RyaStatement statement2 = new RyaStatement(new RyaURI("http://Joe"), new RyaURI("http://worksAt"), - new RyaType("HardwareStore"), new RyaURI("http://context"), "", metadata); - dao.add(statement1); - dao.add(statement2); - - SPARQLParser parser = new SPARQLParser(); - ParsedQuery pq = parser.parseQuery(query, null); - List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr()); - StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf); - - List<BindingSet> bsCollection = new ArrayList<>(); - QueryBindingSet bsConstraint1 = new QueryBindingSet(); - bsConstraint1.addBinding("x", new LiteralImpl("CoffeeShop")); - bsConstraint1.addBinding("z", new LiteralImpl("Virginia")); - - QueryBindingSet bsConstraint2 = new QueryBindingSet(); - bsConstraint2.addBinding("x", new LiteralImpl("HardwareStore")); - bsConstraint2.addBinding("z", new LiteralImpl("Maryland")); - - QueryBindingSet bsConstraint3 = new QueryBindingSet(); - bsConstraint3.addBinding("x", new LiteralImpl("BurgerShack")); - bsConstraint3.addBinding("z", new LiteralImpl("Delaware")); - bsCollection.add(bsConstraint1); - bsCollection.add(bsConstraint2); - bsCollection.add(bsConstraint3); - - CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection); - - Set<BindingSet> expected = new HashSet<>(); - QueryBindingSet expected1 = new QueryBindingSet(); - expected1.addBinding("x", new LiteralImpl("CoffeeShop")); - expected1.addBinding("y", new LiteralImpl("Joe")); - expected1.addBinding("z", new LiteralImpl("Virginia")); - - QueryBindingSet expected2 = new QueryBindingSet(); - expected2.addBinding("x", new LiteralImpl("HardwareStore")); - expected2.addBinding("y", new LiteralImpl("Joe")); - expected2.addBinding("z", new LiteralImpl("Maryland")); - expected.add(expected1); - expected.add(expected2); - - Set<BindingSet> bsSet = new HashSet<>(); - while (iteration.hasNext()) { - bsSet.add(iteration.next()); - } - - Assert.assertEquals(expected, bsSet); - - dao.delete(statement1, conf); - dao.delete(statement2, conf); - } finally { - dao.destroy(); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java ---------------------------------------------------------------------- diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java index cb34bd0..d74dca6 100644 --- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java +++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java @@ -33,7 +33,7 @@ public interface GeoTemporalIndexer extends RyaSecondaryIndexer { * initialize after setting configuration. */ @Override - public void init(); + public void init(); /** * Creates the {@link EventStorage} that will be used by the indexer. http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java ---------------------------------------------------------------------- diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java index fa2f52b..9f60e2e 100644 --- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java +++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java @@ -18,6 +18,7 @@ */ package org.apache.rya.indexing.geotemporal; +import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getQueryNode; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; @@ -26,7 +27,6 @@ import java.util.List; import org.apache.rya.indexing.GeoConstants; import org.apache.rya.indexing.TemporalInstantRfc3339; import org.apache.rya.indexing.external.matching.QuerySegment; -import org.apache.rya.indexing.geotemporal.GeoTemporalIndexSetProvider; import org.apache.rya.indexing.geotemporal.model.EventQueryNode; import org.apache.rya.indexing.geotemporal.storage.EventStorage; import org.junit.Before; @@ -36,7 +36,7 @@ import org.openrdf.model.Value; import org.openrdf.model.ValueFactory; import org.openrdf.model.impl.ValueFactoryImpl; -public class GeoTemporalProviderTest extends GeoTemporalTestUtils { +public class GeoTemporalProviderTest { private static final String URI_PROPERTY_AT_TIME = "Property:atTime"; private GeoTemporalIndexSetProvider provider; private EventStorage events; http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java ---------------------------------------------------------------------- diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java index 23399c8..51b2ba0 100644 --- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java +++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java @@ -45,10 +45,15 @@ import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.geom.PrecisionModel; import com.vividsolutions.jts.geom.impl.PackedCoordinateSequence; -public class GeoTemporalTestUtils { +public final class GeoTemporalTestUtils { private static final GeometryFactory gf = new GeometryFactory(new PrecisionModel(), 4326); /** + * Private constructor to prevent initialization. + */ + private GeoTemporalTestUtils() { } + + /** * Make an uniform instant with given seconds. */ public static TemporalInstant makeInstant(final int secondsMakeMeUnique) { http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java ---------------------------------------------------------------------- diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java index 9c28bf0..d629d04 100644 --- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java +++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java @@ -36,7 +36,7 @@ import org.apache.rya.indexing.geotemporal.model.Event; import org.apache.rya.indexing.geotemporal.mongo.MongoGeoTemporalIndexer; import org.apache.rya.indexing.geotemporal.storage.EventStorage; import org.apache.rya.mongodb.MongoDBRdfConfiguration; -import org.apache.rya.mongodb.MongoTestBase; +import org.apache.rya.mongodb.MongoITBase; import org.junit.Test; import org.openrdf.model.URI; import org.openrdf.model.Value; @@ -50,7 +50,7 @@ import org.openrdf.repository.sail.SailRepository; import org.openrdf.repository.sail.SailRepositoryConnection; import org.openrdf.sail.Sail; -public class MongoGeoTemporalIndexIT extends MongoTestBase { +public class MongoGeoTemporalIndexIT extends MongoITBase { private static final String URI_PROPERTY_AT_TIME = "Property:atTime"; private static final ValueFactory VF = ValueFactoryImpl.getInstance(); http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java ---------------------------------------------------------------------- diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java new file mode 100644 index 0000000..9875091 --- /dev/null +++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java @@ -0,0 +1,364 @@ +/** + * 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.rya.indexing.geotemporal.model; + +import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getFilters; +import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getSps; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.rya.api.domain.RyaURI; +import org.apache.rya.indexing.IndexingExpr; +import org.apache.rya.indexing.IndexingFunctionRegistry; +import org.apache.rya.indexing.IndexingFunctionRegistry.FUNCTION_TYPE; +import org.apache.rya.indexing.TemporalInstant; +import org.apache.rya.indexing.TemporalInstantRfc3339; +import org.apache.rya.indexing.geotemporal.mongo.MongoEventStorage; +import org.apache.rya.indexing.geotemporal.storage.EventStorage; +import org.apache.rya.mongodb.MongoITBase; +import org.junit.Test; +import org.openrdf.model.URI; +import org.openrdf.model.Value; +import org.openrdf.model.ValueFactory; +import org.openrdf.model.impl.URIImpl; +import org.openrdf.model.impl.ValueFactoryImpl; +import org.openrdf.query.BindingSet; +import org.openrdf.query.QueryEvaluationException; +import org.openrdf.query.algebra.FunctionCall; +import org.openrdf.query.algebra.StatementPattern; +import org.openrdf.query.algebra.ValueConstant; +import org.openrdf.query.algebra.ValueExpr; +import org.openrdf.query.algebra.Var; +import org.openrdf.query.impl.MapBindingSet; + +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.geom.PrecisionModel; + +import info.aduna.iteration.CloseableIteration; + +/** + * Integration tests the methods of {@link EventQueryNode}. + */ +public class EventQueryNode2IT extends MongoITBase { + private static final GeometryFactory GF = new GeometryFactory(new PrecisionModel(), 4326); + private static final ValueFactory VF = ValueFactoryImpl.getInstance(); + + @Test(expected = IllegalStateException.class) + public void constructor_differentSubjects() throws Exception { + final Var geoSubj = new Var("point"); + final Var geoPred = new Var("-const-http://www.opengis.net/ont/geosparql#asWKT", ValueFactoryImpl.getInstance().createURI("http://www.opengis.net/ont/geosparql#asWKT")); + final Var geoObj = new Var("wkt"); + final StatementPattern geoSP = new StatementPattern(geoSubj, geoPred, geoObj); + + final Var timeSubj = new Var("time"); + final Var timePred = new Var("-const-http://www.w3.org/2006/time#inXSDDateTime", ValueFactoryImpl.getInstance().createURI("-const-http://www.w3.org/2006/time#inXSDDateTime")); + final Var timeObj = new Var("time"); + final StatementPattern timeSP = new StatementPattern(timeSubj, timePred, timeObj); + // This will fail. + new EventQueryNode.EventQueryNodeBuilder() + .setStorage(mock(EventStorage.class)) + .setGeoPattern(geoSP) + .setTemporalPattern(timeSP) + .setGeoFilters(new ArrayList<IndexingExpr>()) + .setTemporalFilters(new ArrayList<IndexingExpr>()) + .setUsedFilters(new ArrayList<>()) + .build(); + } + + @Test(expected = IllegalStateException.class) + public void constructor_variablePredicate() throws Exception { + // A pattern that has a variable for its predicate. + final Var geoSubj = new Var("point"); + final Var geoPred = new Var("geo"); + final Var geoObj = new Var("wkt"); + final StatementPattern geoSP = new StatementPattern(geoSubj, geoPred, geoObj); + + final Var timeSubj = new Var("time"); + final Var timePred = new Var("-const-http://www.w3.org/2006/time#inXSDDateTime", ValueFactoryImpl.getInstance().createURI("-const-http://www.w3.org/2006/time#inXSDDateTime")); + final Var timeObj = new Var("time"); + final StatementPattern timeSP = new StatementPattern(timeSubj, timePred, timeObj); + // This will fail. + new EventQueryNode.EventQueryNodeBuilder() + .setStorage(mock(EventStorage.class)) + .setGeoPattern(geoSP) + .setTemporalPattern(timeSP) + .setGeoFilters(new ArrayList<IndexingExpr>()) + .setTemporalFilters(new ArrayList<IndexingExpr>()) + .setUsedFilters(new ArrayList<>()) + .build(); + } + + @Test + public void evaluate_constantSubject() throws Exception { + final EventStorage storage = new MongoEventStorage(super.getMongoClient(), "testDB"); + RyaURI subject = new RyaURI("urn:event-1111"); + final Geometry geo = GF.createPoint(new Coordinate(1, 1)); + final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0); + final Event event = Event.builder() + .setSubject(subject) + .setGeometry(geo) + .setTemporalInstant(temp) + .build(); + + subject = new RyaURI("urn:event-2222"); + final Event otherEvent = Event.builder() + .setSubject(subject) + .setGeometry(geo) + .setTemporalInstant(temp) + .build(); + + storage.create(event); + storage.create(otherEvent); + + final String query = + "PREFIX time: <http://www.w3.org/2006/time#> \n" + + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n" + + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>" + + "SELECT ?event ?time ?point ?wkt " + + "WHERE { " + + " <urn:event-1111> time:atTime ?time . " + + " <urn:event-1111> geo:asWKT ?wkt . " + + " FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 -2, -3 -2))\"^^geo:wktLiteral)) " + + " FILTER(tempo:equals(?time, \"" + temp.toString() + "\")) " + + "}"; + + final EventQueryNode node = buildNode(storage, query); + final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(new MapBindingSet()); + final MapBindingSet expected = new MapBindingSet(); + expected.addBinding("wkt", VF.createLiteral("POINT (1 1)")); + expected.addBinding("time", VF.createLiteral(temp.toString())); + int count = 0; + assertTrue(rez.hasNext()); + while(rez.hasNext()) { + assertEquals(expected, rez.next()); + count++; + } + assertEquals(1, count); + } + + @Test + public void evaluate_variableSubject() throws Exception { + final EventStorage storage = new MongoEventStorage(super.getMongoClient(), "testDB"); + RyaURI subject = new RyaURI("urn:event-1111"); + Geometry geo = GF.createPoint(new Coordinate(1, 1)); + final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0); + final Event event = Event.builder() + .setSubject(subject) + .setGeometry(geo) + .setTemporalInstant(temp) + .build(); + + subject = new RyaURI("urn:event-2222"); + geo = GF.createPoint(new Coordinate(-1, -1)); + final Event otherEvent = Event.builder() + .setSubject(subject) + .setGeometry(geo) + .setTemporalInstant(temp) + .build(); + + storage.create(event); + storage.create(otherEvent); + + final String query = + "PREFIX time: <http://www.w3.org/2006/time#> \n" + + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n" + + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>" + + "SELECT ?event ?time ?point ?wkt " + + "WHERE { " + + " ?event time:atTime ?time . " + + " ?event geo:asWKT ?wkt . " + + " FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 -2, -3 -2))\"^^geo:wktLiteral)) " + + " FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) " + + "}"; + + final EventQueryNode node = buildNode(storage, query); + final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(new MapBindingSet()); + final MapBindingSet expected1 = new MapBindingSet(); + expected1.addBinding("wkt", VF.createLiteral("POINT (1 1)")); + expected1.addBinding("time", VF.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString())); + final MapBindingSet expected2 = new MapBindingSet(); + expected2.addBinding("wkt", VF.createLiteral("POINT (-1 -1)")); + expected2.addBinding("time", VF.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString())); + + final List<BindingSet> actual = new ArrayList<>(); + while(rez.hasNext()) { + actual.add(rez.next()); + } + assertEquals(expected1, actual.get(0)); + assertEquals(expected2, actual.get(1)); + assertEquals(2, actual.size()); + } + + @Test + public void evaluate_variableSubject_existingBindingset() throws Exception { + final EventStorage storage = new MongoEventStorage(super.getMongoClient(), "testDB"); + RyaURI subject = new RyaURI("urn:event-1111"); + Geometry geo = GF.createPoint(new Coordinate(1, 1)); + final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0); + final Event event = Event.builder() + .setSubject(subject) + .setGeometry(geo) + .setTemporalInstant(temp) + .build(); + + subject = new RyaURI("urn:event-2222"); + geo = GF.createPoint(new Coordinate(-1, -1)); + final Event otherEvent = Event.builder() + .setSubject(subject) + .setGeometry(geo) + .setTemporalInstant(temp) + .build(); + + storage.create(event); + storage.create(otherEvent); + + final String query = + "PREFIX time: <http://www.w3.org/2006/time#> \n" + + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n" + + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>" + + "SELECT ?event ?time ?point ?wkt " + + "WHERE { " + + " ?event time:atTime ?time . " + + " ?event geo:asWKT ?wkt . " + + " FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 -2, -3 -2))\"^^geo:wktLiteral)) " + + " FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) " + + "}"; + + final EventQueryNode node = buildNode(storage, query); + final MapBindingSet existingBindings = new MapBindingSet(); + existingBindings.addBinding("event", VF.createURI("urn:event-2222")); + final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(existingBindings); + final MapBindingSet expected = new MapBindingSet(); + expected.addBinding("wkt", VF.createLiteral("POINT (-1 -1)")); + expected.addBinding("time", VF.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString())); + + final List<BindingSet> actual = new ArrayList<>(); + while(rez.hasNext()) { + actual.add(rez.next()); + } + assertEquals(1, actual.size()); + assertEquals(expected, actual.get(0)); + } + + @Test + public void evaluate_variableSubject_existingBindingsetWrongFilters() throws Exception { + final EventStorage storage = new MongoEventStorage(super.getMongoClient(), "testDB"); + RyaURI subject = new RyaURI("urn:event-1111"); + Geometry geo = GF.createPoint(new Coordinate(1, 1)); + final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0); + final Event event = Event.builder() + .setSubject(subject) + .setGeometry(geo) + .setTemporalInstant(temp) + .build(); + + subject = new RyaURI("urn:event-2222"); + geo = GF.createPoint(new Coordinate(-10, -10)); + final Event otherEvent = Event.builder() + .setSubject(subject) + .setGeometry(geo) + .setTemporalInstant(temp) + .build(); + + storage.create(event); + storage.create(otherEvent); + + final String query = + "PREFIX time: <http://www.w3.org/2006/time#> \n" + + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n" + + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>" + + "SELECT ?event ?time ?point ?wkt " + + "WHERE { " + + " ?event time:atTime ?time . " + + " ?event geo:asWKT ?wkt . " + + " FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 -2, -3 -2))\"^^geo:wktLiteral)) " + + " FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) " + + "}"; + + final EventQueryNode node = buildNode(storage, query); + final MapBindingSet existingBindings = new MapBindingSet(); + existingBindings.addBinding("event", VF.createURI("urn:event-2222")); + final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(existingBindings); + final MapBindingSet expected = new MapBindingSet(); + expected.addBinding("wkt", VF.createLiteral("POINT (-1 -1)")); + expected.addBinding("time", VF.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString())); + + assertFalse(rez.hasNext()); + } + + private EventQueryNode buildNode(final EventStorage store, final String query) throws Exception { + final List<IndexingExpr> geoFilters = new ArrayList<>(); + final List<IndexingExpr> temporalFilters = new ArrayList<>(); + final List<StatementPattern> sps = getSps(query); + final List<FunctionCall> filters = getFilters(query); + for(final FunctionCall filter : filters) { + final URI filterURI = new URIImpl(filter.getURI()); + final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(filterURI, filter.getArgs()); + final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), extractArguments(objVar.getName(), filter)); + if(IndexingFunctionRegistry.getFunctionType(filterURI) == FUNCTION_TYPE.GEO) { + geoFilters.add(expr); + } else { + temporalFilters.add(expr); + } + } + + final StatementPattern geoPattern = sps.get(1); + final StatementPattern temporalPattern = sps.get(0); + + return new EventQueryNode.EventQueryNodeBuilder() + .setStorage(store) + .setGeoPattern(geoPattern) + .setTemporalPattern(temporalPattern) + .setGeoFilters(geoFilters) + .setTemporalFilters(temporalFilters) + .setUsedFilters(filters) + .build(); + } + + private Value[] extractArguments(final String matchName, final FunctionCall call) { + final Value args[] = new Value[call.getArgs().size() - 1]; + int argI = 0; + for (int i = 0; i != call.getArgs().size(); ++i) { + final ValueExpr arg = call.getArgs().get(i); + if (argI == i && arg instanceof Var && matchName.equals(((Var)arg).getName())) { + continue; + } + if (arg instanceof ValueConstant) { + args[argI] = ((ValueConstant)arg).getValue(); + } else if (arg instanceof Var && ((Var)arg).hasValue()) { + args[argI] = ((Var)arg).getValue(); + } else { + throw new IllegalArgumentException("Query error: Found " + arg + ", expected a Literal, BNode or URI"); + } + ++argI; + } + return args; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNodeTest.java ---------------------------------------------------------------------- diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNodeTest.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNodeTest.java deleted file mode 100644 index f0099c8..0000000 --- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNodeTest.java +++ /dev/null @@ -1,364 +0,0 @@ -/** - * 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.rya.indexing.geotemporal.model; - -import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getFilters; -import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getSps; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.rya.api.domain.RyaURI; -import org.apache.rya.indexing.IndexingExpr; -import org.apache.rya.indexing.IndexingFunctionRegistry; -import org.apache.rya.indexing.IndexingFunctionRegistry.FUNCTION_TYPE; -import org.apache.rya.indexing.TemporalInstant; -import org.apache.rya.indexing.TemporalInstantRfc3339; -import org.apache.rya.indexing.geotemporal.mongo.MongoEventStorage; -import org.apache.rya.indexing.geotemporal.storage.EventStorage; -import org.apache.rya.mongodb.MongoTestBase; -import org.junit.Test; -import org.openrdf.model.URI; -import org.openrdf.model.Value; -import org.openrdf.model.ValueFactory; -import org.openrdf.model.impl.URIImpl; -import org.openrdf.model.impl.ValueFactoryImpl; -import org.openrdf.query.BindingSet; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.algebra.FunctionCall; -import org.openrdf.query.algebra.StatementPattern; -import org.openrdf.query.algebra.ValueConstant; -import org.openrdf.query.algebra.ValueExpr; -import org.openrdf.query.algebra.Var; -import org.openrdf.query.impl.MapBindingSet; - -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.Geometry; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.geom.PrecisionModel; - -import info.aduna.iteration.CloseableIteration; - -/** - * Unit tests the methods of {@link EventQueryNode}. - */ -public class EventQueryNodeTest extends MongoTestBase { - private static final GeometryFactory GF = new GeometryFactory(new PrecisionModel(), 4326); - private static final ValueFactory VF = ValueFactoryImpl.getInstance(); - - @Test(expected = IllegalStateException.class) - public void constructor_differentSubjects() throws Exception { - final Var geoSubj = new Var("point"); - final Var geoPred = new Var("-const-http://www.opengis.net/ont/geosparql#asWKT", ValueFactoryImpl.getInstance().createURI("http://www.opengis.net/ont/geosparql#asWKT")); - final Var geoObj = new Var("wkt"); - final StatementPattern geoSP = new StatementPattern(geoSubj, geoPred, geoObj); - - final Var timeSubj = new Var("time"); - final Var timePred = new Var("-const-http://www.w3.org/2006/time#inXSDDateTime", ValueFactoryImpl.getInstance().createURI("-const-http://www.w3.org/2006/time#inXSDDateTime")); - final Var timeObj = new Var("time"); - final StatementPattern timeSP = new StatementPattern(timeSubj, timePred, timeObj); - // This will fail. - new EventQueryNode.EventQueryNodeBuilder() - .setStorage(mock(EventStorage.class)) - .setGeoPattern(geoSP) - .setTemporalPattern(timeSP) - .setGeoFilters(new ArrayList<IndexingExpr>()) - .setTemporalFilters(new ArrayList<IndexingExpr>()) - .setUsedFilters(new ArrayList<>()) - .build(); - } - - @Test(expected = IllegalStateException.class) - public void constructor_variablePredicate() throws Exception { - // A pattern that has a variable for its predicate. - final Var geoSubj = new Var("point"); - final Var geoPred = new Var("geo"); - final Var geoObj = new Var("wkt"); - final StatementPattern geoSP = new StatementPattern(geoSubj, geoPred, geoObj); - - final Var timeSubj = new Var("time"); - final Var timePred = new Var("-const-http://www.w3.org/2006/time#inXSDDateTime", ValueFactoryImpl.getInstance().createURI("-const-http://www.w3.org/2006/time#inXSDDateTime")); - final Var timeObj = new Var("time"); - final StatementPattern timeSP = new StatementPattern(timeSubj, timePred, timeObj); - // This will fail. - new EventQueryNode.EventQueryNodeBuilder() - .setStorage(mock(EventStorage.class)) - .setGeoPattern(geoSP) - .setTemporalPattern(timeSP) - .setGeoFilters(new ArrayList<IndexingExpr>()) - .setTemporalFilters(new ArrayList<IndexingExpr>()) - .setUsedFilters(new ArrayList<>()) - .build(); - } - - @Test - public void evaluate_constantSubject() throws Exception { - final EventStorage storage = new MongoEventStorage(super.getMongoClient(), "testDB"); - RyaURI subject = new RyaURI("urn:event-1111"); - final Geometry geo = GF.createPoint(new Coordinate(1, 1)); - final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0); - final Event event = Event.builder() - .setSubject(subject) - .setGeometry(geo) - .setTemporalInstant(temp) - .build(); - - subject = new RyaURI("urn:event-2222"); - final Event otherEvent = Event.builder() - .setSubject(subject) - .setGeometry(geo) - .setTemporalInstant(temp) - .build(); - - storage.create(event); - storage.create(otherEvent); - - final String query = - "PREFIX time: <http://www.w3.org/2006/time#> \n" - + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n" - + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>" - + "SELECT ?event ?time ?point ?wkt " - + "WHERE { " - + " <urn:event-1111> time:atTime ?time . " - + " <urn:event-1111> geo:asWKT ?wkt . " - + " FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 -2, -3 -2))\"^^geo:wktLiteral)) " - + " FILTER(tempo:equals(?time, \"" + temp.toString() + "\")) " - + "}"; - - final EventQueryNode node = buildNode(storage, query); - final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(new MapBindingSet()); - final MapBindingSet expected = new MapBindingSet(); - expected.addBinding("wkt", VF.createLiteral("POINT (1 1)")); - expected.addBinding("time", VF.createLiteral(temp.toString())); - int count = 0; - assertTrue(rez.hasNext()); - while(rez.hasNext()) { - assertEquals(expected, rez.next()); - count++; - } - assertEquals(1, count); - } - - @Test - public void evaluate_variableSubject() throws Exception { - final EventStorage storage = new MongoEventStorage(super.getMongoClient(), "testDB"); - RyaURI subject = new RyaURI("urn:event-1111"); - Geometry geo = GF.createPoint(new Coordinate(1, 1)); - final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0); - final Event event = Event.builder() - .setSubject(subject) - .setGeometry(geo) - .setTemporalInstant(temp) - .build(); - - subject = new RyaURI("urn:event-2222"); - geo = GF.createPoint(new Coordinate(-1, -1)); - final Event otherEvent = Event.builder() - .setSubject(subject) - .setGeometry(geo) - .setTemporalInstant(temp) - .build(); - - storage.create(event); - storage.create(otherEvent); - - final String query = - "PREFIX time: <http://www.w3.org/2006/time#> \n" - + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n" - + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>" - + "SELECT ?event ?time ?point ?wkt " - + "WHERE { " - + " ?event time:atTime ?time . " - + " ?event geo:asWKT ?wkt . " - + " FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 -2, -3 -2))\"^^geo:wktLiteral)) " - + " FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) " - + "}"; - - final EventQueryNode node = buildNode(storage, query); - final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(new MapBindingSet()); - final MapBindingSet expected1 = new MapBindingSet(); - expected1.addBinding("wkt", VF.createLiteral("POINT (1 1)")); - expected1.addBinding("time", VF.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString())); - final MapBindingSet expected2 = new MapBindingSet(); - expected2.addBinding("wkt", VF.createLiteral("POINT (-1 -1)")); - expected2.addBinding("time", VF.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString())); - - final List<BindingSet> actual = new ArrayList<>(); - while(rez.hasNext()) { - actual.add(rez.next()); - } - assertEquals(expected1, actual.get(0)); - assertEquals(expected2, actual.get(1)); - assertEquals(2, actual.size()); - } - - @Test - public void evaluate_variableSubject_existingBindingset() throws Exception { - final EventStorage storage = new MongoEventStorage(super.getMongoClient(), "testDB"); - RyaURI subject = new RyaURI("urn:event-1111"); - Geometry geo = GF.createPoint(new Coordinate(1, 1)); - final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0); - final Event event = Event.builder() - .setSubject(subject) - .setGeometry(geo) - .setTemporalInstant(temp) - .build(); - - subject = new RyaURI("urn:event-2222"); - geo = GF.createPoint(new Coordinate(-1, -1)); - final Event otherEvent = Event.builder() - .setSubject(subject) - .setGeometry(geo) - .setTemporalInstant(temp) - .build(); - - storage.create(event); - storage.create(otherEvent); - - final String query = - "PREFIX time: <http://www.w3.org/2006/time#> \n" - + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n" - + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>" - + "SELECT ?event ?time ?point ?wkt " - + "WHERE { " - + " ?event time:atTime ?time . " - + " ?event geo:asWKT ?wkt . " - + " FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 -2, -3 -2))\"^^geo:wktLiteral)) " - + " FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) " - + "}"; - - final EventQueryNode node = buildNode(storage, query); - final MapBindingSet existingBindings = new MapBindingSet(); - existingBindings.addBinding("event", VF.createURI("urn:event-2222")); - final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(existingBindings); - final MapBindingSet expected = new MapBindingSet(); - expected.addBinding("wkt", VF.createLiteral("POINT (-1 -1)")); - expected.addBinding("time", VF.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString())); - - final List<BindingSet> actual = new ArrayList<>(); - while(rez.hasNext()) { - actual.add(rez.next()); - } - assertEquals(1, actual.size()); - assertEquals(expected, actual.get(0)); - } - - @Test - public void evaluate_variableSubject_existingBindingsetWrongFilters() throws Exception { - final EventStorage storage = new MongoEventStorage(super.getMongoClient(), "testDB"); - RyaURI subject = new RyaURI("urn:event-1111"); - Geometry geo = GF.createPoint(new Coordinate(1, 1)); - final TemporalInstant temp = new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0); - final Event event = Event.builder() - .setSubject(subject) - .setGeometry(geo) - .setTemporalInstant(temp) - .build(); - - subject = new RyaURI("urn:event-2222"); - geo = GF.createPoint(new Coordinate(-10, -10)); - final Event otherEvent = Event.builder() - .setSubject(subject) - .setGeometry(geo) - .setTemporalInstant(temp) - .build(); - - storage.create(event); - storage.create(otherEvent); - - final String query = - "PREFIX time: <http://www.w3.org/2006/time#> \n" - + "PREFIX tempo: <tag:rya-rdf.org,2015:temporal#> \n" - + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>" - + "SELECT ?event ?time ?point ?wkt " - + "WHERE { " - + " ?event time:atTime ?time . " - + " ?event geo:asWKT ?wkt . " - + " FILTER(geof:sfWithin(?wkt, \"POLYGON((-3 -2, -3 2, 1 2, 1 -2, -3 -2))\"^^geo:wktLiteral)) " - + " FILTER(tempo:equals(?time, \"2015-12-30T12:00:00Z\")) " - + "}"; - - final EventQueryNode node = buildNode(storage, query); - final MapBindingSet existingBindings = new MapBindingSet(); - existingBindings.addBinding("event", VF.createURI("urn:event-2222")); - final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(existingBindings); - final MapBindingSet expected = new MapBindingSet(); - expected.addBinding("wkt", VF.createLiteral("POINT (-1 -1)")); - expected.addBinding("time", VF.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString())); - - assertFalse(rez.hasNext()); - } - - private EventQueryNode buildNode(final EventStorage store, final String query) throws Exception { - final List<IndexingExpr> geoFilters = new ArrayList<>(); - final List<IndexingExpr> temporalFilters = new ArrayList<>(); - final List<StatementPattern> sps = getSps(query); - final List<FunctionCall> filters = getFilters(query); - for(final FunctionCall filter : filters) { - final URI filterURI = new URIImpl(filter.getURI()); - final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(filterURI, filter.getArgs()); - final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), extractArguments(objVar.getName(), filter)); - if(IndexingFunctionRegistry.getFunctionType(filterURI) == FUNCTION_TYPE.GEO) { - geoFilters.add(expr); - } else { - temporalFilters.add(expr); - } - } - - final StatementPattern geoPattern = sps.get(1); - final StatementPattern temporalPattern = sps.get(0); - - return new EventQueryNode.EventQueryNodeBuilder() - .setStorage(store) - .setGeoPattern(geoPattern) - .setTemporalPattern(temporalPattern) - .setGeoFilters(geoFilters) - .setTemporalFilters(temporalFilters) - .setUsedFilters(filters) - .build(); - } - - private Value[] extractArguments(final String matchName, final FunctionCall call) { - final Value args[] = new Value[call.getArgs().size() - 1]; - int argI = 0; - for (int i = 0; i != call.getArgs().size(); ++i) { - final ValueExpr arg = call.getArgs().get(i); - if (argI == i && arg instanceof Var && matchName.equals(((Var)arg).getName())) { - continue; - } - if (arg instanceof ValueConstant) { - args[argI] = ((ValueConstant)arg).getValue(); - } else if (arg instanceof Var && ((Var)arg).hasValue()) { - args[argI] = ((Var)arg).getValue(); - } else { - throw new IllegalArgumentException("Query error: Found " + arg + ", expected a Literal, BNode or URI"); - } - ++argI; - } - return args; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java ---------------------------------------------------------------------- diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java index 392d381..125a2e4 100644 --- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java +++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java @@ -18,6 +18,10 @@ l * Licensed to the Apache Software Foundation (ASF) under one */ package org.apache.rya.indexing.geotemporal.mongo; +import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.assertEqualMongo; +import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getFilters; +import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getSps; + import java.util.ArrayList; import java.util.List; @@ -28,7 +32,6 @@ import org.apache.rya.indexing.IndexingFunctionRegistry; import org.apache.rya.indexing.IndexingFunctionRegistry.FUNCTION_TYPE; import org.apache.rya.indexing.geotemporal.GeoTemporalIndexer.GeoPolicy; import org.apache.rya.indexing.geotemporal.GeoTemporalIndexer.TemporalPolicy; -import org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils; import org.junit.Before; import org.junit.Test; import org.openrdf.model.Resource; @@ -56,7 +59,7 @@ import com.mongodb.util.JSON; * @see TemporalPolicy Temporal Filter Functions * @see GeoPolicy Geo Filter Functions */ -public class GeoTemporalMongoDBStorageStrategyTest extends GeoTemporalTestUtils { +public class GeoTemporalMongoDBStorageStrategyTest { private GeoTemporalMongoDBStorageStrategy adapter; @Before public void setup() {
