/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2012, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.cql; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LinearRing; import java.text.ParseException; import java.util.Date; import org.apache.sis.internal.util.UnmodifiableArrayList; import org.geotoolkit.filter.DefaultFilterFactory2; import org.geotoolkit.temporal.object.TemporalUtilities; import static org.junit.Assert.*; import org.junit.Test; import org.opengis.filter.And; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory2; import org.opengis.filter.Not; import org.opengis.filter.Or; import org.opengis.filter.PropertyIsBetween; import org.opengis.filter.PropertyIsEqualTo; import org.opengis.filter.PropertyIsGreaterThan; import org.opengis.filter.PropertyIsGreaterThanOrEqualTo; import org.opengis.filter.PropertyIsLessThan; import org.opengis.filter.PropertyIsLessThanOrEqualTo; import org.opengis.filter.PropertyIsLike; import org.opengis.filter.PropertyIsNotEqualTo; import org.opengis.filter.PropertyIsNull; import org.opengis.filter.expression.Literal; import org.opengis.filter.spatial.BBOX; import org.opengis.filter.spatial.Beyond; import org.opengis.filter.spatial.BinarySpatialOperator; import org.opengis.filter.spatial.Contains; import org.opengis.filter.spatial.Crosses; import org.opengis.filter.spatial.DWithin; import org.opengis.filter.spatial.Disjoint; import org.opengis.filter.spatial.Equals; import org.opengis.filter.spatial.Intersects; import org.opengis.filter.spatial.Overlaps; import org.opengis.filter.spatial.Touches; import org.opengis.filter.spatial.Within; import org.opengis.filter.temporal.After; import org.opengis.filter.temporal.AnyInteracts; import org.opengis.filter.temporal.Before; import org.opengis.filter.temporal.Begins; import org.opengis.filter.temporal.BegunBy; import org.opengis.filter.temporal.During; import org.opengis.filter.temporal.EndedBy; import org.opengis.filter.temporal.Ends; import org.opengis.filter.temporal.Meets; import org.opengis.filter.temporal.MetBy; import org.opengis.filter.temporal.OverlappedBy; import org.opengis.filter.temporal.TContains; import org.opengis.filter.temporal.TEquals; import org.opengis.filter.temporal.TOverlaps; /** * Test reading CQL filters. * * @author Johann Sorel (Geomatys) */ public class FilterReadingTest extends org.geotoolkit.test.TestBase { private static final double DELTA = 0.00000001; private final FilterFactory2 FF = new DefaultFilterFactory2(); private final GeometryFactory GF = new GeometryFactory(); private final Geometry baseGeometry = GF.createPolygon( GF.createLinearRing( new Coordinate[]{ new Coordinate(10, 20), new Coordinate(30, 40), new Coordinate(50, 60), new Coordinate(10, 20) }), new LinearRing[0] ); private final Geometry baseGeometryPoint = GF.createPoint( new Coordinate(12.1, 28.9)); @Test public void testNullFilter() throws CQLException { //this is not true cql but is since in commun use cases. String cql = ""; Object obj = CQL.parseFilter(cql); assertEquals(Filter.INCLUDE,obj); cql = "*"; obj = CQL.parseFilter(cql); assertEquals(Filter.INCLUDE,obj); } @Test public void testAnd() throws CQLException { final String cql = "att1 = 15 AND att2 = 30 AND att3 = 50"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Filter); final Filter filter = (Filter) obj; assertEquals( FF.and( UnmodifiableArrayList.wrap(new Filter[] {(Filter) FF.equals(FF.property("att1"), FF.literal(15)), FF.equals(FF.property("att2"), FF.literal(30)), FF.equals(FF.property("att3"), FF.literal(50)) })), filter); } @Test public void testOr() throws CQLException { final String cql = "att1 = 15 OR att2 = 30 OR att3 = 50"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Filter); final Filter filter = (Filter) obj; assertEquals( FF.or( UnmodifiableArrayList.wrap(new Filter[] {(Filter) FF.equals(FF.property("att1"), FF.literal(15)), FF.equals(FF.property("att2"), FF.literal(30)), FF.equals(FF.property("att3"), FF.literal(50)) })), filter); } @Test public void testOrAnd1() throws CQLException { final String cql = "Title = 'VMAI' OR (Title ILIKE 'LO?Li' AND DWITHIN(BoundingBox, POINT(12.1 28.9), 10, meters))"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Filter); final Filter filter = (Filter) obj; assertEquals( FF.or( FF.equals(FF.property("Title"), FF.literal("VMAI")), FF.and( FF.like(FF.property("Title"), "LO?Li","%","_","\\",false), FF.dwithin(FF.property("BoundingBox"), FF.literal(baseGeometryPoint), 10, "meters") ) ), filter); } @Test public void testOrAnd2() throws CQLException { final Geometry geom = GF.createPolygon( GF.createLinearRing( new Coordinate[]{ new Coordinate(10, 40), new Coordinate(20, 40), new Coordinate(20, 30), new Coordinate(10, 30), new Coordinate(10, 40) }), new LinearRing[0] ); final String cql = "NOT (INTERSECTS(BoundingBox, ENVELOPE(10, 20, 40, 30)) OR CONTAINS(BoundingBox, POINT(12.1 28.9))) AND BBOX(BoundingBox, 10,20,30,40)"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Filter); final Filter filter = (Filter) obj; assertEquals( FF.and( FF.not( FF.or( FF.intersects(FF.property("BoundingBox"), FF.literal(geom)), FF.contains(FF.property("BoundingBox"), FF.literal(baseGeometryPoint)) ) ), FF.bbox("BoundingBox",10,20,30,40,"") ), filter); } @Test public void testNot() throws CQLException { final String cql = "NOT att = 15"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Not); final Not filter = (Not) obj; assertEquals(FF.not(FF.equals(FF.property("att"), FF.literal(15))), filter); } @Test public void testPropertyIsBetween() throws CQLException { final String cql = "att BETWEEN 15 AND 30"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsBetween); final PropertyIsBetween filter = (PropertyIsBetween) obj; assertEquals(FF.between(FF.property("att"), FF.literal(15), FF.literal(30)), filter); } @Test public void testIn() throws CQLException { final String cql = "att IN ( 15, 30, 'hello')"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Or); final Or filter = (Or) obj; assertEquals(FF.equals(FF.property("att"), FF.literal(15)), filter.getChildren().get(0)); assertEquals(FF.equals(FF.property("att"), FF.literal(30)), filter.getChildren().get(1)); assertEquals(FF.equals(FF.property("att"), FF.literal("hello")), filter.getChildren().get(2)); } @Test public void testNotIn() throws CQLException { final String cql = "att NOT IN ( 15, 30, 'hello')"; Object obj = CQL.parseFilter(cql); obj = ((Not)obj).getFilter(); assertTrue(obj instanceof Or); final Or filter = (Or) obj; assertEquals(FF.equals(FF.property("att"), FF.literal(15)), filter.getChildren().get(0)); assertEquals(FF.equals(FF.property("att"), FF.literal(30)), filter.getChildren().get(1)); assertEquals(FF.equals(FF.property("att"), FF.literal("hello")), filter.getChildren().get(2)); } @Test public void testPropertyIsEqualTo1() throws CQLException { final String cql = "att=15"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsEqualTo); final PropertyIsEqualTo filter = (PropertyIsEqualTo) obj; assertEquals(FF.equals(FF.property("att"), FF.literal(15)), filter); } @Test public void testPropertyIsEqualTo2() throws CQLException { final String cql = "att = 15"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsEqualTo); final PropertyIsEqualTo filter = (PropertyIsEqualTo) obj; assertEquals(FF.equals(FF.property("att"), FF.literal(15)), filter); } @Test public void testPropertyIsNotEqualTo() throws CQLException { final String cql = "att <> 15"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsNotEqualTo); final PropertyIsNotEqualTo filter = (PropertyIsNotEqualTo) obj; assertEquals(FF.notEqual(FF.property("att"), FF.literal(15)), filter); } @Test public void testPropertyIsNotEqualTo2() throws CQLException { final String cql = "att <>'15'"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsNotEqualTo); final PropertyIsNotEqualTo filter = (PropertyIsNotEqualTo) obj; assertEquals(FF.notEqual(FF.property("att"), FF.literal(15)), filter); } @Test public void testPropertyIsGreaterThan() throws CQLException { final String cql = "att > 15"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsGreaterThan); final PropertyIsGreaterThan filter = (PropertyIsGreaterThan) obj; assertEquals(FF.greater(FF.property("att"), FF.literal(15)), filter); } @Test public void testPropertyIsGreaterThanOrEqualTo() throws CQLException { final String cql = "att >= 15"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsGreaterThanOrEqualTo); final PropertyIsGreaterThanOrEqualTo filter = (PropertyIsGreaterThanOrEqualTo) obj; assertEquals(FF.greaterOrEqual(FF.property("att"), FF.literal(15)), filter); } @Test public void testPropertyIsLessThan() throws CQLException { final String cql = "att < 15"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsLessThan); final PropertyIsLessThan filter = (PropertyIsLessThan) obj; assertEquals(FF.less(FF.property("att"), FF.literal(15)), filter); } @Test public void testPropertyIsLessThanOrEqualTo() throws CQLException { final String cql = "att <= 15"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsLessThanOrEqualTo); final PropertyIsLessThanOrEqualTo filter = (PropertyIsLessThanOrEqualTo) obj; assertEquals(FF.lessOrEqual(FF.property("att"), FF.literal(15)), filter); } @Test public void testPropertyIsLike() throws CQLException { final String cql = "att LIKE '%hello_'"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsLike); final PropertyIsLike filter = (PropertyIsLike) obj; assertEquals(FF.like(FF.property("att"),"%hello_", "%", "_", "\\",true), filter); } @Test public void testPropertyIsNotLike() throws CQLException { final String cql = "att NOT LIKE '%hello_'"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Not); final Not filter = (Not) obj; assertEquals(FF.not(FF.like(FF.property("att"),"%hello_", "%", "_", "\\",true)), filter); } @Test public void testPropertyIsLikeInsensitive() throws CQLException { final String cql = "att ILIKE '%hello_'"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsLike); final PropertyIsLike filter = (PropertyIsLike) obj; assertEquals(FF.like(FF.property("att"),"%hello_", "%", "_", "\\",false), filter); } @Test public void testPropertyIsNull() throws CQLException { final String cql = "att IS NULL"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsNull); final PropertyIsNull filter = (PropertyIsNull) obj; assertEquals(FF.isNull(FF.property("att")), filter); } @Test public void testPropertyIsNotNull() throws CQLException { final String cql = "att IS NOT NULL"; Object obj = CQL.parseFilter(cql); obj = ((Not)obj).getFilter(); assertTrue(obj instanceof PropertyIsNull); final PropertyIsNull filter = (PropertyIsNull) obj; assertEquals(FF.isNull(FF.property("att")), filter); } @Test public void testBBOX1() throws CQLException { final String cql = "BBOX(\"att\" ,10, 20, 30, 40)"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof BBOX); final BinarySpatialOperator filter = (BBOX) obj; assertEquals(FF.bbox(FF.property("att"), 10,20,30,40, null), filter); } @Test public void testBBOX2() throws CQLException { final String cql = "BBOX(\"att\" ,10, 20, 30, 40, 'CRS:84')"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof BBOX); final BBOX filter = (BBOX) obj; assertEquals(FF.bbox(FF.property("att"), 10,20,30,40, "CRS:84"), filter); } @Test public void testBBOX3() throws CQLException { final String cql = "BBOX(att ,10, 20, 30, 40, 'CRS:84')"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof BBOX); final BBOX filter = (BBOX) obj; assertEquals(FF.bbox(FF.property("att"), 10,20,30,40, "CRS:84"), filter); } @Test public void testBBOX4() throws CQLException { final String cql = "BBOX(geometry,-10,-20,10,20)"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof BBOX); final BBOX filter = (BBOX) obj; assertEquals(FF.bbox(FF.property("geometry"), -10,-20,10,20,null), filter); } @Test public void testBeyond() throws CQLException { final String cql = "BEYOND(\"att\" ,POLYGON((10 20, 30 40, 50 60, 10 20)), 10, meters)"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Beyond); final Beyond filter = (Beyond) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Geometry); final Geometry filtergeo = (Geometry) ((Literal)filter.getExpression2()).getValue(); assertTrue(baseGeometry.equalsExact(filtergeo)); } @Test public void testContains() throws CQLException { final String cql = "CONTAINS(\"att\" ,POLYGON((10 20, 30 40, 50 60, 10 20)))"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Contains); final Contains filter = (Contains) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Geometry); final Geometry filtergeo = (Geometry) ((Literal)filter.getExpression2()).getValue(); assertTrue(baseGeometry.equalsExact(filtergeo)); } @Test public void testCrosses() throws CQLException { final String cql = "CROSSES(\"att\" ,POLYGON((10 20, 30 40, 50 60, 10 20)))"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Crosses); final Crosses filter = (Crosses) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Geometry); final Geometry filtergeo = (Geometry) ((Literal)filter.getExpression2()).getValue(); assertTrue(baseGeometry.equalsExact(filtergeo)); } @Test public void testDisjoint() throws CQLException { final String cql = "DISJOINT(\"att\" ,POLYGON((10 20, 30 40, 50 60, 10 20)))"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Disjoint); final Disjoint filter = (Disjoint) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Geometry); final Geometry filtergeo = (Geometry) ((Literal)filter.getExpression2()).getValue(); assertTrue(baseGeometry.equalsExact(filtergeo)); } @Test public void testDWithin() throws CQLException { final String cql = "DWITHIN(\"att\" ,POLYGON((10 20, 30 40, 50 60, 10 20)), 10, 'meters')"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof DWithin); final DWithin filter = (DWithin) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertEquals(10.0, filter.getDistance(), DELTA); assertEquals("meters", filter.getDistanceUnits()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Geometry); final Geometry filtergeo = (Geometry) ((Literal)filter.getExpression2()).getValue(); assertTrue(baseGeometry.equalsExact(filtergeo)); } @Test public void testDWithin2() throws CQLException { //there is an error in this syntax, meters is a literal so it should be writen 'meters" //but this writing is commun so we tolerate it final String cql = "DWITHIN(BoundingBox, POINT(12.1 28.9), 10, meters)"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof DWithin); final DWithin filter = (DWithin) obj; assertEquals(FF.property("BoundingBox"), filter.getExpression1()); assertEquals(10.0, filter.getDistance(), DELTA); assertEquals("meters", filter.getDistanceUnits()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Geometry); final Geometry filtergeo = (Geometry) ((Literal)filter.getExpression2()).getValue(); assertTrue(baseGeometryPoint.equalsExact(filtergeo)); } @Test public void testEquals() throws CQLException { final String cql = "EQUALS(\"att\" ,POLYGON((10 20, 30 40, 50 60, 10 20)))"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Equals); final Equals filter = (Equals) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Geometry); final Geometry filtergeo = (Geometry) ((Literal)filter.getExpression2()).getValue(); assertTrue(baseGeometry.equalsExact(filtergeo)); } @Test public void testIntersects() throws CQLException { final String cql = "INTERSECTS(\"att\" ,POLYGON((10 20, 30 40, 50 60, 10 20)))"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Intersects); final Intersects filter = (Intersects) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Geometry); final Geometry filtergeo = (Geometry) ((Literal)filter.getExpression2()).getValue(); assertTrue(baseGeometry.equalsExact(filtergeo)); } @Test public void testOverlaps() throws CQLException { final String cql = "OVERLAPS(\"att\" ,POLYGON((10 20, 30 40, 50 60, 10 20)))"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Overlaps); final Overlaps filter = (Overlaps) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Geometry); final Geometry filtergeo = (Geometry) ((Literal)filter.getExpression2()).getValue(); assertTrue(baseGeometry.equalsExact(filtergeo)); } @Test public void testTouches() throws CQLException { final String cql = "TOUCHES(\"att\" ,POLYGON((10 20, 30 40, 50 60, 10 20)))"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Touches); final Touches filter = (Touches) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Geometry); final Geometry filtergeo = (Geometry) ((Literal)filter.getExpression2()).getValue(); assertTrue(baseGeometry.equalsExact(filtergeo)); } @Test public void testWithin() throws CQLException { final String cql = "WITHIN(\"att\" ,POLYGON((10 20, 30 40, 50 60, 10 20)))"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Within); final Within filter = (Within) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Geometry); final Geometry filtergeo = (Geometry) ((Literal)filter.getExpression2()).getValue(); assertTrue(baseGeometry.equalsExact(filtergeo)); } @Test public void testCombine1() throws CQLException { final String cql = "NOT att = 15 OR att BETWEEN 15 AND 30"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Or); final Or filter = (Or) obj; assertEquals( FF.or( FF.not(FF.equals(FF.property("att"), FF.literal(15))), FF.between(FF.property("att"), FF.literal(15), FF.literal(30)) ), filter ); } @Test public void testCombine2() throws CQLException { final String cql = "(NOT att = 15) OR (att BETWEEN 15 AND 30)"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Or); final Or filter = (Or) obj; assertEquals( FF.or( FF.not(FF.equals(FF.property("att"), FF.literal(15))), FF.between(FF.property("att"), FF.literal(15), FF.literal(30)) ), filter ); } @Test public void testCombine3() throws CQLException { final String cql = "(NOT att1 = 15) AND (att2 = 15 OR att3 BETWEEN 15 AND 30) AND (att4 BETWEEN 1 AND 2)"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof And); final And filter = (And) obj; assertEquals( FF.and( UnmodifiableArrayList.wrap(new Filter[] {(Filter) FF.not(FF.equals(FF.property("att1"), FF.literal(15))), FF.or( FF.equals(FF.property("att2"), FF.literal(15)), FF.between(FF.property("att3"), FF.literal(15), FF.literal(30)) ), FF.between(FF.property("att4"), FF.literal(1), FF.literal(2)) }) ), filter ); } @Test public void testCombine4() throws CQLException { final String cql = "(x+7) <= (y-9)"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof PropertyIsLessThanOrEqualTo); final PropertyIsLessThanOrEqualTo filter = (PropertyIsLessThanOrEqualTo) obj; assertEquals( FF.lessOrEqual( FF.add(FF.property("x"), FF.literal(7)), FF.subtract(FF.property("y"), FF.literal(9)) ), filter ); } @Test public void testAfter() throws CQLException, ParseException { final String cql = "att AFTER 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof After); final After filter = (After) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testAnyInteracts() throws CQLException, ParseException { final String cql = "att ANYINTERACTS 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof AnyInteracts); final AnyInteracts filter = (AnyInteracts) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testBefore() throws CQLException, ParseException { final String cql = "att BEFORE 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Before); final Before filter = (Before) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testBegins() throws CQLException, ParseException { final String cql = "att BEGINS 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Begins); final Begins filter = (Begins) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testBegunBy() throws CQLException, ParseException { final String cql = "att BEGUNBY 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof BegunBy); final BegunBy filter = (BegunBy) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testDuring() throws CQLException, ParseException { final String cql = "att DURING 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof During); final During filter = (During) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testEndedBy() throws CQLException, ParseException { final String cql = "att ENDEDBY 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof EndedBy); final EndedBy filter = (EndedBy) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testEnds() throws CQLException, ParseException { final String cql = "att ENDS 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Ends); final Ends filter = (Ends) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testMeets() throws CQLException, ParseException { final String cql = "att MEETS 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof Meets); final Meets filter = (Meets) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testMetBy() throws CQLException, ParseException { final String cql = "att METBY 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof MetBy); final MetBy filter = (MetBy) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testOverlappedBy() throws CQLException, ParseException { final String cql = "att OVERLAPPEDBY 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof OverlappedBy); final OverlappedBy filter = (OverlappedBy) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testTcontains() throws CQLException, ParseException { final String cql = "att TCONTAINS 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof TContains); final TContains filter = (TContains) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testTequals() throws CQLException, ParseException { final String cql = "att TEQUALS 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof TEquals); final TEquals filter = (TEquals) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } @Test public void testToverlaps() throws CQLException, ParseException { final String cql = "att TOVERLAPS 2012-03-21T05:42:36Z"; final Object obj = CQL.parseFilter(cql); assertTrue(obj instanceof TOverlaps); final TOverlaps filter = (TOverlaps) obj; assertEquals(FF.property("att"), filter.getExpression1()); assertTrue(filter.getExpression2() instanceof Literal); assertTrue( ((Literal)filter.getExpression2()).getValue() instanceof Date); final Date filterdate = (Date) ((Literal)filter.getExpression2()).getValue(); assertEquals(TemporalUtilities.parseDate("2012-03-21T05:42:36Z"), filterdate); } }