You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rya.apache.org by dl...@apache.org on 2018/01/04 22:07:37 UTC
[15/17] incubator-rya git commit: RYA-414 Code review. closes #256
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/4576f556/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoTemporalIndexerTest.java
----------------------------------------------------------------------
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoTemporalIndexerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoTemporalIndexerTest.java
deleted file mode 100644
index 0f8497e..0000000
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoTemporalIndexerTest.java
+++ /dev/null
@@ -1,722 +0,0 @@
-package org.apache.rya.indexing.mongo;
-
-/*
- * 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 static org.apache.rya.api.resolver.RdfToRyaConversions.convertStatement;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-import java.util.HashSet;
-
-import org.apache.accumulo.core.client.TableExistsException;
-import org.apache.accumulo.core.client.TableNotFoundException;
-import org.apache.rya.indexing.StatementConstraints;
-import org.apache.rya.indexing.TemporalInstant;
-import org.apache.rya.indexing.TemporalInstantRfc3339;
-import org.apache.rya.indexing.TemporalInterval;
-import org.apache.rya.indexing.accumulo.ConfigUtils;
-import org.apache.rya.indexing.mongodb.temporal.MongoTemporalIndexer;
-import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoTestBase;
-import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.QueryEvaluationException;
-
-import com.mongodb.DB;
-import com.mongodb.DBCollection;
-import com.mongodb.DBCursor;
-import com.mongodb.DBObject;
-import com.mongodb.MongoException;
-import com.mongodb.MongoSecurityException;
-
-import info.aduna.iteration.CloseableIteration;
-
-/**
- * JUnit tests for TemporalIndexer and it's implementation MongoTemporalIndexer
- *
- * If you enjoy this test, please read RyaTemporalIndexerTest and YagoKBTest, which contain
- * many example SPARQL queries and updates and attempts to test independently of Mongo:
- *
- * extras/indexingSail/src/test/java/org.apache/rya/indexing/Mongo/RyaTemporalIndexerTest.java
- * {@link org.apache.rya.indexing.Mongo.RyaTemporalIndexerTest}
- * {@link org.apache.rya.indexing.Mongo.YagoKBTest.java}
- *
- * Remember, this class in instantiated fresh for each @test method.
- * so fields are reset, unless they are static.
- *
- * These are covered:
- * Instance {before, equals, after} given Instance
- * Instance {before, after, inside} given Interval
- * Instance {hasBeginning, hasEnd} given Interval
- * And a few more.
- *
- */
-public final class MongoTemporalIndexerTest extends MongoTestBase {
-
- private static final String URI_PROPERTY_EVENT_TIME = "Property:event:time";
- private static final String URI_PROPERTY_CIRCA = "Property:circa";
- private static final String URI_PROPERTY_AT_TIME = "Property:atTime";
- private static final StatementConstraints EMPTY_CONSTRAINTS = new StatementConstraints();
-
- // Assign this in setUpBeforeClass, store them in each test.
- // setup() deletes table before each test.
- static final Statement spo_B00_E01;
- static final Statement spo_B03_E20;
- static final Statement spo_B02_E29;
- static final Statement spo_B02_E30;
- static final Statement spo_B02_E40;
- static final Statement spo_B02_E31;
- static final Statement spo_B29_E30;
- static final Statement spo_B30_E32;
-
- // Instants:
- static final Statement spo_B02;
- static final int SERIES_OF_SECONDS = 41;
- static final Statement seriesSpo[] = new Statement[SERIES_OF_SECONDS];
-
- // These are shared for several tests. Only the seconds are different.
- // tvB03_E20 read as: interval Begins 3 seconds, ends at 20 seconds
- static final TemporalInterval tvB00_E01 = new TemporalInterval(makeInstant(00), makeInstant(01));
- static final TemporalInterval tvB29_E30= new TemporalInterval(makeInstant(29), makeInstant(30));
- static final TemporalInterval tvB30_E32= new TemporalInterval(makeInstant(30), makeInstant(32));
- static final TemporalInterval tvB03_E20 = new TemporalInterval(makeInstant(03), makeInstant(20));
- // 30 seconds, Begins earlier, ends later
- static final TemporalInterval tvB02_E30= new TemporalInterval(makeInstant(02), makeInstant(30));
- // use for interval after
- static final TemporalInterval tvB02_E29= new TemporalInterval(makeInstant(02), makeInstant(29));
- // same as above, but ends in the middle
- static final TemporalInterval tvB02_E31 = new TemporalInterval(makeInstant(02), makeInstant(31));
- // same as above, but ends even later
- static final TemporalInterval tvB02_E40 = new TemporalInterval(makeInstant(02), makeInstant(40));
- // instant, match beginnings of several above, before tiB03_E20
- static final TemporalInstant tsB02 = makeInstant(02);
- // instant, after all above
- static final TemporalInstant tsB04 = makeInstant(04);
-
- // Create a series of instants about times 0 - 40 seconds
- static final TemporalInstant seriesTs[];
- static {
- seriesTs = new TemporalInstant[SERIES_OF_SECONDS];
- for (int i = 0; i <= 40; i++) {
- seriesTs[i] = makeInstant(i);
- }
- };
-
- /**
- * Make an uniform instant with given seconds.
- */
- static TemporalInstant makeInstant(final int secondsMakeMeUnique) {
- return new TemporalInstantRfc3339(2015, 12, 30, 12, 00, secondsMakeMeUnique);
- }
-
- static {
- // Setup the statements only once. Each test will store some of these in there own index table.
- final ValueFactory vf = new ValueFactoryImpl();
- final URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
- // tiB03_E20 read as: time interval that Begins 3 seconds, ends at 20 seconds,
- // Each time element the same, except seconds. year, month, .... minute are the same for each statement below.
- spo_B00_E01 = new StatementImpl(vf.createURI("foo:event0"), pred1_atTime, vf.createLiteral(tvB00_E01.toString()));
- spo_B02_E29 = new StatementImpl(vf.createURI("foo:event2"), pred1_atTime, vf.createLiteral(tvB02_E29.toString()));
- spo_B02_E30 = new StatementImpl(vf.createURI("foo:event2"), pred1_atTime, vf.createLiteral(tvB02_E30.toString()));
- spo_B02_E31 = new StatementImpl(vf.createURI("foo:event3"), pred1_atTime, vf.createLiteral(tvB02_E31.toString()));
- spo_B02_E40 = new StatementImpl(vf.createURI("foo:event4"), pred1_atTime, vf.createLiteral(tvB02_E40.toString()));
- spo_B03_E20 = new StatementImpl(vf.createURI("foo:event5"), pred1_atTime, vf.createLiteral(tvB03_E20.toString()));
- spo_B29_E30 = new StatementImpl(vf.createURI("foo:event1"), pred1_atTime, vf.createLiteral(tvB29_E30.toString()));
- spo_B30_E32 = new StatementImpl(vf.createURI("foo:event1"), pred1_atTime, vf.createLiteral(tvB30_E32.toString()));
- spo_B02 = new StatementImpl(vf.createURI("foo:event6"), pred1_atTime, vf.createLiteral(tsB02.getAsReadable()));
-
- // Create statements about time instants 0 - 40 seconds
- for (int i = 0; i < seriesTs.length; i++) {
- seriesSpo[i] = new StatementImpl(vf.createURI("foo:event0" + i), pred1_atTime, vf.createLiteral(seriesTs[i].getAsReadable()));
- }
- }
-
- @Override
- protected void updateConfiguration(final MongoDBRdfConfiguration conf) {
- // This is from http://linkedevents.org/ontology
- // and http://motools.sourceforge.net/event/event.html
- conf.setStrings(ConfigUtils.TEMPORAL_PREDICATES_LIST, ""
- + URI_PROPERTY_AT_TIME + ","
- + URI_PROPERTY_CIRCA + ","
- + URI_PROPERTY_EVENT_TIME);
- }
-
- /**
- * Test method for {@link MongoTemporalIndexer#storeStatement(convertStatement(org.openrdf.model.Statement)}
- */
- @Test
- public void testStoreStatement() throws IOException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- final ValueFactory vf = new ValueFactoryImpl();
-
- final URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
- final URI pred2_circa = vf.createURI(URI_PROPERTY_CIRCA);
-
- // Should not be stored because they are not in the predicate list
- final String validDateStringWithThirteens = "1313-12-13T13:13:13Z";
- tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj1"), RDFS.LABEL, vf.createLiteral(validDateStringWithThirteens))));
-
- final String invalidDateString = "ThisIsAnInvalidDate";
- tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj2"), pred1_atTime, vf.createLiteral(invalidDateString))));
-
- // These are different datetimes instant but from different time zones.
- // This is an arbitrary zone, BRST=Brazil, better if not local.
- // same as "2015-01-01T01:59:59Z"
- final String testDate2014InBRST = "2014-12-31T23:59:59-02:00";
- // next year, same as "2017-01-01T01:59:59Z"
- final String testDate2016InET = "2016-12-31T20:59:59-05:00";
-
- // These should be stored because they are in the predicate list.
- // BUT they will get converted to the same exact datetime in UTC.
- final Statement s3 = new StatementImpl(vf.createURI("foo:subj3"), pred1_atTime, vf.createLiteral(testDate2014InBRST));
- final Statement s4 = new StatementImpl(vf.createURI("foo:subj4"), pred2_circa, vf.createLiteral(testDate2016InET));
- tIndexer.storeStatement(convertStatement(s3));
- tIndexer.storeStatement(convertStatement(s4));
-
- // This should not be stored because the object is not a literal
- tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj5"), pred1_atTime, vf.createURI("in:valid"))));
-
- printTables(tIndexer, "junit testing: Temporal entities stored in testStoreStatement");
- assertEquals(2, tIndexer.getCollection().find().count());
- }
- }
-
- @Test
- public void testDelete() throws IOException, MongoException, TableNotFoundException, TableExistsException, NoSuchAlgorithmException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- final ValueFactory vf = new ValueFactoryImpl();
-
- final URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
- final URI pred2_circa = vf.createURI(URI_PROPERTY_CIRCA);
-
- final String testDate2014InBRST = "2014-12-31T23:59:59-02:00";
- final String testDate2016InET = "2016-12-31T20:59:59-05:00";
-
- // These should be stored because they are in the predicate list.
- // BUT they will get converted to the same exact datetime in UTC.
- final Statement s1 = new StatementImpl(vf.createURI("foo:subj3"), pred1_atTime, vf.createLiteral(testDate2014InBRST));
- final Statement s2 = new StatementImpl(vf.createURI("foo:subj4"), pred2_circa, vf.createLiteral(testDate2016InET));
- tIndexer.storeStatement(convertStatement(s1));
- tIndexer.storeStatement(convertStatement(s2));
-
- final String dbName = conf.getMongoDBName();
- final DB db = super.getMongoClient().getDB(dbName);
- DBCollection collection = db.getCollection(conf.get(MongoDBRdfConfiguration.MONGO_COLLECTION_PREFIX, "rya") + tIndexer.getCollectionName());
-
- printTables(tIndexer, "junit testing: Temporal entities stored in testDelete before delete");
- assertEquals("Number of rows stored.", 2, collection.count()); // 4 index entries per statement
-
- tIndexer.deleteStatement(convertStatement(s1));
- tIndexer.deleteStatement(convertStatement(s2));
-
- printTables(tIndexer, "junit testing: Temporal entities stored in testDelete after delete");
- assertEquals("Number of rows stored after delete.", 0, collection.count());
- }
- }
-
- /**
- * Test instant after a given instant.
- * From the series: instant {equal, before, after} instant
- * @throws MongoSecurityException
- * @throws MongoException
- * @throws TableNotFoundException
- */
- @Test
- public void testQueryInstantAfterInstant() throws IOException, QueryEvaluationException, TableNotFoundException, MongoException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- // tiB02_E30 read as: Begins 2 seconds, ends at 30 seconds
- // these should not match as they are not instances.
- tIndexer.storeStatement(convertStatement(spo_B03_E20));
- tIndexer.storeStatement(convertStatement(spo_B02_E30));
- tIndexer.storeStatement(convertStatement(spo_B02_E40));
- tIndexer.storeStatement(convertStatement(spo_B02_E31));
- tIndexer.storeStatement(convertStatement(spo_B30_E32));
-
- // seriesSpo[s] and seriesTs[s] are statements and instant for s seconds after the uniform time.
- final int searchForSeconds = 4;
- final int expectedResultCount = 9;
- for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here
- tIndexer.storeStatement(convertStatement(seriesSpo[s]));
- }
-
- CloseableIteration<Statement, QueryEvaluationException> iter;
- iter = tIndexer.queryInstantAfterInstant(seriesTs[searchForSeconds], EMPTY_CONSTRAINTS);
- int count = 0;
- while (iter.hasNext()) {
- final Statement s = iter.next();
- final Statement nextExpectedStatement = seriesSpo[searchForSeconds + count + 1]; // <== logic here
- assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s));
- count++;
- }
- assertEquals("Should find count of rows.", expectedResultCount, count);
- }
- }
- /**
- * Test instant before a given instant.
- * From the series: instant {equal, before, after} instant
- */
- @Test
- public void testQueryInstantBeforeInstant() throws IOException, QueryEvaluationException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- // tiB02_E30 read as: Begins 2 seconds, ends at 30 seconds
- // these should not match as they are not instances.
- tIndexer.storeStatement(convertStatement(spo_B03_E20));
- tIndexer.storeStatement(convertStatement(spo_B02_E30));
- tIndexer.storeStatement(convertStatement(spo_B02_E40));
- tIndexer.storeStatement(convertStatement(spo_B02_E31));
- tIndexer.storeStatement(convertStatement(spo_B30_E32));
-
- // seriesSpo[s] and seriesTs[s] are statements and instant for s seconds after the uniform time.
- final int searchForSeconds = 4;
- final int expectedResultCount = 4;
- for (int s = 0; s <= searchForSeconds + 15; s++) { // <== logic here
- tIndexer.storeStatement(convertStatement(seriesSpo[s]));
- }
-
- CloseableIteration<Statement, QueryEvaluationException> iter;
-
- iter = tIndexer.queryInstantBeforeInstant(seriesTs[searchForSeconds], EMPTY_CONSTRAINTS);
- int count = 0;
- while (iter.hasNext()) {
- final Statement s = iter.next();
- final Statement nextExpectedStatement = seriesSpo[count]; // <== logic here
- assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s));
- count++;
- }
- assertEquals("Should find count of rows.", expectedResultCount, count);
- }
- }
-
- /**
- * Test instant before given interval.
- * From the series: Instance {before, after, inside} given Interval
- */
- @Test
- public void testQueryInstantBeforeInterval() throws IOException, QueryEvaluationException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- // tiB02_E30 read as: Begins 2 seconds, ends at 30 seconds
- // these should not match as they are not instances.
- tIndexer.storeStatement(convertStatement(spo_B03_E20));
- tIndexer.storeStatement(convertStatement(spo_B02_E30));
- tIndexer.storeStatement(convertStatement(spo_B02_E40));
- tIndexer.storeStatement(convertStatement(spo_B02_E31));
- tIndexer.storeStatement(convertStatement(spo_B30_E32));
-
- // seriesSpo[s] and seriesTs[s] are statements and instants for s seconds after the uniform time.
- final TemporalInterval searchForSeconds = tvB02_E31;
- final int expectedResultCount = 2; // 00 and 01 seconds.
- for (int s = 0; s <= 40; s++) { // <== logic here
- tIndexer.storeStatement(convertStatement(seriesSpo[s]));
- }
-
- CloseableIteration<Statement, QueryEvaluationException> iter;
- iter = tIndexer.queryInstantBeforeInterval(searchForSeconds, EMPTY_CONSTRAINTS);
- int count = 0;
- while (iter.hasNext()) {
- final Statement s = iter.next();
- final Statement nextExpectedStatement = seriesSpo[count]; // <== logic here
- assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s));
- count++;
- }
- assertEquals("Should find count of rows.", expectedResultCount, count);
- }
- }
-
- /**
- * Test instant after given interval.
- * Instance {before, after, inside} given Interval
- */
- @Test
- public void testQueryInstantAfterInterval() throws IOException, QueryEvaluationException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- // tiB02_E30 read as: Begins 2 seconds, ends at 30 seconds
- // these should not match as they are not instances.
- tIndexer.storeStatement(convertStatement(spo_B03_E20));
- tIndexer.storeStatement(convertStatement(spo_B02_E30));
- tIndexer.storeStatement(convertStatement(spo_B02_E40));
- tIndexer.storeStatement(convertStatement(spo_B02_E31));
- tIndexer.storeStatement(convertStatement(spo_B30_E32));
-
- // seriesSpo[s] and seriesTs[s] are statements and instants for s seconds after the uniform time.
- final TemporalInterval searchAfterInterval = tvB02_E31; // from 2 to 31 seconds
- final int endingSeconds = 31;
- final int expectedResultCount = 9; // 32,33,...,40 seconds.
- for (int s = 0; s <= endingSeconds + expectedResultCount; s++) { // <== logic here
- tIndexer.storeStatement(convertStatement(seriesSpo[s]));
- }
-
- CloseableIteration<Statement, QueryEvaluationException> iter;
- iter = tIndexer.queryInstantAfterInterval(searchAfterInterval, EMPTY_CONSTRAINTS);
- int count = 0;
- while (iter.hasNext()) {
- final Statement s = iter.next();
- final Statement nextExpectedStatement = seriesSpo[count + endingSeconds + 1]; // <== logic here
- assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s));
- count++;
- }
- assertEquals("Should find count of rows.", expectedResultCount, count);
- }
- }
-
- /**
- * Test instant inside given interval.
- * Instance {before, after, inside} given Interval
- */
- @Test
- public void testQueryInstantInsideInterval() throws IOException, QueryEvaluationException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- // tiB02_E30 read as: Begins 2 seconds, ends at 30 seconds
- // these should not match as they are not instances.
- tIndexer.storeStatement(convertStatement(spo_B03_E20));
- tIndexer.storeStatement(convertStatement(spo_B02_E30));
- tIndexer.storeStatement(convertStatement(spo_B02_E40));
- tIndexer.storeStatement(convertStatement(spo_B02_E31));
- tIndexer.storeStatement(convertStatement(spo_B30_E32));
-
- // seriesSpo[s] and seriesTs[s] are statements and instants for s seconds after the uniform time.
- final TemporalInterval searchInsideInterval = tvB02_E31; // from 2 to 31 seconds
- final int beginningSeconds = 2; // <== logic here, and next few lines.
- final int endingSeconds = 31;
- final int expectedResultCount = endingSeconds - beginningSeconds - 1; // 3,4,...,30 seconds.
- for (int s = 0; s <= 40; s++) {
- tIndexer.storeStatement(convertStatement(seriesSpo[s]));
- }
-
- CloseableIteration<Statement, QueryEvaluationException> iter;
- iter = tIndexer.queryInstantInsideInterval(searchInsideInterval, EMPTY_CONSTRAINTS);
- int count = 0;
- while (iter.hasNext()) {
- final Statement s = iter.next();
- final Statement nextExpectedStatement = seriesSpo[count + beginningSeconds + 1]; // <== logic here
- assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s));
- count++;
- }
- assertEquals("Should find count of rows.", expectedResultCount, count);
- }
- }
-
- /**
- * Test instant is the Beginning of the given interval.
- * from the series: Instance {hasBeginning, hasEnd} Interval
- */
- @Test
- public void testQueryInstantHasBeginningInterval() throws IOException, QueryEvaluationException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- // tiB02_E30 read as: Begins 2 seconds, ends at 30 seconds
- // these should not match as they are not instances.
- tIndexer.storeStatement(convertStatement(spo_B03_E20));
- tIndexer.storeStatement(convertStatement(spo_B02_E30));
- tIndexer.storeStatement(convertStatement(spo_B02_E40));
- tIndexer.storeStatement(convertStatement(spo_B02_E31));
- tIndexer.storeStatement(convertStatement(spo_B30_E32));
-
- // seriesSpo[s] and seriesTs[s] are statements and instants for s seconds after the uniform time.
- final TemporalInterval searchInsideInterval = tvB02_E31; // from 2 to 31 seconds
- final int searchSeconds = 2; // <== logic here, and next few lines.
- final int expectedResultCount = 1; // 2 seconds.
- for (int s = 0; s <= 10; s++) {
- tIndexer.storeStatement(convertStatement(seriesSpo[s]));
- }
-
- CloseableIteration<Statement, QueryEvaluationException> iter;
- iter = tIndexer.queryInstantHasBeginningInterval(searchInsideInterval, EMPTY_CONSTRAINTS);
- int count = 0;
- while (iter.hasNext()) {
- final Statement s = iter.next();
- final Statement nextExpectedStatement = seriesSpo[searchSeconds]; // <== logic here
- assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s));
- count++;
- }
- assertEquals("Should find count of rows.", expectedResultCount, count);
- }
- }
-
- /**
- * Test instant is the end of the given interval.
- * from the series: Instance {hasBeginning, hasEnd} Interval
- */
- @Test
- public void testQueryInstantHasEndInterval() throws IOException, QueryEvaluationException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- // tiB02_E30 read as: Begins 2 seconds, ends at 30 seconds
- // these should not match as they are not instances.
- tIndexer.storeStatement(convertStatement(spo_B03_E20));
- tIndexer.storeStatement(convertStatement(spo_B02_E30));
- tIndexer.storeStatement(convertStatement(spo_B02_E40));
- tIndexer.storeStatement(convertStatement(spo_B02_E31));
- tIndexer.storeStatement(convertStatement(spo_B30_E32));
-
- // seriesSpo[s] and seriesTs[s] are statements and instants for s seconds after the uniform time.
- final TemporalInterval searchInsideInterval = tvB02_E31; // from 2 to 31 seconds
- final int searchSeconds = 31; // <== logic here, and next few lines.
- final int expectedResultCount = 1; // 31 seconds.
- for (int s = 0; s <= 40; s++) {
- tIndexer.storeStatement(convertStatement(seriesSpo[s]));
- }
-
- CloseableIteration<Statement, QueryEvaluationException> iter;
- iter = tIndexer.queryInstantHasEndInterval(searchInsideInterval, EMPTY_CONSTRAINTS);
- int count = 0;
- while (iter.hasNext()) {
- final Statement s = iter.next();
- final Statement nextExpectedStatement = seriesSpo[searchSeconds]; // <== logic here
- assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s));
- count++;
- }
- assertEquals("Should find count of rows.", expectedResultCount, count);
- }
- }
-
- /**
- * Test method for
- * {@link org.apache.rya.indexing.Mongo.temporal.MongoTemporalIndexer#queryIntervalEquals(TemporalInterval, StatementConstraints)}
- * .
- * @throws IOException
- * @throws QueryEvaluationException
- *
- */
- @Test
- public void testQueryIntervalEquals() throws IOException, QueryEvaluationException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- // tiB02_E30 read as: Begins 2 seconds, ends at 30 seconds
- tIndexer.storeStatement(convertStatement(spo_B03_E20));
- tIndexer.storeStatement(convertStatement(spo_B02_E30));
- tIndexer.storeStatement(convertStatement(spo_B02_E40));
- tIndexer.storeStatement(convertStatement(spo_B02_E31));
- tIndexer.storeStatement(convertStatement(spo_B30_E32));
- tIndexer.storeStatement(convertStatement(seriesSpo[4])); // instance at 4 seconds
-
-
- CloseableIteration<Statement, QueryEvaluationException> iter;
- iter = tIndexer.queryIntervalEquals(tvB02_E40, EMPTY_CONSTRAINTS);
- // Should be found twice:
- assertTrue("queryIntervalEquals: spo_B02_E40 should be found, but actually returned empty results. spo_B02_E40=" + spo_B02_E40, iter.hasNext());
- assertTrue("queryIntervalEquals: spo_B02_E40 should be found, but does not match.", spo_B02_E40.equals(iter.next()));
- assertFalse("queryIntervalEquals: Find no more than one, but actually has more.", iter.hasNext());
- }
- }
-
- /**
- * Test interval before a given interval, for method:
- * {@link MongoTemporalIndexer#queryIntervalBefore(TemporalInterval, StatementConstraints)}.
- *
- * @throws IOException
- * @throws QueryEvaluationException
- */
- @Test
- public void testQueryIntervalBefore() throws IOException, QueryEvaluationException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- // tiB02_E30 read as: Begins 2 seconds, ends at 30 seconds
- tIndexer.storeStatement(convertStatement(spo_B00_E01));
- tIndexer.storeStatement(convertStatement(spo_B02_E30));
- tIndexer.storeStatement(convertStatement(spo_B02_E31));
- tIndexer.storeStatement(convertStatement(spo_B02_E40));
- tIndexer.storeStatement(convertStatement(spo_B03_E20));
- // instants should be ignored.
- tIndexer.storeStatement(convertStatement(spo_B30_E32));
- tIndexer.storeStatement(convertStatement(seriesSpo[1])); // instance at 1 seconds
- tIndexer.storeStatement(convertStatement(seriesSpo[2]));
- tIndexer.storeStatement(convertStatement(seriesSpo[31]));
-
-
- CloseableIteration<Statement, QueryEvaluationException> iter;
- iter = tIndexer.queryIntervalBefore(tvB02_E31, EMPTY_CONSTRAINTS);
- // Should be found twice:
- assertTrue("spo_B00_E01 should be found, but actually returned empty results. spo_B00_E01=" + spo_B00_E01, iter.hasNext());
- assertTrue("spo_B00_E01 should be found, but found another.", spo_B00_E01.equals(iter.next()));
- assertFalse("Find no more than one, but actually has more.", iter.hasNext());
- }
- }
-
- /**
- * interval is after the given interval. Find interval beginnings after the endings of the given interval.
- * {@link MongoTemporalIndexer#queryIntervalAfter(TemporalInterval, StatementContraints).
- *
- * @throws IOException
- * @throws QueryEvaluationException
- */
- @Test
- public void testQueryIntervalAfter() throws IOException, QueryEvaluationException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- // tiB02_E30 read as: Begins 2 seconds, ends at 30 seconds
- tIndexer.storeStatement(convertStatement(spo_B00_E01));
- tIndexer.storeStatement(convertStatement(spo_B02_E29)); //<- after this one.
- tIndexer.storeStatement(convertStatement(spo_B02_E30));
- tIndexer.storeStatement(convertStatement(spo_B02_E31));
- tIndexer.storeStatement(convertStatement(spo_B02_E40));
- tIndexer.storeStatement(convertStatement(spo_B03_E20));
- tIndexer.storeStatement(convertStatement(spo_B29_E30));
- tIndexer.storeStatement(convertStatement(spo_B30_E32));
- // instants should be ignored.
- tIndexer.storeStatement(convertStatement(spo_B02));
- tIndexer.storeStatement(convertStatement(seriesSpo[1])); // instance at 1 seconds
- tIndexer.storeStatement(convertStatement(seriesSpo[2]));
- tIndexer.storeStatement(convertStatement(seriesSpo[31]));
-
- CloseableIteration<Statement, QueryEvaluationException> iter;
- iter = tIndexer.queryIntervalAfter(tvB02_E29, EMPTY_CONSTRAINTS);
- // Should be found twice:
- assertTrue("spo_B30_E32 should be found, but actually returned empty results. spo_B30_E32=" + spo_B30_E32, iter.hasNext());
- final Statement s = iter.next();
- assertTrue("spo_B30_E32 should be found, but found another. spo_B30_E32="+spo_B30_E32+", but found="+s, spo_B30_E32.equals(s));
- assertFalse("Find no more than one, but actually has more.", iter.hasNext());
- }
- }
-
- /**
- * Test instant after a given instant WITH two different predicates as constraints.
- */
- @Test
- public void testQueryWithMultiplePredicates() throws IOException, QueryEvaluationException {
- try(MongoTemporalIndexer tIndexer = new MongoTemporalIndexer()) {
- tIndexer.setConf(conf);
- tIndexer.init();
-
- // tiB02_E30 read as: Begins 2 seconds, ends at 30 seconds
- // these should not match as they are not instances.
- tIndexer.storeStatement(convertStatement(spo_B03_E20));
- tIndexer.storeStatement(convertStatement(spo_B02_E30));
- tIndexer.storeStatement(convertStatement(spo_B02_E40));
- tIndexer.storeStatement(convertStatement(spo_B02_E31));
- tIndexer.storeStatement(convertStatement(spo_B30_E32));
-
- // seriesSpo[s] and seriesTs[s] are statements and instant for s seconds after the uniform time.
- final int searchForSeconds = 4;
- final int expectedResultCount = 9;
- for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here
- tIndexer.storeStatement(convertStatement(seriesSpo[s]));
- }
- final ValueFactory vf = new ValueFactoryImpl();
- final URI pred3_CIRCA_ = vf.createURI(URI_PROPERTY_CIRCA); // this one to ignore.
- final URI pred2_eventTime = vf.createURI(URI_PROPERTY_EVENT_TIME);
- final URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
-
- // add the predicate = EventTime ; Store in an array for verification.
- final Statement[] SeriesTs_EventTime = new Statement[expectedResultCount+1];
- for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here
- final Statement statement = new StatementImpl(vf.createURI("foo:EventTimeSubj0" + s), pred2_eventTime, vf.createLiteral(seriesTs[s].getAsReadable()));
- tIndexer.storeStatement(convertStatement(statement));
- if (s>searchForSeconds) {
- SeriesTs_EventTime[s - searchForSeconds -1 ] = statement;
- }
- }
- // add the predicate = CIRCA ; to be ignored because it is not in the constraints.
- for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here
- final Statement statement = new StatementImpl(vf.createURI("foo:CircaEventSubj0" + s), pred3_CIRCA_, vf.createLiteral(seriesTs[s].getAsReadable()));
- tIndexer.storeStatement(convertStatement(statement));
- }
-
- CloseableIteration<Statement, QueryEvaluationException> iter;
- final StatementConstraints constraints = new StatementConstraints();
- constraints.setPredicates(new HashSet<>(Arrays.asList( pred2_eventTime, pred1_atTime )));
-
- iter = tIndexer.queryInstantAfterInstant(seriesTs[searchForSeconds], constraints); // EMPTY_CONSTRAINTS);//
- int count_AtTime = 0;
- int count_EventTime = 0;
- while (iter.hasNext()) {
- final Statement s = iter.next();
- final Statement nextExpectedStatement = seriesSpo[searchForSeconds + count_AtTime + 1]; // <== logic here
- if (s.getPredicate().equals(pred1_atTime)) {
- assertTrue("Should match atTime: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s));
- count_AtTime++;
- }
- else if (s.getPredicate().equals(pred2_eventTime)) {
- assertTrue("Should match eventTime: " + SeriesTs_EventTime[count_EventTime] + " == " + s, SeriesTs_EventTime[count_EventTime].equals(s));
- count_EventTime++;
- } else {
- assertTrue("This predicate should not be returned: "+s, false);
- }
-
- }
-
- assertEquals("Should find count of atTime rows.", expectedResultCount, count_AtTime);
- assertEquals("Should find count of eventTime rows.", expectedResultCount, count_EventTime);
- }
- }
-
- /**
- * Print and gather statistics on the entire index table.
- *
- * @param description
- * Printed to the console to find the test case.
- * @param out
- * null or System.out or other output to send a listing.
- * @param statistics
- * Hashes, sums, and counts for assertions.
- * @return Count of entries in the index table.
- * @throws IOException
- */
- public void printTables(MongoTemporalIndexer tIndexer, final String description) throws IOException {
- System.out.println("-- start printTables() -- " + description);
- System.out.println("Reading : " + tIndexer.getCollection().getFullName());
- final DBCursor cursor = tIndexer.getCollection().find();
- while(cursor.hasNext()) {
- final DBObject dbo = cursor.next();
- System.out.println(dbo.toString());
- }
- System.out.println();
- }
-}