Repository: incubator-rya Updated Branches: refs/heads/master 2ca854271 -> 94911ed89
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5e26bbe2/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 new file mode 100644 index 0000000..389cc28 --- /dev/null +++ b/extras/rya.geoindexing/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java @@ -0,0 +1,286 @@ +/* + * 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 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.mongodb.MongoIndexingConfiguration; +import org.apache.rya.mongodb.MockMongoFactory; +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.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 { + 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 MongoClient client; + private Sail sail; + private SailRepositoryConnection conn; + + @Before + public void before() throws Exception { + final MongoIndexingConfiguration indxrConf = MongoIndexingConfiguration.builder() + .setMongoCollectionPrefix("rya_") + .setMongoDBName("indexerTests") + .setUseMongoFreetextIndex(false) + .setUseMongoTemporalIndex(false) + .build(); + + client = MockMongoFactory.newFactory().newMongoClient(); + 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(); + } + + @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 + 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); + } + + 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/5e26bbe2/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 new file mode 100644 index 0000000..b533d42 --- /dev/null +++ b/extras/rya.geoindexing/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java @@ -0,0 +1,173 @@ +/* + * 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.MockMongoFactory; +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 = MockMongoFactory.newFactory().newMongoClient(); + 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(); + } + + @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"))); + + uuid = "urn:people"; + conn.add(VF.createURI(uuid), RDF.TYPE, person); + 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); + final URI time = VF.createURI("Property:atTime"); + 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)); + } + +}
