Repository: incubator-rya Updated Branches: refs/heads/master 4f5f208b1 -> 45e7018ab
RYA-387 Restored Mongo IT's that were not being exercised. Project: http://git-wip-us.apache.org/repos/asf/incubator-rya/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-rya/commit/a2ebefe1 Tree: http://git-wip-us.apache.org/repos/asf/incubator-rya/tree/a2ebefe1 Diff: http://git-wip-us.apache.org/repos/asf/incubator-rya/diff/a2ebefe1 Branch: refs/heads/master Commit: a2ebefe15bcd7c5e379edbe105e3e97e3eb2e67c Parents: 4f5f208 Author: jdasch <[email protected]> Authored: Tue Oct 3 12:43:28 2017 -0400 Committer: Caleb Meier <[email protected]> Committed: Tue Oct 3 13:40:13 2017 -0700 ---------------------------------------------------------------------- .../indexing/mongo/MongoGeoIndexerFilterIT.java | 298 +++++++++++++++++++ .../indexing/mongo/MongoIndexerDeleteIT.java | 176 +++++++++++ .../indexing/mongo/MongoGeoIndexerFilterIT.java | 298 ------------------- .../indexing/mongo/MongoIndexerDeleteIT.java | 176 ----------- 4 files changed, 474 insertions(+), 474 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/a2ebefe1/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java ---------------------------------------------------------------------- diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java new file mode 100644 index 0000000..81b45d1 --- /dev/null +++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java @@ -0,0 +1,298 @@ +/* + * 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.mongo; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.rya.api.domain.RyaStatement; +import org.apache.rya.api.resolver.RdfToRyaConversions; +import org.apache.rya.api.resolver.RyaToRdfConversions; +import org.apache.rya.indexing.GeoConstants; +import org.apache.rya.indexing.GeoRyaSailFactory; +import org.apache.rya.indexing.accumulo.ConfigUtils; +import org.apache.rya.indexing.accumulo.geo.OptionalConfigUtils; +import org.apache.rya.indexing.geotemporal.mongo.MongoITBase; +import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.openrdf.model.Resource; +import org.openrdf.model.Statement; +import org.openrdf.model.URI; +import org.openrdf.model.Value; +import org.openrdf.model.ValueFactory; +import org.openrdf.model.impl.StatementImpl; +import org.openrdf.model.impl.ValueFactoryImpl; +import org.openrdf.query.BindingSet; +import org.openrdf.query.MalformedQueryException; +import org.openrdf.query.QueryEvaluationException; +import org.openrdf.query.QueryLanguage; +import org.openrdf.query.TupleQueryResult; +import org.openrdf.repository.RepositoryException; +import org.openrdf.repository.sail.SailRepository; +import org.openrdf.repository.sail.SailRepositoryConnection; +import org.openrdf.sail.Sail; + +import com.mongodb.MongoClient; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.io.ParseException; +import com.vividsolutions.jts.io.WKTReader; +import com.vividsolutions.jts.io.WKTWriter; + +public class MongoGeoIndexerFilterIT extends MongoITBase { + private static final GeometryFactory GF = new GeometryFactory(); + private static final Geometry WASHINGTON_MONUMENT = GF.createPoint(new Coordinate(38.8895, 77.0353)); + private static final Geometry LINCOLN_MEMORIAL = GF.createPoint(new Coordinate(38.8893, 77.0502)); + private static final Geometry CAPITAL_BUILDING = GF.createPoint(new Coordinate(38.8899, 77.0091)); + private static final Geometry WHITE_HOUSE = GF.createPoint(new Coordinate(38.8977, 77.0365)); + + private static final AtomicInteger COUNTER = new AtomicInteger(1); + + private MongoClient client; + private Sail sail; + private SailRepositoryConnection conn; + @Before + public void before() throws Exception { + final MongoIndexingConfiguration indxrConf = MongoIndexingConfiguration.builder() + .setMongoCollectionPrefix("rya_") + .setMongoDBName(MongoGeoIndexerFilterIT.class.getSimpleName() + "_" + COUNTER.getAndIncrement()) + .setUseMongoFreetextIndex(false) + .setUseMongoTemporalIndex(false) + .build(); + + client = super.getMongoClient(); + indxrConf.setBoolean(OptionalConfigUtils.USE_GEO, true); + indxrConf.set(ConfigUtils.GEO_PREDICATES_LIST, "http://www.opengis.net/ont/geosparql#asWKT"); + indxrConf.setBoolean(ConfigUtils.USE_MONGO, true); + indxrConf.setMongoClient(client); + + sail = GeoRyaSailFactory.getInstance(indxrConf); + conn = new SailRepository(sail).getConnection(); + } + + @After + public void after() throws RepositoryException { + if(conn != null) { + conn.close(); + } + } + + @Test + public void nearHappyUsesTest() throws Exception { + populateRya(); + + //Only captial + String query = + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" + + "SELECT * \n" // + + "WHERE { \n" + + " <urn:geo> geo:asWKT ?point .\n" + + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, 0.0, 2000))" + + "}"; + + TupleQueryResult rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); + final List<BindingSet> results = new ArrayList<>(); + while (rez.hasNext()) { + final BindingSet bs = rez.next(); + results.add(bs); + } + assertEquals(1, results.size()); + assertEquals(CAPITAL_BUILDING, bindingToGeo(results.get(0))); + + //all but capital + query = + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" + + "SELECT * \n" // + + "WHERE { \n" + + " <urn:geo> geo:asWKT ?point .\n" + + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, 2000))" + + "}"; + + rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); + results.clear(); + while (rez.hasNext()) { + final BindingSet bs = rez.next(); + results.add(bs); + } + assertEquals(3, results.size()); + assertEquals(WASHINGTON_MONUMENT, bindingToGeo(results.get(0))); + assertEquals(WHITE_HOUSE, bindingToGeo(results.get(1))); + assertEquals(LINCOLN_MEMORIAL, bindingToGeo(results.get(2))); + + // all of them + query = + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" + + "SELECT * \n" // + + "WHERE { \n" + + " <urn:geo> geo:asWKT ?point .\n" + + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, 6000, 000))" + + "}"; + + rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); + results.clear(); + while (rez.hasNext()) { + final BindingSet bs = rez.next(); + results.add(bs); + } + assertEquals(4, results.size()); + assertEquals(WASHINGTON_MONUMENT, bindingToGeo(results.get(0))); + assertEquals(WHITE_HOUSE, bindingToGeo(results.get(1))); + assertEquals(LINCOLN_MEMORIAL, bindingToGeo(results.get(2))); + assertEquals(CAPITAL_BUILDING, bindingToGeo(results.get(3))); + + // donut, only 2 + query = + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" + + "SELECT * \n" // + + "WHERE { \n" + + " <urn:geo> geo:asWKT ?point .\n" + + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, 2000, 100))" + + "}"; + + rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); + results.clear(); + while (rez.hasNext()) { + final BindingSet bs = rez.next(); + results.add(bs); + } + assertEquals(2, results.size()); + assertEquals(WHITE_HOUSE, bindingToGeo(results.get(0))); + assertEquals(LINCOLN_MEMORIAL, bindingToGeo(results.get(1))); + + // all of them + query = + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" + + "SELECT * \n" // + + "WHERE { \n" + + " <urn:geo> geo:asWKT ?point .\n" + + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral))" + + "}"; + rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); + results.clear(); + while (rez.hasNext()) { + final BindingSet bs = rez.next(); + results.add(bs); + } + assertEquals(4, results.size()); + assertEquals(WASHINGTON_MONUMENT, bindingToGeo(results.get(0))); + assertEquals(WHITE_HOUSE, bindingToGeo(results.get(1))); + assertEquals(LINCOLN_MEMORIAL, bindingToGeo(results.get(2))); + assertEquals(CAPITAL_BUILDING, bindingToGeo(results.get(3))); + } + + @Test(expected = MalformedQueryException.class) + public void near_invalidDistance() throws Exception { + populateRya(); + + //Only captial + final String query = + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" + + "SELECT * \n" // + + "WHERE { \n" + + " <urn:geo> geo:asWKT ?point .\n" + + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, distance))" + + "}"; + + conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); + } + + @Test(expected = IllegalArgumentException.class) + public void near_negativeDistance() throws Exception { + populateRya(); + + //Only captial + final String query = + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" + + "SELECT * \n" // + + "WHERE { \n" + + " <urn:geo> geo:asWKT ?point .\n" + + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, -100))" + + "}"; + + final TupleQueryResult rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); + while(rez.hasNext()) { + rez.next(); + } + } + + @Test(expected = QueryEvaluationException.class) + public void tooManyArgumentsTest() throws Exception { + populateRya(); + + // Only captial + final String query = + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" + + "SELECT * \n" // + + "WHERE { \n" + " <urn:geo> geo:asWKT ?point .\n" + + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, 100, 1000, 10))" + + "}"; + + conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); + } + + private void populateRya() throws Exception { + // geo 2x2 points + conn.begin(); + RyaStatement stmnt = statement(WASHINGTON_MONUMENT); + Statement statement = RyaToRdfConversions.convertStatement(stmnt); + conn.add(statement); + + stmnt = statement(LINCOLN_MEMORIAL); + statement = RyaToRdfConversions.convertStatement(stmnt); + conn.add(statement); + + stmnt = statement(CAPITAL_BUILDING); + statement = RyaToRdfConversions.convertStatement(stmnt); + conn.add(statement); + + stmnt = statement(WHITE_HOUSE); + statement = RyaToRdfConversions.convertStatement(stmnt); + conn.add(statement); + conn.commit(); + } + + private static Geometry bindingToGeo(final BindingSet bs) throws ParseException { + final WKTReader w = new WKTReader(); + return w.read(bs.getValue("point").stringValue()); + } + + private static RyaStatement statement(final Geometry geo) { + final ValueFactory vf = new ValueFactoryImpl(); + final Resource subject = vf.createURI("urn:geo"); + final URI predicate = GeoConstants.GEO_AS_WKT; + final WKTWriter w = new WKTWriter(); + final Value object = vf.createLiteral(w.write(geo), GeoConstants.XMLSCHEMA_OGC_WKT); + return RdfToRyaConversions.convertStatement(new StatementImpl(subject, predicate, object)); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/a2ebefe1/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java ---------------------------------------------------------------------- diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java new file mode 100644 index 0000000..65f37c3 --- /dev/null +++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java @@ -0,0 +1,176 @@ +/* + * 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.mongo; + +import static org.junit.Assert.assertEquals; + +import org.apache.rya.api.domain.RyaStatement; +import org.apache.rya.api.resolver.RdfToRyaConversions; +import org.apache.rya.api.resolver.RyaToRdfConversions; +import org.apache.rya.indexing.GeoConstants; +import org.apache.rya.indexing.GeoRyaSailFactory; +import org.apache.rya.indexing.TemporalInstant; +import org.apache.rya.indexing.TemporalInstantRfc3339; +import org.apache.rya.indexing.accumulo.ConfigUtils; +import org.apache.rya.indexing.accumulo.geo.OptionalConfigUtils; +import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration; +import org.apache.rya.mongodb.MockMongoSingleton; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.openrdf.model.Resource; +import org.openrdf.model.Statement; +import org.openrdf.model.URI; +import org.openrdf.model.Value; +import org.openrdf.model.ValueFactory; +import org.openrdf.model.impl.StatementImpl; +import org.openrdf.model.impl.ValueFactoryImpl; +import org.openrdf.model.vocabulary.RDF; +import org.openrdf.model.vocabulary.RDFS; +import org.openrdf.query.QueryLanguage; +import org.openrdf.query.Update; +import org.openrdf.repository.sail.SailRepository; +import org.openrdf.repository.sail.SailRepositoryConnection; +import org.openrdf.sail.Sail; + +import com.mongodb.MongoClient; +import com.vividsolutions.jts.geom.Coordinate; +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jts.geom.GeometryFactory; +import com.vividsolutions.jts.io.WKTWriter; + +public class MongoIndexerDeleteIT { + private MongoClient client; + private Sail sail; + private SailRepositoryConnection conn; + + @Before + public void before() throws Exception { + final MongoIndexingConfiguration indxrConf = MongoIndexingConfiguration.builder() + .setMongoCollectionPrefix("rya_").setMongoDBName("indexerTests") + .setUseMongoFreetextIndex(true) + .setUseMongoTemporalIndex(true) + .setMongoFreeTextPredicates(RDFS.LABEL.stringValue()) + .setMongoTemporalPredicates("Property:atTime") + .build(); + + client = MockMongoSingleton.getInstance(); + indxrConf.setBoolean(OptionalConfigUtils.USE_GEO, true); + indxrConf.set(ConfigUtils.GEO_PREDICATES_LIST, "http://www.opengis.net/ont/geosparql#asWKT"); + indxrConf.setBoolean(ConfigUtils.USE_MONGO, true); + indxrConf.setMongoClient(client); + + sail = GeoRyaSailFactory.getInstance(indxrConf); + conn = new SailRepository(sail).getConnection(); + conn.begin(); + } + + @After + public void after() throws Exception { + if (conn != null) { + conn.clear(); + } + } + + @Test + public void deleteTest() throws Exception { + populateRya(); + + //The extra 1 is from the person type defined in freetext + assertEquals(8, client.getDatabase("indexerTests").getCollection("rya__triples").count()); + assertEquals(4, client.getDatabase("indexerTests").getCollection("rya_rya_geo").count()); + assertEquals(1, client.getDatabase("indexerTests").getCollection("rya_rya_temporal").count()); + assertEquals(2, client.getDatabase("indexerTests").getCollection("rya_rya_freetext").count()); + + //free text -- remove one from many + String delete = "DELETE DATA \n" // + + "{\n" + + " <urn:people> <http://www.w3.org/2000/01/rdf-schema#label> \"Alice Palace Hose\" " + + "}"; + Update update = conn.prepareUpdate(QueryLanguage.SPARQL, delete); + update.execute(); + + // temporal -- remove one from one + delete = "DELETE DATA \n" // + + "{\n" + + " <foo:time> <Property:atTime> \"0001-02-03T04:05:06Z\" " + + "}"; + + update = conn.prepareUpdate(QueryLanguage.SPARQL, delete); + update.execute(); + + //geo -- remove many from many + delete = + "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" + + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" + + "DELETE \n" // + + "{\n" + + " <urn:geo> geo:asWKT ?point \n" + + "}" + + "WHERE { \n" + + " <urn:geo> geo:asWKT ?point .\n" + + " FILTER(geof:sfWithin(?point, \"POLYGON((0 0, 2 0, 2 1, 0 1, 0 0))\"^^geo:wktLiteral))" + + "}"; + + update = conn.prepareUpdate(QueryLanguage.SPARQL, delete); + update.execute(); + + assertEquals(2, client.getDatabase("indexerTests").getCollection("rya_rya_geo").count()); + assertEquals(0, client.getDatabase("indexerTests").getCollection("rya_rya_temporal").count()); + assertEquals(1, client.getDatabase("indexerTests").getCollection("rya_rya_freetext").count()); + assertEquals(4, client.getDatabase("indexerTests").getCollection("rya__triples").count()); + } + + private void populateRya() throws Exception { + final ValueFactory VF = new ValueFactoryImpl(); + // geo 2x2 points + final GeometryFactory GF = new GeometryFactory(); + for (int x = 0; x <= 1; x++) { + for (int y = 0; y <= 1; y++) { + final Geometry geo = GF.createPoint(new Coordinate(x + .5, y + .5)); + final RyaStatement stmnt = statement(geo); + final Statement statement = RyaToRdfConversions.convertStatement(stmnt); + conn.add(statement); + } + } + + // freetext + final URI person = VF.createURI("http://example.org/ontology/Person"); + String uuid; + + uuid = "urn:people"; + conn.add(VF.createURI(uuid), RDF.TYPE, person); + conn.add(VF.createURI(uuid), RDFS.LABEL, VF.createLiteral("Alice Palace Hose", VF.createURI("http://www.w3.org/2001/XMLSchema#string"))); + conn.add(VF.createURI(uuid), RDFS.LABEL, VF.createLiteral("Bob Snob Hose", "en")); + + // temporal + final TemporalInstant instant = new TemporalInstantRfc3339(1, 2, 3, 4, 5, 6); + conn.add(VF.createURI("foo:time"), VF.createURI("Property:atTime"), VF.createLiteral(instant.toString())); + } + + private static RyaStatement statement(final Geometry geo) { + final ValueFactory vf = new ValueFactoryImpl(); + final Resource subject = vf.createURI("urn:geo"); + final URI predicate = GeoConstants.GEO_AS_WKT; + final WKTWriter w = new WKTWriter(); + final Value object = vf.createLiteral(w.write(geo), GeoConstants.XMLSCHEMA_OGC_WKT); + return RdfToRyaConversions.convertStatement(new StatementImpl(subject, predicate, object)); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/a2ebefe1/extras/rya.geoindexing/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java ---------------------------------------------------------------------- diff --git a/extras/rya.geoindexing/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java b/extras/rya.geoindexing/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java deleted file mode 100644 index e96955c..0000000 --- a/extras/rya.geoindexing/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java +++ /dev/null @@ -1,298 +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.mongo; - -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -import org.apache.rya.api.domain.RyaStatement; -import org.apache.rya.api.resolver.RdfToRyaConversions; -import org.apache.rya.api.resolver.RyaToRdfConversions; -import org.apache.rya.indexing.GeoConstants; -import org.apache.rya.indexing.GeoRyaSailFactory; -import org.apache.rya.indexing.OptionalConfigUtils; -import org.apache.rya.indexing.accumulo.ConfigUtils; -import org.apache.rya.indexing.geotemporal.mongo.MongoITBase; -import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.openrdf.model.Resource; -import org.openrdf.model.Statement; -import org.openrdf.model.URI; -import org.openrdf.model.Value; -import org.openrdf.model.ValueFactory; -import org.openrdf.model.impl.StatementImpl; -import org.openrdf.model.impl.ValueFactoryImpl; -import org.openrdf.query.BindingSet; -import org.openrdf.query.MalformedQueryException; -import org.openrdf.query.QueryEvaluationException; -import org.openrdf.query.QueryLanguage; -import org.openrdf.query.TupleQueryResult; -import org.openrdf.repository.RepositoryException; -import org.openrdf.repository.sail.SailRepository; -import org.openrdf.repository.sail.SailRepositoryConnection; -import org.openrdf.sail.Sail; - -import com.mongodb.MongoClient; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.Geometry; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.io.ParseException; -import com.vividsolutions.jts.io.WKTReader; -import com.vividsolutions.jts.io.WKTWriter; - -public class MongoGeoIndexerFilterIT extends MongoITBase { - private static final GeometryFactory GF = new GeometryFactory(); - private static final Geometry WASHINGTON_MONUMENT = GF.createPoint(new Coordinate(38.8895, 77.0353)); - private static final Geometry LINCOLN_MEMORIAL = GF.createPoint(new Coordinate(38.8893, 77.0502)); - private static final Geometry CAPITAL_BUILDING = GF.createPoint(new Coordinate(38.8899, 77.0091)); - private static final Geometry WHITE_HOUSE = GF.createPoint(new Coordinate(38.8977, 77.0365)); - - private static final AtomicInteger COUNTER = new AtomicInteger(1); - - private MongoClient client; - private Sail sail; - private SailRepositoryConnection conn; - @Before - public void before() throws Exception { - final MongoIndexingConfiguration indxrConf = MongoIndexingConfiguration.builder() - .setMongoCollectionPrefix("rya_") - .setMongoDBName(MongoGeoIndexerFilterIT.class.getSimpleName() + "_" + COUNTER.getAndIncrement()) - .setUseMongoFreetextIndex(false) - .setUseMongoTemporalIndex(false) - .build(); - - client = super.getMongoClient(); - indxrConf.setBoolean(OptionalConfigUtils.USE_GEO, true); - indxrConf.set(ConfigUtils.GEO_PREDICATES_LIST, "http://www.opengis.net/ont/geosparql#asWKT"); - indxrConf.setBoolean(ConfigUtils.USE_MONGO, true); - indxrConf.setMongoClient(client); - - sail = GeoRyaSailFactory.getInstance(indxrConf); - conn = new SailRepository(sail).getConnection(); - } - - @After - public void after() throws RepositoryException { - if(conn != null) { - conn.close(); - } - } - - @Test - public void nearHappyUsesTest() throws Exception { - populateRya(); - - //Only captial - String query = - "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" - + "SELECT * \n" // - + "WHERE { \n" - + " <urn:geo> geo:asWKT ?point .\n" - + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, 0.0, 2000))" - + "}"; - - TupleQueryResult rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); - final List<BindingSet> results = new ArrayList<>(); - while (rez.hasNext()) { - final BindingSet bs = rez.next(); - results.add(bs); - } - assertEquals(1, results.size()); - assertEquals(CAPITAL_BUILDING, bindingToGeo(results.get(0))); - - //all but capital - query = - "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" - + "SELECT * \n" // - + "WHERE { \n" - + " <urn:geo> geo:asWKT ?point .\n" - + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, 2000))" - + "}"; - - rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); - results.clear(); - while (rez.hasNext()) { - final BindingSet bs = rez.next(); - results.add(bs); - } - assertEquals(3, results.size()); - assertEquals(WASHINGTON_MONUMENT, bindingToGeo(results.get(0))); - assertEquals(WHITE_HOUSE, bindingToGeo(results.get(1))); - assertEquals(LINCOLN_MEMORIAL, bindingToGeo(results.get(2))); - - // all of them - query = - "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" - + "SELECT * \n" // - + "WHERE { \n" - + " <urn:geo> geo:asWKT ?point .\n" - + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, 6000, 000))" - + "}"; - - rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); - results.clear(); - while (rez.hasNext()) { - final BindingSet bs = rez.next(); - results.add(bs); - } - assertEquals(4, results.size()); - assertEquals(WASHINGTON_MONUMENT, bindingToGeo(results.get(0))); - assertEquals(WHITE_HOUSE, bindingToGeo(results.get(1))); - assertEquals(LINCOLN_MEMORIAL, bindingToGeo(results.get(2))); - assertEquals(CAPITAL_BUILDING, bindingToGeo(results.get(3))); - - // donut, only 2 - query = - "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" - + "SELECT * \n" // - + "WHERE { \n" - + " <urn:geo> geo:asWKT ?point .\n" - + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, 2000, 100))" - + "}"; - - rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); - results.clear(); - while (rez.hasNext()) { - final BindingSet bs = rez.next(); - results.add(bs); - } - assertEquals(2, results.size()); - assertEquals(WHITE_HOUSE, bindingToGeo(results.get(0))); - assertEquals(LINCOLN_MEMORIAL, bindingToGeo(results.get(1))); - - // all of them - query = - "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" - + "SELECT * \n" // - + "WHERE { \n" - + " <urn:geo> geo:asWKT ?point .\n" - + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral))" - + "}"; - rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); - results.clear(); - while (rez.hasNext()) { - final BindingSet bs = rez.next(); - results.add(bs); - } - assertEquals(4, results.size()); - assertEquals(WASHINGTON_MONUMENT, bindingToGeo(results.get(0))); - assertEquals(WHITE_HOUSE, bindingToGeo(results.get(1))); - assertEquals(LINCOLN_MEMORIAL, bindingToGeo(results.get(2))); - assertEquals(CAPITAL_BUILDING, bindingToGeo(results.get(3))); - } - - @Test(expected = MalformedQueryException.class) - public void near_invalidDistance() throws Exception { - populateRya(); - - //Only captial - final String query = - "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" - + "SELECT * \n" // - + "WHERE { \n" - + " <urn:geo> geo:asWKT ?point .\n" - + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, distance))" - + "}"; - - conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); - } - - @Test(expected = IllegalArgumentException.class) - public void near_negativeDistance() throws Exception { - populateRya(); - - //Only captial - final String query = - "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" - + "SELECT * \n" // - + "WHERE { \n" - + " <urn:geo> geo:asWKT ?point .\n" - + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, -100))" - + "}"; - - final TupleQueryResult rez = conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); - while(rez.hasNext()) { - rez.next(); - } - } - - @Test(expected = QueryEvaluationException.class) - public void tooManyArgumentsTest() throws Exception { - populateRya(); - - // Only captial - final String query = - "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" - + "SELECT * \n" // - + "WHERE { \n" + " <urn:geo> geo:asWKT ?point .\n" - + " FILTER(geof:sfNear(?point, \"POINT(38.8895 77.0353)\"^^geo:wktLiteral, 100, 1000, 10))" - + "}"; - - conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(); - } - - private void populateRya() throws Exception { - // geo 2x2 points - conn.begin(); - RyaStatement stmnt = statement(WASHINGTON_MONUMENT); - Statement statement = RyaToRdfConversions.convertStatement(stmnt); - conn.add(statement); - - stmnt = statement(LINCOLN_MEMORIAL); - statement = RyaToRdfConversions.convertStatement(stmnt); - conn.add(statement); - - stmnt = statement(CAPITAL_BUILDING); - statement = RyaToRdfConversions.convertStatement(stmnt); - conn.add(statement); - - stmnt = statement(WHITE_HOUSE); - statement = RyaToRdfConversions.convertStatement(stmnt); - conn.add(statement); - conn.commit(); - } - - private static Geometry bindingToGeo(final BindingSet bs) throws ParseException { - final WKTReader w = new WKTReader(); - return w.read(bs.getValue("point").stringValue()); - } - - private static RyaStatement statement(final Geometry geo) { - final ValueFactory vf = new ValueFactoryImpl(); - final Resource subject = vf.createURI("urn:geo"); - final URI predicate = GeoConstants.GEO_AS_WKT; - final WKTWriter w = new WKTWriter(); - final Value object = vf.createLiteral(w.write(geo), GeoConstants.XMLSCHEMA_OGC_WKT); - return RdfToRyaConversions.convertStatement(new StatementImpl(subject, predicate, object)); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/a2ebefe1/extras/rya.geoindexing/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java ---------------------------------------------------------------------- diff --git a/extras/rya.geoindexing/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java b/extras/rya.geoindexing/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java deleted file mode 100644 index 7473261..0000000 --- a/extras/rya.geoindexing/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java +++ /dev/null @@ -1,176 +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.mongo; - -import static org.junit.Assert.assertEquals; - -import org.apache.rya.api.domain.RyaStatement; -import org.apache.rya.api.resolver.RdfToRyaConversions; -import org.apache.rya.api.resolver.RyaToRdfConversions; -import org.apache.rya.indexing.GeoConstants; -import org.apache.rya.indexing.GeoRyaSailFactory; -import org.apache.rya.indexing.OptionalConfigUtils; -import org.apache.rya.indexing.TemporalInstant; -import org.apache.rya.indexing.TemporalInstantRfc3339; -import org.apache.rya.indexing.accumulo.ConfigUtils; -import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration; -import org.apache.rya.mongodb.MockMongoSingleton; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.openrdf.model.Resource; -import org.openrdf.model.Statement; -import org.openrdf.model.URI; -import org.openrdf.model.Value; -import org.openrdf.model.ValueFactory; -import org.openrdf.model.impl.StatementImpl; -import org.openrdf.model.impl.ValueFactoryImpl; -import org.openrdf.model.vocabulary.RDF; -import org.openrdf.model.vocabulary.RDFS; -import org.openrdf.query.QueryLanguage; -import org.openrdf.query.Update; -import org.openrdf.repository.sail.SailRepository; -import org.openrdf.repository.sail.SailRepositoryConnection; -import org.openrdf.sail.Sail; - -import com.mongodb.MongoClient; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.Geometry; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.io.WKTWriter; - -public class MongoIndexerDeleteIT { - private MongoClient client; - private Sail sail; - private SailRepositoryConnection conn; - - @Before - public void before() throws Exception { - final MongoIndexingConfiguration indxrConf = MongoIndexingConfiguration.builder() - .setMongoCollectionPrefix("rya_").setMongoDBName("indexerTests") - .setUseMongoFreetextIndex(true) - .setUseMongoTemporalIndex(true) - .setMongoFreeTextPredicates(RDFS.LABEL.stringValue()) - .setMongoTemporalPredicates("Property:atTime") - .build(); - - client = MockMongoSingleton.getInstance(); - indxrConf.setBoolean(OptionalConfigUtils.USE_GEO, true); - indxrConf.set(ConfigUtils.GEO_PREDICATES_LIST, "http://www.opengis.net/ont/geosparql#asWKT"); - indxrConf.setBoolean(ConfigUtils.USE_MONGO, true); - indxrConf.setMongoClient(client); - - sail = GeoRyaSailFactory.getInstance(indxrConf); - conn = new SailRepository(sail).getConnection(); - conn.begin(); - } - - @After - public void after() throws Exception { - if (conn != null) { - conn.clear(); - } - } - - @Test - public void deleteTest() throws Exception { - populateRya(); - - //The extra 1 is from the person type defined in freetext - assertEquals(8, client.getDatabase("indexerTests").getCollection("rya__triples").count()); - assertEquals(4, client.getDatabase("indexerTests").getCollection("rya_rya_geo").count()); - assertEquals(1, client.getDatabase("indexerTests").getCollection("rya_rya_temporal").count()); - assertEquals(2, client.getDatabase("indexerTests").getCollection("rya_rya_freetext").count()); - - //free text -- remove one from many - String delete = "DELETE DATA \n" // - + "{\n" - + " <urn:people> <http://www.w3.org/2000/01/rdf-schema#label> \"Alice Palace Hose\" " - + "}"; - Update update = conn.prepareUpdate(QueryLanguage.SPARQL, delete); - update.execute(); - - // temporal -- remove one from one - delete = "DELETE DATA \n" // - + "{\n" - + " <foo:time> <Property:atTime> \"0001-02-03T04:05:06Z\" " - + "}"; - - update = conn.prepareUpdate(QueryLanguage.SPARQL, delete); - update.execute(); - - //geo -- remove many from many - delete = - "PREFIX geo: <http://www.opengis.net/ont/geosparql#>\n" - + "PREFIX geof: <http://www.opengis.net/def/function/geosparql/>\n" - + "DELETE \n" // - + "{\n" - + " <urn:geo> geo:asWKT ?point \n" - + "}" - + "WHERE { \n" - + " <urn:geo> geo:asWKT ?point .\n" - + " FILTER(geof:sfWithin(?point, \"POLYGON((0 0, 2 0, 2 1, 0 1, 0 0))\"^^geo:wktLiteral))" - + "}"; - - update = conn.prepareUpdate(QueryLanguage.SPARQL, delete); - update.execute(); - - assertEquals(2, client.getDatabase("indexerTests").getCollection("rya_rya_geo").count()); - assertEquals(0, client.getDatabase("indexerTests").getCollection("rya_rya_temporal").count()); - assertEquals(1, client.getDatabase("indexerTests").getCollection("rya_rya_freetext").count()); - assertEquals(4, client.getDatabase("indexerTests").getCollection("rya__triples").count()); - } - - private void populateRya() throws Exception { - final ValueFactory VF = new ValueFactoryImpl(); - // geo 2x2 points - final GeometryFactory GF = new GeometryFactory(); - for (int x = 0; x <= 1; x++) { - for (int y = 0; y <= 1; y++) { - final Geometry geo = GF.createPoint(new Coordinate(x + .5, y + .5)); - final RyaStatement stmnt = statement(geo); - final Statement statement = RyaToRdfConversions.convertStatement(stmnt); - conn.add(statement); - } - } - - // freetext - final URI person = VF.createURI("http://example.org/ontology/Person"); - String uuid; - - uuid = "urn:people"; - conn.add(VF.createURI(uuid), RDF.TYPE, person); - conn.add(VF.createURI(uuid), RDFS.LABEL, VF.createLiteral("Alice Palace Hose", VF.createURI("http://www.w3.org/2001/XMLSchema#string"))); - conn.add(VF.createURI(uuid), RDFS.LABEL, VF.createLiteral("Bob Snob Hose", "en")); - - // temporal - final TemporalInstant instant = new TemporalInstantRfc3339(1, 2, 3, 4, 5, 6); - conn.add(VF.createURI("foo:time"), VF.createURI("Property:atTime"), VF.createLiteral(instant.toString())); - } - - private static RyaStatement statement(final Geometry geo) { - final ValueFactory vf = new ValueFactoryImpl(); - final Resource subject = vf.createURI("urn:geo"); - final URI predicate = GeoConstants.GEO_AS_WKT; - final WKTWriter w = new WKTWriter(); - final Value object = vf.createLiteral(w.write(geo), GeoConstants.XMLSCHEMA_OGC_WKT); - return RdfToRyaConversions.convertStatement(new StatementImpl(subject, predicate, object)); - } - -}
