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));
+    }
+
+}

Reply via email to