package mil.nga.giat.geowave.adapter.vector.plugin; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.text.ParseException; import java.util.Date; import mil.nga.giat.geowave.adapter.vector.plugin.ExtractTimeFilterVisitor; import mil.nga.giat.geowave.adapter.vector.utils.DateUtilities; import mil.nga.giat.geowave.core.geotime.store.query.TemporalConstraints; import mil.nga.giat.geowave.core.geotime.store.query.TemporalConstraintsSet; import mil.nga.giat.geowave.core.geotime.store.query.TemporalRange; import org.geotools.data.Query; import org.geotools.filter.FilterFactoryImpl; import org.geotools.filter.text.cql2.CQL; import org.geotools.filter.text.cql2.CQLException; import org.geotools.filter.text.ecql.ECQL; import org.junit.Before; import org.junit.Test; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory; public class ExtractTimeFilterVisitorTest { final ExtractTimeFilterVisitor visitorWithDescriptor = new ExtractTimeFilterVisitor(); final ExtractTimeFilterVisitor visitorWithDescriptorForRange = new ExtractTimeFilterVisitor(); @Before public void setup() { visitorWithDescriptorForRange.addRangeVariables( "start", "end"); } @Test public void testAfter() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date time = DateUtilities.parseISO("2005-05-19T20:32:56Z"); Filter filter = CQL.toFilter("when after 2005-05-19T20:32:56Z"); Query query = new Query( "type", filter); TemporalConstraints range = (TemporalConstraints) query.getFilter().accept( visitor, null); assertNotNull(range); assertEquals( new Date( time.getTime() + 1), range.getStartRange().getStartTime()); range = (TemporalConstraints) query.getFilter().accept( visitorWithDescriptor, null); assertNotNull(range); assertEquals( new Date( time.getTime() + 1), range.getStartRange().getStartTime()); assertEquals( "when", range.getName()); } @Test public void testGreaterThan() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date stimeNotEqual = new Date( DateUtilities.parseISO( "2005-05-19T20:32:56Z").getTime() + 1); final Date stime = DateUtilities.parseISO("2005-05-19T20:32:56Z"); Filter filter = ECQL.toFilter("when > 2005-05-19T20:32:56Z"); Query query = new Query( "type", filter); TemporalConstraints range = (TemporalConstraints) query.getFilter().accept( visitor, null); assertNotNull(range); assertEquals( stimeNotEqual, range.getStartRange().getStartTime()); assertEquals( TemporalRange.END_TIME, range.getEndRange().getEndTime()); assertEquals( "when", range.getName()); filter = ECQL.toFilter("2005-05-19T20:32:56Z < when"); query = new Query( "type", filter); range = (TemporalConstraints) query.getFilter().accept( visitor, null); assertNotNull(range); assertEquals( stimeNotEqual, range.getStartRange().getStartTime()); assertEquals( TemporalRange.END_TIME, range.getEndRange().getEndTime()); assertEquals( "when", range.getName()); filter = ECQL.toFilter("2005-05-19T20:32:56Z <= when"); query = new Query( "type", filter); range = (TemporalConstraints) query.getFilter().accept( visitor, null); assertNotNull(range); assertEquals( stime, range.getStartRange().getStartTime()); assertEquals( TemporalRange.END_TIME, range.getEndRange().getEndTime()); assertEquals( "when", range.getName()); } @Test public void testMixedRanges() throws CQLException, ParseException { final Date stime = new Date( DateUtilities.parseISO( "2005-05-19T20:32:56Z").getTime() + 1); final Date etime = new Date( DateUtilities.parseISO( "2005-05-20T20:32:56Z").getTime() - 1); Filter filter = ECQL.toFilter("start > 2005-05-19T20:32:56Z and end < 2005-05-20T20:32:56Z"); FilterFactory factory = new FilterFactoryImpl(); filter = factory.and( Filter.INCLUDE, filter); Query query = new Query( "type", filter); TemporalConstraintsSet rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptor, null); assertNotNull(rangeSet); assertTrue(!rangeSet.isEmpty()); assertEquals( stime, rangeSet.getConstraintsFor( "start").getStartRange().getStartTime()); assertEquals( etime, rangeSet.getConstraintsFor( "end").getEndRange().getEndTime()); final Date stime1 = new Date( DateUtilities.parseISO( "2005-05-17T20:32:56Z").getTime() + 1); final Date etime1 = new Date( DateUtilities.parseISO( "2005-05-18T20:32:56Z").getTime() - 1); filter = ECQL .toFilter("(start < 2005-05-18T20:32:56Z and end > 2005-05-17T20:32:56Z) or (start < 2005-05-20T20:32:56Z and end > 2005-05-19T20:32:56Z)"); filter = factory.and( Filter.INCLUDE, filter); query = new Query( "type", filter); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptorForRange, null); assertNotNull(rangeSet); assertTrue(!rangeSet.isEmpty()); assertEquals( stime1, rangeSet.getConstraintsFor( "start_end").getStartRange().getStartTime()); assertEquals( etime1, rangeSet.getConstraintsFor( "start_end").getStartRange().getEndTime()); assertEquals( stime, rangeSet.getConstraintsFor( "start_end").getEndRange().getStartTime()); assertEquals( etime, rangeSet.getConstraintsFor( "start_end").getEndRange().getEndTime()); // Open ended query filter = ECQL.toFilter("start < 2005-05-20T20:32:56Z and end > 2005-05-19T20:32:56Z"); filter = factory.and( Filter.INCLUDE, filter); query = new Query( "type", filter); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptor, null); assertNotNull(rangeSet); assertTrue(!rangeSet.isEmpty()); assertEquals( TemporalRange.START_TIME, rangeSet.getConstraintsFor( "start_end").getStartRange().getStartTime()); assertEquals( TemporalRange.END_TIME, rangeSet.getConstraintsFor( "start_end").getEndRange().getEndTime()); } @Test public void testLessThan() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date etimeNotEqual = new Date( DateUtilities.parseISO( "2005-05-19T21:32:56Z").getTime() - 1); final Date etime = DateUtilities.parseISO("2005-05-19T21:32:56Z"); Filter filter = ECQL.toFilter("when < 2005-05-19T21:32:56Z"); Query query = new Query( "type", filter); TemporalConstraints range = (TemporalConstraints) query.getFilter().accept( visitor, null); assertNotNull(range); assertEquals( TemporalRange.START_TIME, range.getStartRange().getStartTime()); assertEquals( etimeNotEqual, range.getEndRange().getEndTime()); assertEquals( "when", range.getName()); filter = ECQL.toFilter(" 2005-05-19T21:32:56Z > when"); query = new Query( "type", filter); range = (TemporalConstraints) query.getFilter().accept( visitor, null); assertNotNull(range); assertEquals( TemporalRange.START_TIME, range.getStartRange().getStartTime()); assertEquals( etimeNotEqual, range.getEndRange().getEndTime()); assertEquals( "when", range.getName()); filter = ECQL.toFilter(" 2005-05-19T21:32:56Z >= when"); query = new Query( "type", filter); range = (TemporalConstraints) query.getFilter().accept( visitor, null); assertNotNull(range); assertEquals( TemporalRange.START_TIME, range.getStartRange().getStartTime()); assertEquals( etime, range.getEndRange().getEndTime()); assertEquals( "when", range.getName()); } @Test public void testLessAndGreaterThan() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date etime = new Date( DateUtilities.parseISO( "2005-05-19T21:32:56Z").getTime() - 1); final Date stime = new Date( DateUtilities.parseISO( "2005-05-19T20:32:56Z").getTime() + 1); Filter filter = ECQL.toFilter("when > 2005-05-19T21:32:56Z and when < 2005-05-19T20:32:56Z"); Query query = new Query( "type", filter); TemporalConstraintsSet rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitor, null); assertNotNull(rangeSet); assertEquals( TemporalRange.START_TIME, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( TemporalRange.END_TIME, rangeSet.getConstraintsFor( "when").getEndRange().getEndTime()); filter = ECQL.toFilter("when < 2005-05-19T21:32:56Z and when > 2005-05-19T20:32:56Z"); query = new Query( "type", filter); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitor, null); assertNotNull(rangeSet); assertEquals( stime, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( etime, rangeSet.getConstraintsFor( "when").getEndRange().getEndTime()); filter = ECQL.toFilter("sometime < 2005-05-19T21:32:56Z and when > 2005-05-19T20:32:56Z"); query = new Query( "type", filter); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptor, null); assertEquals( stime, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( TemporalRange.END_TIME, rangeSet.getConstraintsFor( "when").getEndRange().getEndTime()); assertEquals( TemporalRange.START_TIME, rangeSet.getConstraintsFor( "sometime").getStartRange().getStartTime()); assertEquals( etime, rangeSet.getConstraintsFor( "sometime").getEndRange().getEndTime()); filter = ECQL.toFilter("when < 2005-05-19T21:32:56Z and sometime > 2005-05-19T20:32:56Z"); query = new Query( "type", filter); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptor, null); assertEquals( TemporalRange.START_TIME, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( etime, rangeSet.getConstraintsFor( "when").getEndRange().getEndTime()); assertEquals( stime, rangeSet.getConstraintsFor( "sometime").getStartRange().getStartTime()); assertEquals( TemporalRange.END_TIME, rangeSet.getConstraintsFor( "sometime").getEndRange().getEndTime()); filter = ECQL.toFilter("2005-05-19T21:32:56Z > when and 2005-05-19T20:32:56Z < sometime"); query = new Query( "type", filter); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptor, null); assertEquals( TemporalRange.START_TIME, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( etime, rangeSet.getConstraintsFor( "when").getEndRange().getEndTime()); assertEquals( stime, rangeSet.getConstraintsFor( "sometime").getStartRange().getStartTime()); assertEquals( TemporalRange.END_TIME, rangeSet.getConstraintsFor( "sometime").getEndRange().getEndTime()); } @Test public void testEqual() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date etime = DateUtilities.parseISO("2005-05-19T21:32:56Z"); Filter filter = ECQL.toFilter("when = 2005-05-19T21:32:56Z"); Query query = new Query( "type", filter); TemporalConstraints range = (TemporalConstraints) query.getFilter().accept( visitor, null); assertNotNull(range); assertEquals( etime, range.getStartRange().getStartTime()); assertEquals( etime, range.getEndRange().getEndTime()); } @Test public void testDuring() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date stime = new Date( DateUtilities.parseISO( "2005-05-19T20:32:56Z").getTime() + 1); final Date etime = new Date( DateUtilities.parseISO( "2005-05-19T21:32:56Z").getTime() - 1); Filter filter = CQL.toFilter("when during 2005-05-19T20:32:56Z/2005-05-19T21:32:56Z"); Query query = new Query( "type", filter); TemporalConstraints range = (TemporalConstraints) query.getFilter().accept( visitor, null); assertNotNull(range); assertEquals( stime, range.getStartRange().getStartTime()); assertEquals( etime, range.getStartRange().getEndTime()); range = (TemporalConstraints) query.getFilter().accept( visitor, null); assertNotNull(range); assertEquals( stime, range.getStartRange().getStartTime()); assertEquals( etime, range.getStartRange().getEndTime()); } @Test public void testBefore() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date etime = new Date( DateUtilities.parseISO( "2005-05-19T20:32:56Z").getTime() - 1); Filter filter = CQL.toFilter("when before 2005-05-19T20:32:56Z"); Query query = new Query( "type", filter); TemporalConstraints range = (TemporalConstraints) query.getFilter().accept( visitor, null); assertNotNull(range); assertEquals( TemporalRange.START_TIME, range.getStartRange().getStartTime()); assertEquals( etime, range.getStartRange().getEndTime()); range = (TemporalConstraints) query.getFilter().accept( visitorWithDescriptor, null); assertNotNull(range); assertEquals( TemporalRange.START_TIME, range.getStartRange().getStartTime()); assertEquals( etime, range.getStartRange().getEndTime()); } @Test public void testBeforeOrDuring() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date stime = new Date( DateUtilities.parseISO( "2005-05-19T21:32:56Z").getTime() - 1); Filter filter = CQL.toFilter("when BEFORE OR DURING 2005-05-19T20:32:56Z/2005-05-19T21:32:56Z"); Query query = new Query( "type", filter); TemporalConstraintsSet rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitor, null); assertNotNull(rangeSet); assertEquals( TemporalRange.START_TIME, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( stime, rangeSet.getConstraintsFor( "when").getEndRange().getEndTime()); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptor, null); assertNotNull(rangeSet); assertEquals( TemporalRange.START_TIME, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( stime, rangeSet.getConstraintsFor( "when").getEndRange().getEndTime()); } @Test public void testDuringOrAfter() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date stime = new Date( DateUtilities.parseISO( "2005-05-19T20:32:56Z").getTime() + 1); Filter filter = CQL.toFilter("when DURING OR AFTER 2005-05-19T20:32:56Z/2005-05-19T21:32:56Z"); Query query = new Query( "type", filter); TemporalConstraintsSet rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitor, null); assertNotNull(rangeSet); assertEquals( stime, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( TemporalRange.END_TIME, rangeSet.getConstraintsFor( "when").getEndRange().getEndTime()); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptor, null); assertNotNull(rangeSet); assertEquals( stime, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( TemporalRange.END_TIME, rangeSet.getConstraintsFor( "when").getEndRange().getEndTime()); } @Test public void testAndOverlap() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date sTime = new Date( DateUtilities.parseISO( "2005-05-19T20:32:56Z").getTime() + 1); final Date eTime = new Date( DateUtilities.parseISO( "2005-05-20T20:32:56Z").getTime() - 1); Filter filter = CQL.toFilter("when before 2005-05-20T20:32:56Z and when after 2005-05-19T20:32:56Z"); Query query = new Query( "type", filter); TemporalConstraintsSet rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitor, null); assertNotNull(rangeSet); assertEquals( sTime, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( eTime, rangeSet.getConstraintsFor( "when").getStartRange().getEndTime()); filter = CQL.toFilter("sometime before 2005-05-20T20:32:56Z and when after 2005-05-19T20:32:56Z"); query = new Query( "type", filter); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptor, null); assertNotNull(rangeSet); assertEquals( sTime, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( TemporalRange.END_TIME, rangeSet.getConstraintsFor( "when").getStartRange().getEndTime()); filter = CQL.toFilter("when before 2005-05-20T20:32:56Z and sometime after 2005-05-19T20:32:56Z"); query = new Query( "type", filter); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptor, null); assertNotNull(rangeSet); assertFalse(rangeSet.isEmpty()); assertEquals( TemporalRange.START_TIME, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( eTime, rangeSet.getConstraintsFor( "when").getStartRange().getEndTime()); } @Test public void testAndNoOverlap() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Filter filter = CQL.toFilter("when before 2005-05-17T20:32:56Z and when after 2005-05-19T20:32:56Z"); final Query query = new Query( "type", filter); TemporalConstraintsSet rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitor, null); assertNotNull(rangeSet); assertTrue(rangeSet.isEmpty()); } @Test public void testOr() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date sTime2 = new Date( DateUtilities.parseISO( "2005-05-19T20:32:56Z").getTime() + 1); final Date eTime1 = new Date( DateUtilities.parseISO( "2005-05-17T20:32:56Z").getTime() - 1); Filter filter = CQL.toFilter("when before 2005-05-17T20:32:56Z or when after 2005-05-19T20:32:56Z"); Query query = new Query( "type", filter); TemporalConstraintsSet rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitor, null); assertNotNull(rangeSet); assertEquals( eTime1, rangeSet.getConstraintsFor( "when").getStartRange().getEndTime()); assertEquals( sTime2, rangeSet.getConstraintsFor( "when").getRanges().get( 1).getStartTime()); // test mixed filter = CQL.toFilter("when before 2005-05-17T20:32:56Z or sometime after 2005-05-19T20:32:56Z"); query = new Query( "type", filter); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptor, null); assertNotNull(rangeSet); assertEquals( eTime1, rangeSet.getConstraintsFor( "when").getStartRange().getEndTime()); assertEquals( TemporalRange.START_TIME, rangeSet.getConstraintsFor( "when").getEndRange().getStartTime()); assertEquals( TemporalRange.END_TIME, rangeSet.getConstraintsFor( "sometime").getStartRange().getEndTime()); assertEquals( sTime2, rangeSet.getConstraintsFor( "sometime").getEndRange().getStartTime()); } @Test public void testNotBetween() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date sTime2 = new Date( DateUtilities.parseISO( "2005-05-19T20:32:56Z").getTime() + 1); final Date eTime1 = new Date( DateUtilities.parseISO( "2005-05-17T20:32:56Z").getTime() - 1); final Filter filter = CQL.toFilter("not (when before 2005-05-17T20:32:56Z or when after 2005-05-19T20:32:56Z)"); final Query query = new Query( "type", filter); TemporalConstraintsSet rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitor, null); assertNotNull(rangeSet); assertEquals( eTime1, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( new Date( sTime2.getTime() - 1), rangeSet.getConstraintsFor( "when").getStartRange().getEndTime()); } @Test public void testNotOutliers() throws CQLException, ParseException { final ExtractTimeFilterVisitor visitor = new ExtractTimeFilterVisitor(); final Date sTime = new Date( DateUtilities.parseISO( "2005-05-19T20:32:56Z").getTime() + 1); final Date eTime = new Date( DateUtilities.parseISO( "2005-05-20T20:32:56Z").getTime() - 1); Filter filter = CQL.toFilter("not (when before 2005-05-20T20:32:56Z and when after 2005-05-19T20:32:56Z)"); Query query = new Query( "type", filter); TemporalConstraintsSet rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitor, null); assertNotNull(rangeSet); assertEquals( TemporalRange.START_TIME, rangeSet.getConstraintsFor( "when").getStartRange().getStartTime()); assertEquals( new Date( sTime.getTime() - 1), rangeSet.getConstraintsFor( "when").getStartRange().getEndTime()); assertEquals( eTime, rangeSet.getConstraintsFor( "when").getRanges().get( 1).getStartTime()); assertEquals( TemporalRange.END_TIME, rangeSet.getConstraintsFor( "when").getRanges().get( 1).getEndTime()); filter = CQL.toFilter("not (sometime before 2005-05-20T20:32:56Z and when after 2005-05-19T20:32:56Z)"); query = new Query( "type", filter); rangeSet = (TemporalConstraintsSet) query.getFilter().accept( visitorWithDescriptor, null); assertNotNull(rangeSet); assertEquals( new Date( sTime.getTime() - 1), rangeSet.getConstraintsFor( "when").getEndRange().getEndTime()); assertEquals( TemporalRange.START_TIME, rangeSet.getConstraintsFor( "when").getEndRange().getStartTime()); } }