http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/geo/GeoIndexerTest.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/geo/GeoIndexerTest.java b/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/geo/GeoIndexerTest.java deleted file mode 100644 index 8ca96bc..0000000 --- a/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/geo/GeoIndexerTest.java +++ /dev/null @@ -1,370 +0,0 @@ -package mvm.rya.indexing.accumulo.geo; - -/* - * 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 mvm.rya.api.resolver.RdfToRyaConversions.convertStatement; -import info.aduna.iteration.CloseableIteration; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - -import mvm.rya.indexing.StatementContraints; -import mvm.rya.indexing.accumulo.ConfigUtils; - -import org.apache.accumulo.core.client.admin.TableOperations; -import org.apache.hadoop.conf.Configuration; -import org.junit.Assert; -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.ContextStatementImpl; -import org.openrdf.model.impl.StatementImpl; -import org.openrdf.model.impl.ValueFactoryImpl; - -import com.google.common.collect.Sets; -import com.vividsolutions.jts.geom.Coordinate; -import com.vividsolutions.jts.geom.GeometryFactory; -import com.vividsolutions.jts.geom.LinearRing; -import com.vividsolutions.jts.geom.Point; -import com.vividsolutions.jts.geom.Polygon; -import com.vividsolutions.jts.geom.PrecisionModel; -import com.vividsolutions.jts.geom.impl.PackedCoordinateSequence; - -public class GeoIndexerTest { - - private static final StatementContraints EMPTY_CONSTRAINTS = new StatementContraints(); - - Configuration conf; - GeometryFactory gf = new GeometryFactory(new PrecisionModel(), 4326); - - @Before - public void before() throws Exception { - System.out.println(UUID.randomUUID().toString()); - String tableName = "triplestore_geospacial"; - conf = new Configuration(); - conf.setBoolean(ConfigUtils.USE_MOCK_INSTANCE, true); - conf.set(ConfigUtils.CLOUDBASE_USER, "USERNAME"); - conf.set(ConfigUtils.CLOUDBASE_PASSWORD, "PASS"); - conf.set(ConfigUtils.GEO_TABLENAME, tableName); - conf.set(ConfigUtils.CLOUDBASE_AUTHS, "U"); - - TableOperations tops = ConfigUtils.getConnector(conf).tableOperations(); - // get all of the table names with the prefix - Set<String> toDel = Sets.newHashSet(); - for (String t : tops.list()){ - if (t.startsWith(tableName)){ - toDel.add(t); - } - } - for (String t : toDel) { - tops.delete(t); - } - } - - @Test - public void testRestrictPredicatesSearch() throws Exception { - conf.setStrings(ConfigUtils.GEO_PREDICATES_LIST, "pred:1,pred:2"); - GeoMesaGeoIndexer f = new GeoMesaGeoIndexer(); - f.setConf(conf); - - ValueFactory vf = new ValueFactoryImpl(); - - Point point = gf.createPoint(new Coordinate(10, 10)); - Value pointValue = vf.createLiteral("Point(10 10)", GeoConstants.XMLSCHEMA_OGC_WKT); - URI invalidPredicate = GeoConstants.GEO_AS_WKT; - - // These should not be stored because they are not in the predicate list - f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj1"), invalidPredicate, pointValue))); - f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj2"), invalidPredicate, pointValue))); - - URI pred1 = vf.createURI("pred:1"); - URI pred2 = vf.createURI("pred:2"); - - // These should be stored because they are in the predicate list - Statement s3 = new StatementImpl(vf.createURI("foo:subj3"), pred1, pointValue); - Statement s4 = new StatementImpl(vf.createURI("foo:subj4"), pred2, pointValue); - f.storeStatement(convertStatement(s3)); - f.storeStatement(convertStatement(s4)); - - // This should not be stored because the object is not valid wkt - f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj5"), pred1, vf.createLiteral("soint(10 10)")))); - - // This should not be stored because the object is not a literal - f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj6"), pred1, vf.createURI("p:Point(10 10)")))); - - f.flush(); - - Set<Statement> actual = getSet(f.queryEquals(point, EMPTY_CONSTRAINTS)); - Assert.assertEquals(2, actual.size()); - Assert.assertTrue(actual.contains(s3)); - Assert.assertTrue(actual.contains(s4)); - - f.close(); - } - - private static <X> Set<X> getSet(CloseableIteration<X, ?> iter) throws Exception { - Set<X> set = new HashSet<X>(); - while (iter.hasNext()) { - set.add(iter.next()); - } - return set; - } - - @Test - public void testPrimeMeridianSearch() throws Exception { - - GeoMesaGeoIndexer f = new GeoMesaGeoIndexer(); - f.setConf(conf); - - ValueFactory vf = new ValueFactoryImpl(); - Resource subject = vf.createURI("foo:subj"); - URI predicate = GeoConstants.GEO_AS_WKT; - Value object = vf.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT); - Resource context = vf.createURI("foo:context"); - - Statement statement = new ContextStatementImpl(subject, predicate, object, context); - f.storeStatement(convertStatement(statement)); - f.flush(); - - double[] ONE = { 1, 1, -1, 1, -1, -1, 1, -1, 1, 1 }; - double[] TWO = { 2, 2, -2, 2, -2, -2, 2, -2, 2, 2 }; - double[] THREE = { 3, 3, -3, 3, -3, -3, 3, -3, 3, 3 }; - - LinearRing r1 = gf.createLinearRing(new PackedCoordinateSequence.Double(ONE, 2)); - LinearRing r2 = gf.createLinearRing(new PackedCoordinateSequence.Double(TWO, 2)); - LinearRing r3 = gf.createLinearRing(new PackedCoordinateSequence.Double(THREE, 2)); - - Polygon p1 = gf.createPolygon(r1, new LinearRing[] {}); - Polygon p2 = gf.createPolygon(r2, new LinearRing[] {}); - Polygon p3 = gf.createPolygon(r3, new LinearRing[] {}); - - Assert.assertEquals(Sets.newHashSet(statement), getSet(f.queryWithin(p1, EMPTY_CONSTRAINTS))); - Assert.assertEquals(Sets.newHashSet(statement), getSet(f.queryWithin(p2, EMPTY_CONSTRAINTS))); - Assert.assertEquals(Sets.newHashSet(statement), getSet(f.queryWithin(p3, EMPTY_CONSTRAINTS))); - - // Test a ring with a hole in it - Polygon p3m2 = gf.createPolygon(r3, new LinearRing[] { r2 }); - Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p3m2, EMPTY_CONSTRAINTS))); - - // test a ring outside the point - double[] OUT = { 3, 3, 1, 3, 1, 1, 3, 1, 3, 3 }; - LinearRing rOut = gf.createLinearRing(new PackedCoordinateSequence.Double(OUT, 2)); - Polygon pOut = gf.createPolygon(rOut, new LinearRing[] {}); - Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(pOut, EMPTY_CONSTRAINTS))); - - f.close(); - } - - @Test - public void testDcSearch() throws Exception { - // test a ring around dc - GeoMesaGeoIndexer f = new GeoMesaGeoIndexer(); - f.setConf(conf); - - ValueFactory vf = new ValueFactoryImpl(); - Resource subject = vf.createURI("foo:subj"); - URI predicate = GeoConstants.GEO_AS_WKT; - Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT); - Resource context = vf.createURI("foo:context"); - - Statement statement = new ContextStatementImpl(subject, predicate, object, context); - f.storeStatement(convertStatement(statement)); - f.flush(); - - double[] IN = { -78, 39, -77, 39, -77, 38, -78, 38, -78, 39 }; - LinearRing r1 = gf.createLinearRing(new PackedCoordinateSequence.Double(IN, 2)); - Polygon p1 = gf.createPolygon(r1, new LinearRing[] {}); - Assert.assertEquals(Sets.newHashSet(statement), getSet(f.queryWithin(p1, EMPTY_CONSTRAINTS))); - - // test a ring outside the point - double[] OUT = { -77, 39, -76, 39, -76, 38, -77, 38, -77, 39 }; - LinearRing rOut = gf.createLinearRing(new PackedCoordinateSequence.Double(OUT, 2)); - Polygon pOut = gf.createPolygon(rOut, new LinearRing[] {}); - Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(pOut, EMPTY_CONSTRAINTS))); - - f.close(); - } - - @Test - public void testDcSearchWithContext() throws Exception { - // test a ring around dc - GeoMesaGeoIndexer f = new GeoMesaGeoIndexer(); - f.setConf(conf); - - ValueFactory vf = new ValueFactoryImpl(); - Resource subject = vf.createURI("foo:subj"); - URI predicate = GeoConstants.GEO_AS_WKT; - Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT); - Resource context = vf.createURI("foo:context"); - - Statement statement = new ContextStatementImpl(subject, predicate, object, context); - f.storeStatement(convertStatement(statement)); - f.flush(); - - double[] IN = { -78, 39, -77, 39, -77, 38, -78, 38, -78, 39 }; - LinearRing r1 = gf.createLinearRing(new PackedCoordinateSequence.Double(IN, 2)); - Polygon p1 = gf.createPolygon(r1, new LinearRing[] {}); - - // query with correct context - Assert.assertEquals(Sets.newHashSet(statement), getSet(f.queryWithin(p1, new StatementContraints().setContext(context)))); - - // query with wrong context - Assert.assertEquals(Sets.newHashSet(), - getSet(f.queryWithin(p1, new StatementContraints().setContext(vf.createURI("foo:context2"))))); - - f.close(); - } - - @Test - public void testDcSearchWithSubject() throws Exception { - // test a ring around dc - GeoMesaGeoIndexer f = new GeoMesaGeoIndexer(); - f.setConf(conf); - - ValueFactory vf = new ValueFactoryImpl(); - Resource subject = vf.createURI("foo:subj"); - URI predicate = GeoConstants.GEO_AS_WKT; - Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT); - Resource context = vf.createURI("foo:context"); - - Statement statement = new ContextStatementImpl(subject, predicate, object, context); - f.storeStatement(convertStatement(statement)); - f.flush(); - - double[] IN = { -78, 39, -77, 39, -77, 38, -78, 38, -78, 39 }; - LinearRing r1 = gf.createLinearRing(new PackedCoordinateSequence.Double(IN, 2)); - Polygon p1 = gf.createPolygon(r1, new LinearRing[] {}); - - // query with correct subject - Assert.assertEquals(Sets.newHashSet(statement), getSet(f.queryWithin(p1, new StatementContraints().setSubject(subject)))); - - // query with wrong subject - Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementContraints().setSubject(vf.createURI("foo:subj2"))))); - - f.close(); - } - - @Test - public void testDcSearchWithSubjectAndContext() throws Exception { - // test a ring around dc - GeoMesaGeoIndexer f = new GeoMesaGeoIndexer(); - f.setConf(conf); - - ValueFactory vf = new ValueFactoryImpl(); - Resource subject = vf.createURI("foo:subj"); - URI predicate = GeoConstants.GEO_AS_WKT; - Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT); - Resource context = vf.createURI("foo:context"); - - Statement statement = new ContextStatementImpl(subject, predicate, object, context); - f.storeStatement(convertStatement(statement)); - f.flush(); - - double[] IN = { -78, 39, -77, 39, -77, 38, -78, 38, -78, 39 }; - LinearRing r1 = gf.createLinearRing(new PackedCoordinateSequence.Double(IN, 2)); - Polygon p1 = gf.createPolygon(r1, new LinearRing[] {}); - - // query with correct context subject - Assert.assertEquals(Sets.newHashSet(statement), - getSet(f.queryWithin(p1, new StatementContraints().setContext(context).setSubject(subject)))); - - // query with wrong context - Assert.assertEquals(Sets.newHashSet(), - getSet(f.queryWithin(p1, new StatementContraints().setContext(vf.createURI("foo:context2"))))); - - // query with wrong subject - Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementContraints().setSubject(vf.createURI("foo:subj2"))))); - - f.close(); - } - - @Test - public void testDcSearchWithPredicate() throws Exception { - // test a ring around dc - GeoMesaGeoIndexer f = new GeoMesaGeoIndexer(); - f.setConf(conf); - - ValueFactory vf = new ValueFactoryImpl(); - Resource subject = vf.createURI("foo:subj"); - URI predicate = GeoConstants.GEO_AS_WKT; - Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT); - Resource context = vf.createURI("foo:context"); - - Statement statement = new ContextStatementImpl(subject, predicate, object, context); - f.storeStatement(convertStatement(statement)); - f.flush(); - - double[] IN = { -78, 39, -77, 39, -77, 38, -78, 38, -78, 39 }; - LinearRing r1 = gf.createLinearRing(new PackedCoordinateSequence.Double(IN, 2)); - Polygon p1 = gf.createPolygon(r1, new LinearRing[] {}); - - // query with correct Predicate - Assert.assertEquals(Sets.newHashSet(statement), - getSet(f.queryWithin(p1, new StatementContraints().setPredicates(Collections.singleton(predicate))))); - - // query with wrong predicate - Assert.assertEquals(Sets.newHashSet(), - getSet(f.queryWithin(p1, new StatementContraints().setPredicates(Collections.singleton(vf.createURI("other:pred")))))); - - f.close(); - } - - // @Test - public void testAntiMeridianSearch() throws Exception { - // verify that a search works if the bounding box crosses the anti meridian - GeoMesaGeoIndexer f = new GeoMesaGeoIndexer(); - f.setConf(conf); - - ValueFactory vf = new ValueFactoryImpl(); - Resource context = vf.createURI("foo:context"); - - Resource subjectEast = vf.createURI("foo:subj:east"); - URI predicateEast = GeoConstants.GEO_AS_WKT; - Value objectEast = vf.createLiteral("Point(179 0)", GeoConstants.XMLSCHEMA_OGC_WKT); - Statement statementEast = new ContextStatementImpl(subjectEast, predicateEast, objectEast, context); - f.storeStatement(convertStatement(statementEast)); - - Resource subjectWest = vf.createURI("foo:subj:west"); - URI predicateWest = GeoConstants.GEO_AS_WKT; - Value objectWest = vf.createLiteral("Point(-179 0)", GeoConstants.XMLSCHEMA_OGC_WKT); - Statement statementWest = new ContextStatementImpl(subjectWest, predicateWest, objectWest, context); - f.storeStatement(convertStatement(statementWest)); - - f.flush(); - - double[] ONE = { 178.1, 1, -178, 1, -178, -1, 178.1, -1, 178.1, 1 }; - - LinearRing r1 = gf.createLinearRing(new PackedCoordinateSequence.Double(ONE, 2)); - - Polygon p1 = gf.createPolygon(r1, new LinearRing[] {}); - - Assert.assertEquals(Sets.newHashSet(statementEast, statementWest), getSet(f.queryWithin(p1, EMPTY_CONSTRAINTS))); - - f.close(); - } -}
http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/AccumuloTemporalIndexerTest.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/AccumuloTemporalIndexerTest.java b/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/AccumuloTemporalIndexerTest.java deleted file mode 100644 index 60d237d..0000000 --- a/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/AccumuloTemporalIndexerTest.java +++ /dev/null @@ -1,1040 +0,0 @@ -/** - * - */ -package mvm.rya.indexing.accumulo.temporal; - -/* - * 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 mvm.rya.api.resolver.RdfToRyaConversions.convertStatement; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import info.aduna.iteration.CloseableIteration; - -import java.io.IOException; -import java.io.PrintStream; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.atomic.AtomicLong; - -import junit.framework.Assert; -import mvm.rya.api.domain.RyaStatement; -import mvm.rya.indexing.StatementContraints; -import mvm.rya.indexing.TemporalInstant; -import mvm.rya.indexing.TemporalInterval; -import mvm.rya.indexing.accumulo.ConfigUtils; -import mvm.rya.indexing.accumulo.StatementSerializer; - -import org.apache.accumulo.core.Constants; -import org.apache.accumulo.core.client.AccumuloException; -import org.apache.accumulo.core.client.AccumuloSecurityException; -import org.apache.accumulo.core.client.Scanner; -import org.apache.accumulo.core.client.TableExistsException; -import org.apache.accumulo.core.client.TableNotFoundException; -import org.apache.accumulo.core.client.admin.TableOperations; -import org.apache.accumulo.core.data.Key; -import org.apache.accumulo.core.data.Value; -import org.apache.commons.codec.binary.StringUtils; -import org.apache.commons.io.output.NullOutputStream; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.io.Text; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -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.beust.jcommander.internal.Lists; - -/** - * JUnit tests for TemporalIndexer and it's implementation AccumuloTemporalIndexer - * - * If you enjoy this test, please read RyaTemporalIndexerTest and YagoKBTest, which contain - * many example SPARQL queries and updates and attempts to test independently of Accumulo: - * - * extras/indexingSail/src/test/java/mvm/rya/indexing/accumulo/RyaTemporalIndexerTest.java - * {@link mvm.rya.indexing.accumulo.RyaTemporalIndexerTest} - * {@link mvm.rya.indexing.accumulo.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 AccumuloTemporalIndexerTest { - // Configuration properties, this is reset per test in setup. - Configuration conf; - // temporal indexer to test, this is created for each test method by setup. - AccumuloTemporalIndexer tIndexer; - - 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 String STAT_COUNT = "count"; - private static final String STAT_KEYHASH = "keyhash"; - private static final String STAT_VALUEHASH = "valuehash"; - private static final String TEST_TEMPORAL_INDEX_TABLE_NAME = "testTemporalIndex"; - private static final StatementContraints EMPTY_CONSTRAINTS = new StatementContraints(); - - // Recreate table name for each test instance in this JVM. - String uniquePerTestTemporalIndexTableName = TEST_TEMPORAL_INDEX_TABLE_NAME + String.format("%05d", nextTableSuffixAtomic.getAndIncrement()); - // start at 0, for uniqueness between jvm's consider AtomicLong(new Random().nextLong()) - private static final AtomicLong nextTableSuffixAtomic = new AtomicLong(); - - // 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(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. - ValueFactory vf = new ValueFactoryImpl(); - 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())); - } - - } - - /** - * @throws java.lang.Exception - */ - @BeforeClass - public static void setUpBeforeClass() throws Exception { - } - - /** - * Create a table for test after deleting it. - */ - private static void createTable(Configuration conf, String tablename) - throws AccumuloException, AccumuloSecurityException, TableNotFoundException, TableExistsException { - TableOperations tableOps = ConfigUtils.getConnector(conf).tableOperations(); - if (tableOps.exists(tablename)) { - tableOps.delete(tablename); - } - tableOps.create(tablename); - } - - /** - * @throws java.lang.Exception - */ - @AfterClass - public static void tearDownAfterClass() throws Exception { - } - - /** - * @throws java.lang.Exception - */ - @Before - public void setUp() throws Exception { - conf = new Configuration(); - conf.setBoolean(ConfigUtils.USE_MOCK_INSTANCE, true); - conf.set(ConfigUtils.TEMPORAL_TABLENAME, uniquePerTestTemporalIndexTableName); - // 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); - - // delete and create table - createTable(conf, uniquePerTestTemporalIndexTableName); - tIndexer = new AccumuloTemporalIndexer(); - tIndexer.setConf(conf); - } - - /** - * @throws java.lang.Exception - */ - @After - public void tearDown() throws Exception { - tIndexer.close(); - TableOperations tableOps = ConfigUtils.getConnector(conf).tableOperations(); - - if (tableOps.exists(uniquePerTestTemporalIndexTableName)) - tableOps.delete(uniquePerTestTemporalIndexTableName); - } - - /** - * Test method for {@link AccumuloTemporalIndexer#TemporalIndexerImpl(org.apache.hadoop.conf.Configuration)} . - * - * @throws TableExistsException - * @throws TableNotFoundException - * @throws AccumuloSecurityException - * @throws AccumuloException - * @throws IOException - */ - @Test - public void testTemporalIndexerImpl() - throws AccumuloException, AccumuloSecurityException, TableNotFoundException, TableExistsException, IOException { - assertNotNull("Constructed.", tIndexer.toString()); - } - - /** - * Test method for {@link AccumuloTemporalIndexer#storeStatement(convertStatement(org.openrdf.model.Statement)} - * - * @throws NoSuchAlgorithmException - */ - @Test - public void testStoreStatement() throws IOException, AccumuloException, AccumuloSecurityException, TableNotFoundException, TableExistsException, NoSuchAlgorithmException { - // count rows expected to store: - int rowsStoredExpected = 0; - - ValueFactory vf = new ValueFactoryImpl(); - - URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME); - URI pred2_circa = vf.createURI(URI_PROPERTY_CIRCA); - - // Should not be stored because they are not in the predicate list - String validDateStringWithThirteens = "1313-12-13T13:13:13Z"; - tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj1"), RDFS.LABEL, vf.createLiteral(validDateStringWithThirteens)))); - - // Test: Should not store an improper date, and log a warning (log warning not tested). - final String invalidDateString = "ThisIsAnInvalidDate"; -// // Silently logs a warning for bad dates. Old: Set true when we catch the error: -// boolean catchErrorThrownCorrectly = false; -// try { - tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj2"), pred1_atTime, vf.createLiteral(invalidDateString)))); -// } catch (IllegalArgumentException e) { -// catchErrorThrownCorrectly = true; -// Assert.assertTrue( -// "Invalid date parse error should include the invalid string. message=" + e.getMessage(), -// e.getMessage().contains(invalidDateString)); -// } -// Assert.assertTrue("Invalid date parse error should be thrown for this bad date=" + invalidDateString, catchErrorThrownCorrectly); - - // 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. - Statement s3 = new StatementImpl(vf.createURI("foo:subj3"), pred1_atTime, vf.createLiteral(testDate2014InBRST)); - Statement s4 = new StatementImpl(vf.createURI("foo:subj4"), pred2_circa, vf.createLiteral(testDate2016InET)); - tIndexer.storeStatement(convertStatement(s3)); - rowsStoredExpected++; - tIndexer.storeStatement(convertStatement(s4)); - rowsStoredExpected++; - - // 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")))); - - tIndexer.flush(); - - int rowsStoredActual = printTables("junit testing: Temporal entities stored in testStoreStatement", null, null); - Assert.assertEquals("Number of rows stored.", rowsStoredExpected*4, rowsStoredActual); // 4 index entries per statement - - } - - @Test - public void testStoreStatementWithInterestingLiterals() throws Exception { - ValueFactory vf = new ValueFactoryImpl(); - - URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME); - - tIndexer.storeStatement(convertStatement(new StatementImpl( - vf.createURI("foo:subj2"), - pred1_atTime, - vf.createLiteral("A number of organizations located, gathered, or classed together. [Derived from Concise Oxford English Dictionary, 11th Edition, 2008]")))); - - int rowsStoredActual = printTables("junit testing: Temporal entities stored in testStoreStatement", null, null); - Assert.assertEquals("Number of rows stored.", 0, rowsStoredActual); // 4 index entries per statement - } - - /** - * Test method for {@link AccumuloTemporalIndexer#storeStatement(convertStatement(org.openrdf.model.Statement)} - * - * @throws NoSuchAlgorithmException - */ - @Test - public void testStoreStatementBadInterval() throws IOException, AccumuloException, AccumuloSecurityException, TableNotFoundException, TableExistsException, NoSuchAlgorithmException { - // count rows expected to store: - int rowsStoredExpected = 0; - - ValueFactory vf = new ValueFactoryImpl(); - URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME); - - // Test: Should not store an improper date interval, and log a warning (log warning not tested). - final String invalidDateIntervalString="[bad,interval]"; - // Silently logs a warning for bad dates. - tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj1"), pred1_atTime, vf.createLiteral(invalidDateIntervalString)))); - - final String validDateIntervalString="[2016-12-31T20:59:59-05:00,2016-12-31T21:00:00-05:00]"; - tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj2"), pred1_atTime, vf.createLiteral(validDateIntervalString)))); - rowsStoredExpected++; - - tIndexer.flush(); - - int rowsStoredActual = printTables("junit testing: Temporal intervals stored in testStoreStatement", null, null); - Assert.assertEquals("Only good intervals should be stored.", rowsStoredExpected*2, rowsStoredActual); // 2 index entries per interval statement - } - - @Test - public void testStoreStatementsSameTime() throws IOException, NoSuchAlgorithmException, AccumuloException, AccumuloSecurityException, TableNotFoundException, TableExistsException - { - ValueFactory vf = new ValueFactoryImpl(); - URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME); - URI pred2_circa = vf.createURI(URI_PROPERTY_CIRCA); - - // These are the same datetime instant but from different time - // zones. - // This is an arbitrary zone, BRST=Brazil, better if not local. - final String ZONETestDateInBRST = "2014-12-31T23:59:59-02:00"; - final String ZONETestDateInZulu = "2015-01-01T01:59:59Z"; - final String ZONETestDateInET = "2014-12-31T20:59:59-05:00"; - - // These all should be stored because they are in the predicate list. - // BUT they will get converted to the same exact datetime in UTC. - // So we have to make the key distinct! Good luck indexer! - Statement s1 = new StatementImpl(vf.createURI("foo:subj1"), pred2_circa, vf.createLiteral(ZONETestDateInET)); - Statement s2 = new StatementImpl(vf.createURI("foo:subj2"), pred1_atTime, vf.createLiteral(ZONETestDateInZulu)); - Statement s3 = new StatementImpl(vf.createURI("foo:subj3"), pred1_atTime, vf.createLiteral(ZONETestDateInBRST)); - int rowsStoredExpected = 0; - tIndexer.storeStatement(convertStatement(s1)); - rowsStoredExpected++; - tIndexer.storeStatement(convertStatement(s2)); - rowsStoredExpected++; - tIndexer.storeStatement(convertStatement(s3)); - rowsStoredExpected++; - int rowsStoredActual = printTables("junit testing: Duplicate times stored", null /*System.out*/, null); - Assert.assertEquals("Number of Duplicate times stored, 1 means duplicates not handled correctly.", rowsStoredExpected*4, rowsStoredActual); - } - - /** - * Test method for {@link AccumuloTemporalIndexer#storeStatements(java.util.Collection)} . - * - * @throws TableExistsException - * @throws TableNotFoundException - * @throws AccumuloSecurityException - * @throws AccumuloException - * @throws IOException - * @throws IllegalArgumentException - * @throws NoSuchAlgorithmException - */ - @Test - public void testStoreStatements() - throws AccumuloException, AccumuloSecurityException, TableNotFoundException, TableExistsException, IllegalArgumentException, IOException, - NoSuchAlgorithmException { - long valueHash = 0; - Collection<Statement> statements = new ArrayList<Statement>(70); - statements.addAll(Arrays.asList(seriesSpo)); - int rowsStoredExpected = statements.size()*4; // instants store 4 each - // hash the expected output: - for (Statement statement : statements) { - valueHash = hasher(valueHash, StringUtils.getBytesUtf8(StatementSerializer.writeStatement(statement))); - valueHash = hasher(valueHash, StringUtils.getBytesUtf8(StatementSerializer.writeStatement(statement))); - valueHash = hasher(valueHash, StringUtils.getBytesUtf8(StatementSerializer.writeStatement(statement))); - valueHash = hasher(valueHash, StringUtils.getBytesUtf8(StatementSerializer.writeStatement(statement))); - } - statements.add(spo_B02_E30); - rowsStoredExpected += 2; // intervals store two dates - statements.add(spo_B30_E32); - rowsStoredExpected += 2; // intervals store two dates - valueHash = hasher(valueHash, StringUtils.getBytesUtf8(StatementSerializer.writeStatement(spo_B02_E30))); - valueHash = hasher(valueHash, StringUtils.getBytesUtf8(StatementSerializer.writeStatement(spo_B02_E30))); - valueHash = hasher(valueHash, StringUtils.getBytesUtf8(StatementSerializer.writeStatement(spo_B30_E32))); - valueHash = hasher(valueHash, StringUtils.getBytesUtf8(StatementSerializer.writeStatement(spo_B30_E32))); - // duplicates will overwrite old ones, no change in the output except timestamps - statements.add(spo_B30_E32); - statements.add(spo_B30_E32); - - List<RyaStatement> ryaStatements = Lists.newArrayList(); - for (Statement s : statements){ ryaStatements.add(convertStatement(s));} - tIndexer.storeStatements(ryaStatements); - - Map<String, Long> statistics = new HashMap<String, Long>(); - int rowsStoredActual = printTables("junit testing: StoreStatements multiple statements", null, statistics); - Assert.assertEquals("Number of rows stored.", rowsStoredExpected, rowsStoredActual); // 4 index entries per statement - Assert.assertEquals("value hash.", valueHash, statistics.get(STAT_VALUEHASH).longValue()); - } - - /** - * test this classe's hash method to check un-ordered results. - */ - @Test - public void testSelfTestHashMethod() { - // self test on the hash method: - long hash01dup1 = hasher(0, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - long hash01dup2 = hasher(0, new byte[] { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }); - Assert.assertEquals("same numbers, different sequence, hash should be the same.", hash01dup1, hash01dup2); - - // this one fails for sum hash, passes for XOR - long hash02dup1 = hasher(0, new byte[] { 123, 2, 1, 1 }); - hash02dup1 = hasher(hash02dup1, new byte[] { 123, 1, 1, 2 }); - long hash02dup2 = hasher(0, new byte[] { 123, 1, 1, 2 }); - hash02dup2 = hasher(hash02dup2, new byte[] { 123, 1, 3, 0, 0 }); - Assert.assertTrue("Different numbers, should be different hashes: " + hash02dup1 + " != " + hash02dup2, hash02dup1 != hash02dup2); - } - /** - * Test instant equal to a given instant. - * From the series: instant {equal, before, after} instant - * @throws AccumuloSecurityException - * @throws AccumuloException - * @throws TableNotFoundException - */ - @Test - public void testQueryInstantEqualsInstant() throws IOException, QueryEvaluationException, TableNotFoundException, AccumuloException, AccumuloSecurityException { - // 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)); - int expectedStoreCount = 5 * 2; // two entries for intervals - - // seriesSpo[s] and seriesTs[s] are statements and instant for s seconds after the uniform time. - int searchForSeconds = 5; - int expectedResultCount = 1; - for (int s = 0; s <= searchForSeconds + 3; s++) { // <== logic here - tIndexer.storeStatement(convertStatement(seriesSpo[s])); - expectedStoreCount+=4; //4 entries per statement. - } - tIndexer.flush(); - - int rowsStoredActual = printTables("junit testing: testQueryInstantEqualsInstant 0 to 8 seconds and 5 intervals stored. expectedStoreCount="+expectedStoreCount, null /*System.out*/, null); - Assert.assertEquals("Should find count of rows.", expectedStoreCount, rowsStoredActual); - - CloseableIteration<Statement, QueryEvaluationException> iter; - iter = tIndexer.queryInstantEqualsInstant(seriesTs[searchForSeconds], EMPTY_CONSTRAINTS); // <== logic here - int count = 0; - while (iter.hasNext()) { - Statement s = iter.next(); - Statement nextExpectedStatement = seriesSpo[searchForSeconds]; // <== logic here - assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s)); - count++; - } - Assert.assertEquals("Should find count of rows.", expectedResultCount, count); - - } - - /** - * Test instant after a given instant. - * From the series: instant {equal, before, after} instant - * @throws AccumuloSecurityException - * @throws AccumuloException - * @throws TableNotFoundException - */ - @Test - public void testQueryInstantAfterInstant() throws IOException, QueryEvaluationException, TableNotFoundException, AccumuloException, AccumuloSecurityException { - // 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. - int searchForSeconds = 4; - int expectedResultCount = 9; - for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here - tIndexer.storeStatement(convertStatement(seriesSpo[s])); - } - tIndexer.flush(); - CloseableIteration<Statement, QueryEvaluationException> iter; - iter = tIndexer.queryInstantAfterInstant(seriesTs[searchForSeconds], EMPTY_CONSTRAINTS); - int count = 0; - while (iter.hasNext()) { - Statement s = iter.next(); - Statement nextExpectedStatement = seriesSpo[searchForSeconds + count + 1]; // <== logic here - assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s)); - count++; - } - Assert.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 { - // 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. - int searchForSeconds = 4; - int expectedResultCount = 4; - for (int s = 0; s <= searchForSeconds + 15; s++) { // <== logic here - tIndexer.storeStatement(convertStatement(seriesSpo[s])); - } - tIndexer.flush(); - CloseableIteration<Statement, QueryEvaluationException> iter; - - iter = tIndexer.queryInstantBeforeInstant(seriesTs[searchForSeconds], EMPTY_CONSTRAINTS); - int count = 0; - while (iter.hasNext()) { - Statement s = iter.next(); - Statement nextExpectedStatement = seriesSpo[count]; // <== logic here - assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s)); - count++; - } - Assert.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 { - // 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. - TemporalInterval searchForSeconds = tvB02_E31; - int expectedResultCount = 2; // 00 and 01 seconds. - for (int s = 0; s <= 40; s++) { // <== logic here - tIndexer.storeStatement(convertStatement(seriesSpo[s])); - } - tIndexer.flush(); - CloseableIteration<Statement, QueryEvaluationException> iter; - iter = tIndexer.queryInstantBeforeInterval(searchForSeconds, EMPTY_CONSTRAINTS); - int count = 0; - while (iter.hasNext()) { - Statement s = iter.next(); - Statement nextExpectedStatement = seriesSpo[count]; // <== logic here - assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s)); - count++; - } - Assert.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 { - // 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. - TemporalInterval searchAfterInterval = tvB02_E31; // from 2 to 31 seconds - int endingSeconds = 31; - int expectedResultCount = 9; // 32,33,...,40 seconds. - for (int s = 0; s <= endingSeconds + expectedResultCount; s++) { // <== logic here - tIndexer.storeStatement(convertStatement(seriesSpo[s])); - } - tIndexer.flush(); - CloseableIteration<Statement, QueryEvaluationException> iter; - iter = tIndexer.queryInstantAfterInterval(searchAfterInterval, EMPTY_CONSTRAINTS); - int count = 0; - while (iter.hasNext()) { - Statement s = iter.next(); - Statement nextExpectedStatement = seriesSpo[count + endingSeconds + 1]; // <== logic here - assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s)); - count++; - } - Assert.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 { - // 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. - TemporalInterval searchInsideInterval = tvB02_E31; // from 2 to 31 seconds - int beginningSeconds = 2; // <== logic here, and next few lines. - int endingSeconds = 31; - int expectedResultCount = endingSeconds - beginningSeconds - 1; // 3,4,...,30 seconds. - for (int s = 0; s <= 40; s++) { - tIndexer.storeStatement(convertStatement(seriesSpo[s])); - } - tIndexer.flush(); - CloseableIteration<Statement, QueryEvaluationException> iter; - iter = tIndexer.queryInstantInsideInterval(searchInsideInterval, EMPTY_CONSTRAINTS); - int count = 0; - while (iter.hasNext()) { - Statement s = iter.next(); - Statement nextExpectedStatement = seriesSpo[count + beginningSeconds + 1]; // <== logic here - assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s)); - count++; - } - Assert.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 { - // 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. - TemporalInterval searchInsideInterval = tvB02_E31; // from 2 to 31 seconds - int searchSeconds = 2; // <== logic here, and next few lines. - int expectedResultCount = 1; // 2 seconds. - for (int s = 0; s <= 10; s++) { - tIndexer.storeStatement(convertStatement(seriesSpo[s])); - } - tIndexer.flush(); - CloseableIteration<Statement, QueryEvaluationException> iter; - iter = tIndexer.queryInstantHasBeginningInterval(searchInsideInterval, EMPTY_CONSTRAINTS); - int count = 0; - while (iter.hasNext()) { - Statement s = iter.next(); - Statement nextExpectedStatement = seriesSpo[searchSeconds]; // <== logic here - assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s)); - count++; - } - Assert.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 { - // 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. - TemporalInterval searchInsideInterval = tvB02_E31; // from 2 to 31 seconds - int searchSeconds = 31; // <== logic here, and next few lines. - int expectedResultCount = 1; // 31 seconds. - for (int s = 0; s <= 40; s++) { - tIndexer.storeStatement(convertStatement(seriesSpo[s])); - } - tIndexer.flush(); - CloseableIteration<Statement, QueryEvaluationException> iter; - iter = tIndexer.queryInstantHasEndInterval(searchInsideInterval, EMPTY_CONSTRAINTS); - int count = 0; - while (iter.hasNext()) { - Statement s = iter.next(); - Statement nextExpectedStatement = seriesSpo[searchSeconds]; // <== logic here - assertTrue("Should match: " + nextExpectedStatement + " == " + s, nextExpectedStatement.equals(s)); - count++; - } - Assert.assertEquals("Should find count of rows.", expectedResultCount, count); - } - - /** - * Test method for - * {@link mvm.rya.indexing.accumulo.temporal.AccumuloTemporalIndexer#queryIntervalEquals(TemporalInterval, StatementContraints)} - * . - * @throws IOException - * @throws QueryEvaluationException - * - */ - @Test - public void testQueryIntervalEquals() throws IOException, QueryEvaluationException { - // 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 - tIndexer.flush(); - - CloseableIteration<Statement, QueryEvaluationException> iter; - iter = tIndexer.queryIntervalEquals(tvB02_E40, EMPTY_CONSTRAINTS); - // Should be found twice: - Assert.assertTrue("queryIntervalEquals: spo_B02_E40 should be found, but actually returned empty results. spo_B02_E40=" + spo_B02_E40, iter.hasNext()); - Assert.assertTrue("queryIntervalEquals: spo_B02_E40 should be found, but does not match.", spo_B02_E40.equals(iter.next())); - Assert.assertFalse("queryIntervalEquals: Find no more than one, but actually has more.", iter.hasNext()); - } - - /** - * Test interval before a given interval, for method: - * {@link AccumuloTemporalIndexer#queryIntervalBefore(TemporalInterval, StatementContraints)}. - * - * @throws IOException - * @throws QueryEvaluationException - */ - @Test - public void testQueryIntervalBefore() throws IOException, QueryEvaluationException { - // 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])); - tIndexer.flush(); - - CloseableIteration<Statement, QueryEvaluationException> iter; - iter = tIndexer.queryIntervalBefore(tvB02_E31, EMPTY_CONSTRAINTS); - // Should be found twice: - Assert.assertTrue("spo_B00_E01 should be found, but actually returned empty results. spo_B00_E01=" + spo_B00_E01, iter.hasNext()); - Assert.assertTrue("spo_B00_E01 should be found, but found another.", spo_B00_E01.equals(iter.next())); - Assert.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 AccumuloTemporalIndexer#queryIntervalAfter(TemporalInterval, StatementContraints). - * - * @throws IOException - * @throws QueryEvaluationException - */ - @Test - public void testQueryIntervalAfter() throws IOException, QueryEvaluationException { - // 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])); - tIndexer.flush(); - - CloseableIteration<Statement, QueryEvaluationException> iter; - iter = tIndexer.queryIntervalAfter(tvB02_E29, EMPTY_CONSTRAINTS); - // Should be found twice: - Assert.assertTrue("spo_B30_E32 should be found, but actually returned empty results. spo_B30_E32=" + spo_B30_E32, iter.hasNext()); - Statement s = iter.next(); - Assert.assertTrue("spo_B30_E32 should be found, but found another. spo_B30_E32="+spo_B30_E32+", but found="+s, spo_B30_E32.equals(s)); - Assert.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 { - // 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. - int searchForSeconds = 4; - int expectedResultCount = 9; - for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here - tIndexer.storeStatement(convertStatement(seriesSpo[s])); - } - ValueFactory vf = new ValueFactoryImpl(); - URI pred3_CIRCA_ = vf.createURI(URI_PROPERTY_CIRCA); // this one to ignore. - URI pred2_eventTime = vf.createURI(URI_PROPERTY_EVENT_TIME); - URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME); - - // add the predicate = EventTime ; Store in an array for verification. - Statement[] SeriesTs_EventTime = new Statement[expectedResultCount+1]; - for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here - 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 - Statement statement = new StatementImpl(vf.createURI("foo:CircaEventSubj0" + s), pred3_CIRCA_, vf.createLiteral(seriesTs[s].getAsReadable())); - tIndexer.storeStatement(convertStatement(statement)); - } - tIndexer.flush(); - CloseableIteration<Statement, QueryEvaluationException> iter; - StatementContraints constraints = new StatementContraints(); - constraints.setPredicates(new HashSet<URI>(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()) { - Statement s = iter.next(); - //System.out.println("testQueryWithMultiplePredicates result="+s); - 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); - } - - } - - Assert.assertEquals("Should find count of atTime rows.", expectedResultCount, count_AtTime); - Assert.assertEquals("Should find count of eventTime rows.", expectedResultCount, count_EventTime); - } - - - /** - * Test method for {@link AccumuloTemporalIndexer#getIndexablePredicates()} . - * - * @throws TableExistsException - * @throws TableNotFoundException - * @throws AccumuloSecurityException - * @throws AccumuloException - * @throws IOException - */ - @Test - public void testGetIndexablePredicates() throws AccumuloException, AccumuloSecurityException, TableNotFoundException, TableExistsException, IOException { - Set<URI> p = tIndexer.getIndexablePredicates(); - Assert.assertEquals("number of predicates returned:", 3, p.size()); - } - - /** - * Count all the entries in the temporal index table, return the count. - * Uses printTables for reliability. - * - */ - public int countAllRowsInTable() throws AccumuloException, AccumuloSecurityException, TableNotFoundException, NoSuchAlgorithmException { - return printTables("Counting rows.", null, null); - } - - /** - * 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. - */ - public int printTables(String description, PrintStream out, Map<String, Long> statistics) - throws TableNotFoundException, AccumuloException, AccumuloSecurityException - { - if (out == null) { - out = new PrintStream(new NullOutputStream()); - } - out.println("-- start printTables() -- " + description); - String FORMAT = "%-20s %-20s %-40s %-40s\n"; - int rowsPrinted = 0; - long keyHasher = 0; - long valueHasher = 0; - out.println("Reading : " + this.uniquePerTestTemporalIndexTableName); - out.format(FORMAT, "--Row--", "--ColumnFamily--", "--ColumnQualifier--", "--Value--"); - - Scanner s = ConfigUtils.getConnector(conf).createScanner(this.uniquePerTestTemporalIndexTableName, Constants.NO_AUTHS); - for (Entry<Key, org.apache.accumulo.core.data.Value> entry : s) { - rowsPrinted++; - Key k = entry.getKey(); - out.format(FORMAT, toHumanString(k.getRow()), - toHumanString(k.getColumnFamily()), - toHumanString(k.getColumnQualifier()), - toHumanString(entry.getValue())); - keyHasher = hasher(keyHasher, (StringUtils.getBytesUtf8(entry.getKey().toStringNoTime()))); - valueHasher = hasher(valueHasher, (entry.getValue().get())); - } - out.println(); - // } - - if (statistics != null) { - statistics.put(STAT_COUNT, (long) rowsPrinted); - statistics.put(STAT_KEYHASH, keyHasher); - statistics.put(STAT_VALUEHASH, valueHasher); - } - - return rowsPrinted; - - } - - /** - * Order independent hashcode. - * Read more: http://stackoverflow.com/questions/18021643/hashing-a-set-of-integers-in-an-order-independent-way - * - * @param hashcode - * @param list - * @return - */ - private static long hasher(long hashcode, byte[] list) { - long sum = 0; - for (byte val : list) { - sum += 1L + val; - } - hashcode ^= sum; - return hashcode; - } - - /** - * convert a non-utf8 byte[] and text and value to string and show unprintable bytes as {xx} where x is hex. - * @param value - * @return Human readable representation. - */ - static String toHumanString(Value value) { - return toHumanString(value==null?null:value.get()); - } - static String toHumanString(Text text) { - return toHumanString(text==null?null:text.copyBytes()); - } - static String toHumanString(byte[] bytes) { - if (bytes==null) - return "{null}"; - StringBuilder sb = new StringBuilder(); - for (byte b : bytes) { - if ((b > 0x7e) || (b < 32)) { - sb.append("{"); - sb.append(Integer.toHexString( b & 0xff )); // Lop off the sign extended ones. - sb.append("}"); - } else if (b == '{'||b == '}') { // Escape the literal braces. - sb.append("{"); - sb.append((char)b); - sb.append("}"); - } else - sb.append((char)b); - } - return sb.toString(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/TemporalInstantTest.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/TemporalInstantTest.java b/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/TemporalInstantTest.java deleted file mode 100644 index 6363372..0000000 --- a/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/TemporalInstantTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package mvm.rya.indexing.accumulo.temporal; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; - -import mvm.rya.indexing.TemporalInstant; - -import org.apache.commons.codec.binary.StringUtils; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.joda.time.format.ISODateTimeFormat; -import org.junit.Assert; -import org.junit.Test; - -public class TemporalInstantTest { - @Test - public void constructorTest() throws Exception { - TemporalInstant instant = new TemporalInstantRfc3339(2014, 12, 30, // - 12, 59, 59); - // YYYY-MM-DDThh:mm:ssZ - String stringTestDate01 = "2014-12-30T12:59:59Z"; - Date dateTestDate01 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX") - .parse(stringTestDate01); - Assert.assertEquals(stringTestDate01, instant.getAsKeyString()); - Assert.assertArrayEquals(StringUtils.getBytesUtf8(instant.getAsKeyString()), instant.getAsKeyBytes()); - Assert.assertTrue("Key must be normalized to time zone Zulu",instant.getAsKeyString().endsWith("Z")); - // show the local time us. - // Warning, if test is run in the London, or Zulu time zone, this test will be same as above, with the Z. - // TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // this does not affect the library, don't use. - String stringLocalTestDate01 = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssXXX").format(dateTestDate01); - // for ET, will be: "2014-12-30T07:59:59-05:00" - //instant.getAsDateTime().withZone(null); -// System.out.println("===System.getProperty(user.timezone)="+System.getProperty("user.timezone")); //=ET -// System.out.println("===============TimeZone.getDefault()="+TimeZone.getDefault()); //=ET -// System.out.println("===========DateTimeZone.getDefault()="+DateTimeZone.getDefault()); //=UTC (wrong!) - // the timezone default gets set to UTC by some prior test, fix it here. - DateTimeZone newTimeZone = null; - try { - String id = System.getProperty("user.timezone"); - if (id != null) { - newTimeZone = DateTimeZone.forID(id); - } - } catch (RuntimeException ex) { - // ignored - } - if (newTimeZone == null) { - newTimeZone = DateTimeZone.forTimeZone(TimeZone.getDefault()); - } - DateTimeZone.setDefault(newTimeZone); - // null timezone means use the default: - Assert.assertEquals("Joda time library (actual) should use same local timezone as Java date (expected).", stringLocalTestDate01, instant.getAsReadable(null)); - } - @Test - public void zoneTestTest() throws Exception { - final String ZONETestDateInBRST = "2014-12-31T23:59:59-02:00"; // arbitrary zone, BRST=Brazil, better if not local. - final String ZONETestDateInZulu = "2015-01-01T01:59:59Z"; - final String ZONETestDateInET = "2014-12-31T20:59:59-05:00"; - TemporalInstant instant = new TemporalInstantRfc3339(DateTime.parse(ZONETestDateInBRST)); - - Assert.assertEquals("Test our test Zulu, ET strings.", ZONETestDateInET, DateTime.parse(ZONETestDateInZulu).withZone(DateTimeZone.forID("-05:00")).toString(ISODateTimeFormat.dateTimeNoMillis())); - Assert.assertEquals("Test our test BRST,Zulu strings.", ZONETestDateInZulu, DateTime.parse(ZONETestDateInBRST).withZone(DateTimeZone.UTC).toString(ISODateTimeFormat.dateTimeNoMillis())); - - Assert.assertTrue("Key must be normalized to time zone Zulu: "+instant.getAsKeyString(), instant.getAsKeyString().endsWith("Z")); - Assert.assertEquals("Key must be normalized from BRST -02:00", ZONETestDateInZulu, instant.getAsKeyString()); - Assert.assertArrayEquals(StringUtils.getBytesUtf8(instant.getAsKeyString()), instant.getAsKeyBytes()); - - Assert.assertTrue( "Ignore original time zone.", ! ZONETestDateInBRST.equals( instant.getAsReadable(DateTimeZone.forID("-07:00")))); - Assert.assertEquals( "Use original time zone.", ZONETestDateInBRST, instant.getAsDateTime().toString(TemporalInstantRfc3339.FORMATTER)); - Assert.assertEquals( "Time at specified time zone.", ZONETestDateInET, instant.getAsReadable(DateTimeZone.forID("-05:00"))); - - instant = new TemporalInstantRfc3339(DateTime.parse(ZONETestDateInZulu)); - Assert.assertEquals("expect a time with specified time zone.", ZONETestDateInET, instant.getAsReadable(DateTimeZone.forID("-05:00"))); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-rya/blob/5a03ef61/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/TemporalIntervalTest.java ---------------------------------------------------------------------- diff --git a/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/TemporalIntervalTest.java b/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/TemporalIntervalTest.java deleted file mode 100644 index 6213826..0000000 --- a/extras/indexing/src/test/java/mvm/rya/indexing/accumulo/temporal/TemporalIntervalTest.java +++ /dev/null @@ -1,178 +0,0 @@ -package mvm.rya.indexing.accumulo.temporal; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -import java.util.Arrays; - -import mvm.rya.indexing.TemporalInstant; -import mvm.rya.indexing.TemporalInterval; - -import org.joda.time.DateTime; -import org.junit.Assert; -import org.junit.Test; - -public class TemporalIntervalTest { - @Test - public void constructorTest() throws Exception { - TemporalInterval ti = new TemporalInterval( // - new TemporalInstantRfc3339(2014, 12, 30, 12, 59, 59), // - new TemporalInstantRfc3339(2014, 12, 30, 13, 00, 00)); // - Assert.assertNotNull(ti.getAsKeyBeginning()); - Assert.assertNotNull(ti.getHasEnd()); - } - @Test - public void constructorBadArgTest() throws Exception { - // the end precedes the beginning: - try { - TemporalInterval ti = new TemporalInterval( // - new TemporalInstantRfc3339(2017, 12, 30, 12, 59, 59), // - new TemporalInstantRfc3339( 820, 12, 30, 12, 59, 59)); // the invention of algebra. - Assert.assertFalse("Constructor should throw an error if the beginning is after the end, but no error for interval:"+ti, true); - }catch (IllegalArgumentException e) { - // expected to catch this error. - } - } - - @Test - public void relationsTest() throws Exception { - - TemporalInterval ti01 = new TemporalInterval( - new TemporalInstantRfc3339(2015, 12, 30, 12, 59, 59), // - new TemporalInstantRfc3339(2016, 12, 30, 13, 00, 00)); // - - TemporalInterval ti02 = new TemporalInterval( - new TemporalInstantRfc3339(2015, 12, 30, 12, 59, 59), // - new TemporalInstantRfc3339(2016, 12, 30, 13, 00, 00)); // - - Assert.assertTrue("same constructor parameters, should be equal.", - ti01.equals(ti02)); - Assert.assertTrue( - "same constructor parameters, should compare 0 equal.", - 0 == ti01.compareTo(ti02)); - - } - - @Test - public void keyBeginTest() throws Exception { - // 58 seconds, earlier - TemporalInterval beginTI01 = new TemporalInterval( - new TemporalInstantRfc3339(2015, 12, 30, 12, 59, 58), // - new TemporalInstantRfc3339(2016, 12, 30, 13, 00, 00)); // - // 59 seconds, later - TemporalInterval beginTI02 = new TemporalInterval( - new TemporalInstantRfc3339(2015, 12, 30, 12, 59, 59), // - new TemporalInstantRfc3339(2016, 12, 30, 13, 00, 00)); // - - String key01b = Arrays.toString(beginTI01.getAsKeyBeginning()); - String key02b = Arrays.toString(beginTI02.getAsKeyBeginning()); - Assert.assertEquals("key02 is later so comparesTo = 1.", 1, key02b.compareTo(key01b)); - Assert.assertEquals("key01 is first so comparesTo = -1", -1, key01b.compareTo(key02b)); - - } - // These are shared for end test and compareTo tests. - // tiB03_E20 read as: Begins 3 seconds, ends at 20 seconds - final TemporalInterval tiB03_E20 = new TemporalInterval(// - new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 03), // - new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 20)); - // 30 seconds, Begins earlier, ends later - final TemporalInterval tiB02_E30 = new TemporalInterval(// - new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 02), // - new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 30)); - // 30 seconds, same as above - final TemporalInterval tiB02_E30Dup = new TemporalInterval(// - new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 02), // - new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 30)); - // 30 seconds, same as above, but ends later - final TemporalInterval tiB02_E31 = new TemporalInterval(// - new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 02), // - new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 31)); - - @Test - public void CompareToTest() throws Exception { - - Assert.assertEquals("interval tiB03_E20.compareTo(tiB02_E30), B03 starts later(greater) so comparesTo = 1.", 1, tiB03_E20.compareTo(tiB02_E30)); - Assert.assertEquals("interval tiB02_E30.compareTo(tiB03_E20), B02 starts first(lesser) so comparesTo = -1", -1, tiB02_E30.compareTo(tiB03_E20)); - Assert.assertEquals("interval tiB02_E30.compareTo(tiB02_E31), E30 ends first so comparesTo = -1", -1, tiB02_E30.compareTo(tiB02_E31)); - Assert.assertEquals("interval tiB02_E30.compareTo(tiB02_E30Dup) same so comparesTo = 0", 0, tiB02_E30.compareTo(tiB02_E30Dup)); - } - @Test - public void EqualsTest() throws Exception { - Object notATemporalInterval = "Iamastring."; - Assert.assertFalse("interval tiB02_E30.equals(tiB02_E31) differ so equals() is false.", tiB02_E30.equals(notATemporalInterval)); - Assert.assertFalse("interval tiB02_E30.equals(tiB02_E31) differ so equals() is false.", tiB02_E30.equals(tiB02_E31)); - Assert.assertTrue ("interval tiB02_E30.equals(tiB02_E30Dup) same so equals() is true.", tiB02_E30.equals(tiB02_E30Dup)); - } - @Test - public void keyEndTest() throws Exception { - String keyB03_E20 = new String( tiB03_E20.getAsKeyEnd(), "US-ASCII"); - String keyB02_E30 = new String(tiB02_E30.getAsKeyEnd(), "US-ASCII"); - String keyB02_E30Dup = new String(tiB02_E30Dup.getAsKeyEnd(), "US-ASCII"); - - Assert.assertEquals("End keyB02_E30.compareTo(keyB03_E20), E30 is later = 1. key="+keyB02_E30, 1, keyB02_E30.compareTo(keyB03_E20)); - Assert.assertEquals("End keyB03_E20.compareTo(keyB02_E30), E20 is first = -1", -1, keyB03_E20.compareTo(keyB02_E30)); - Assert.assertEquals("End keyB02_E30.compareTo(keyB02_E30Dup) same so comparesTo = 0", 0, keyB02_E30.compareTo(keyB02_E30Dup)); - } - - - - @Test - public void infinitePastFutureAlwaysTest() throws Exception { - final TemporalInstant TestDateString = new TemporalInstantRfc3339(new DateTime("2015-01-01T01:59:59Z")); - TemporalInterval tvFuture = new TemporalInterval(TestDateString,TemporalInstantRfc3339.getMaximumInstance()); - TemporalInterval tvPast = new TemporalInterval(TemporalInstantRfc3339.getMinimumInstance(), TestDateString); - TemporalInterval tvAlways = new TemporalInterval(TemporalInstantRfc3339.getMinimumInstance(), TemporalInstantRfc3339.getMaximumInstance()); - Assert.assertTrue("The future is greater (starts after) than the past for compareTo().", tvFuture.compareTo(tvPast) > 0); - Assert.assertTrue("The future is greater (starts after) than always for compareTo().", tvFuture.compareTo(tvAlways) > 0); - Assert.assertTrue("The past is less (starts same, ends earlier) than always for compareTo().", tvFuture.compareTo(tvPast) > 0); - - } - @Test - public void hashTest() throws Exception { - // Use MAX to see how it handles overflowing values. Should silently go negative. - int hashcode01Same = (new TemporalInterval(new TemporalInstantRfc3339(new DateTime(Integer.MAX_VALUE / 2)), new TemporalInstantRfc3339(new DateTime(Integer.MAX_VALUE)))).hashCode(); - int hashcode02Same = (new TemporalInterval(new TemporalInstantRfc3339(new DateTime(Integer.MAX_VALUE / 2)), new TemporalInstantRfc3339(new DateTime(Integer.MAX_VALUE)))).hashCode(); - int hashcode03Diff = (new TemporalInterval(new TemporalInstantRfc3339(new DateTime(Integer.MAX_VALUE / 2)), new TemporalInstantRfc3339(new DateTime(Integer.MAX_VALUE)))).hashCode(); - int hashcode04Diff = (new TemporalInterval(new TemporalInstantRfc3339(new DateTime(Integer.MIN_VALUE )), new TemporalInstantRfc3339(new DateTime(Integer.MIN_VALUE)))).hashCode(); - int hashcode05Diff = (new TemporalInterval(new TemporalInstantRfc3339(new DateTime(Integer.MAX_VALUE )), new TemporalInstantRfc3339(new DateTime(Integer.MAX_VALUE)))).hashCode(); - int hashcode06Diff = (new TemporalInterval(new TemporalInstantRfc3339(new DateTime(0)), new TemporalInstantRfc3339(new DateTime( 0)))).hashCode(); - int hashcode07Diff = (new TemporalInterval(new TemporalInstantRfc3339(new DateTime(1000)), new TemporalInstantRfc3339(new DateTime( 1000)))).hashCode(); - int hashcode08Diff = (new TemporalInterval(new TemporalInstantRfc3339(new DateTime(0)), new TemporalInstantRfc3339(new DateTime( 1000)))).hashCode(); - int hashcode09Diff = (new TemporalInterval((TemporalInstantRfc3339.getMinimumInstance()),(TemporalInstantRfc3339.getMaximumInstance()) )).hashCode(); - int hashcode10Diff = (new TemporalInterval(new TemporalInstantRfc3339(new DateTime(0)) ,(TemporalInstantRfc3339.getMaximumInstance()) )).hashCode(); - Assert.assertEquals("Same input should produce same hashcode. (always!)", hashcode01Same , hashcode02Same); - - Assert.assertTrue("Different small input should produce different hashcode. (usually!) hashcodes:" - +hashcode03Diff+" "+hashcode04Diff+" "+hashcode03Diff+" "+hashcode05Diff, - hashcode03Diff != hashcode04Diff && hashcode03Diff != hashcode05Diff); - - Assert.assertTrue("Different large input should produce different hashcode. (usually!) hashcodes:" - +hashcode06Diff +" "+ hashcode07Diff +" "+ hashcode06Diff +" "+ hashcode08Diff - +" key for date 0= "+(new TemporalInstantRfc3339(new DateTime(0))).getAsKeyString() - +" key for date 1000= "+(new TemporalInstantRfc3339(new DateTime(1000))).getAsKeyString(), - hashcode06Diff != hashcode07Diff && hashcode06Diff != hashcode08Diff); - Assert.assertTrue("Different max and min input should produce different hashcode. (usually!) hashcodes:" - +hashcode09Diff +" != "+ hashcode10Diff - +"fyi: key for date max= "+(TemporalInstantRfc3339.getMaximumInstance()).getAsKeyString() - + " key for date min= "+(TemporalInstantRfc3339.getMinimumInstance()).getAsKeyString(), - hashcode09Diff != hashcode10Diff ); - - } -}
