/** * Copyright (c) Codice Foundation * <p/> * This 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, either version 3 of the * License, or any later version. * <p/> * This program 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. A copy of the GNU Lesser General Public License * is distributed along with this program and can be found at * <http://www.gnu.org/licenses/lgpl.html>. */ package ddf.catalog.filter.proxy.adapter.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.net.URI; import java.net.URISyntaxException; import java.text.ParseException; import java.util.Arrays; import java.util.Date; import org.geotools.filter.FilterFactoryImpl; import org.geotools.geometry.GeometryBuilder; import org.geotools.geometry.text.WKTParser; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.styling.UomOgcMapping; import org.geotools.temporal.object.DefaultInstant; import org.geotools.temporal.object.DefaultPeriod; import org.geotools.temporal.object.DefaultPeriodDuration; import org.geotools.temporal.object.DefaultPosition; import org.junit.Test; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory; import org.opengis.filter.expression.Expression; import org.opengis.filter.expression.Literal; import org.opengis.filter.expression.PropertyName; import org.opengis.filter.spatial.BBOX; import org.opengis.geometry.Geometry; import org.opengis.temporal.Instant; import org.opengis.temporal.Period; import org.opengis.temporal.PeriodDuration; import com.vividsolutions.jts.io.WKTReader; import ddf.catalog.filter.FilterAdapter; import ddf.catalog.filter.FilterDelegate; import ddf.catalog.filter.delegate.FilterToTextDelegate; import ddf.catalog.filter.proxy.adapter.GeotoolsFilterAdapterImpl; import ddf.catalog.impl.filter.FuzzyFunction; import ddf.catalog.impl.filter.JTSGeometryWrapper; import ddf.catalog.source.UnsupportedQueryException; public class FilterAdapterTest { private static final double DISTANCE_10 = 10.0; private static final String TEST_PROPERTY_VALUE = "Test"; private static final String FOO_LITERAL_VALUE = "foo"; private static final String MULTIPOLYGON_WKT = "MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)), ((20 35, 45 20, 30 5, 10 10, 10 30, 20 35), (30 20, 20 25, 20 15, 30 20)))"; private static final String POLYGON_WKT = "POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10))"; private static final int DAY_IN_MILLISECONDS = 1000 * 60 * 60 * 24; private static final FilterFactory FF = new FilterFactoryImpl(); private static final PropertyName TEST_PROPERTY = FF.property(TEST_PROPERTY_VALUE); private static final Literal FOO_LITERAL = FF.literal(FOO_LITERAL_VALUE); private static final GeometryBuilder GEO_BUILDER = new GeometryBuilder( DefaultGeographicCRS.WGS84); private static final WKTParser WKT_PARSER = new WKTParser(GEO_BUILDER); private static final Date EPOCH = new Date(0); private static final Date EPOCH_PLUS_DAY = new Date(DAY_IN_MILLISECONDS); private static final Instant EPOCH_INSTANT = new DefaultInstant(new DefaultPosition(EPOCH)); private static final Instant EPOCH_PLUS_DAY_INSTANT = new DefaultInstant( new DefaultPosition(EPOCH_PLUS_DAY)); private static final Period EPOCH_DAY_PERIOD = new DefaultPeriod(EPOCH_INSTANT, EPOCH_PLUS_DAY_INSTANT); private static final PeriodDuration DAY_DURATION = new DefaultPeriodDuration( DAY_IN_MILLISECONDS); @Test public void includeFilter() { assertFilterEquals("true", Filter.INCLUDE); } @Test public void excludeFilter() { assertFilterEquals("false", Filter.EXCLUDE); } @Test public void notFilter() { Filter filter = FF.equals(TEST_PROPERTY, FOO_LITERAL); assertFilterEquals("not(Test=foo)", FF.not(filter)); assertFilterEquals("not(not(Test=foo))", FF.not(FF.not(filter))); } @Test public void andFilter() { Filter filter1 = FF.equals(FF.property("Test1"), FOO_LITERAL); Filter filter2 = FF.equals(FF.property("Test2"), FF.literal("bar")); Filter filter3 = FF.equals(FF.property("Test3"), FF.literal("baz")); assertFilterEquals("Test1=foo", FF.and(Arrays.asList(filter1))); assertFilterEquals("Test1=foo", FF.and(Arrays.asList((Filter) FF.and(Arrays.asList(filter1))))); assertFilterEquals("and(Test1=foo,Test2=bar)", FF.and(filter1, filter2)); assertFilterEquals("and(Test1=foo,and(Test2=bar,Test3=baz))", FF.and(filter1, FF.and(filter2, filter3))); assertFilterEquals("and(Test1=foo,Test2=bar,Test3=baz)", FF.and(Arrays.asList(filter1, filter2, filter3))); // remove useless ands // and(filter1) assertFilterEquals("Test1=foo", FF.and(Arrays.asList(filter1))); // and(and(filter1)) assertFilterEquals("Test1=foo", FF.and(Arrays.asList((Filter) FF.and(Arrays.asList(filter1))))); // and(and(filter1,filter2)) assertFilterEquals("and(Test1=foo,Test2=bar)", FF.and(Arrays.asList((Filter) FF.and(filter1, filter2)))); } @Test public void orFilter() { Filter filter1 = FF.equals(FF.property("Test1"), FOO_LITERAL); Filter filter2 = FF.equals(FF.property("Test2"), FF.literal("bar")); Filter filter3 = FF.equals(FF.property("Test3"), FF.literal("baz")); assertFilterEquals("or(Test1=foo)", FF.or(Arrays.asList(filter1))); assertFilterEquals("or(Test1=foo,Test2=bar)", FF.or(filter1, filter2)); assertFilterEquals("or(Test1=foo,or(Test2=bar,Test3=baz))", FF.or(filter1, FF.or(filter2, filter3))); assertFilterEquals("or(Test1=foo,Test2=bar,Test3=baz)", FF.or(Arrays.asList(filter1, filter2, filter3))); } @Test public void propertyIsNull() { assertFilterEquals("null(Test)", FF.isNull(TEST_PROPERTY)); } @Test public void propertyIsEqualTo() { assertFilterEquals("Test=foo", FF.equals(TEST_PROPERTY, FOO_LITERAL)); assertFilterEquals("Test=" + EPOCH.toString(), FF.equals(TEST_PROPERTY, FF.literal(EPOCH))); assertFilterEquals("Test=" + EPOCH.toString(), FF.equals(TEST_PROPERTY, FF.literal(EPOCH_INSTANT))); assertFilterEquals("Test=" + EPOCH.toString() + " to " + EPOCH_PLUS_DAY.toString(), FF.equals(TEST_PROPERTY, FF.literal(EPOCH_DAY_PERIOD))); assertFilterEquals("Test=5i", FF.equals(TEST_PROPERTY, FF.literal(new Integer(5)))); assertFilterEquals("Test=5s", FF.equals(TEST_PROPERTY, FF.literal(new Short((short) 5)))); assertFilterEquals("Test=5l", FF.equals(TEST_PROPERTY, FF.literal(new Long(5)))); assertFilterEquals("Test=5.0d", FF.equals(TEST_PROPERTY, FF.literal(new Double(5)))); assertFilterEquals("Test=5.0f", FF.equals(TEST_PROPERTY, FF.literal(new Float(5)))); assertFilterEquals("Test={5,6}b", FF.equals(TEST_PROPERTY, FF.literal(new byte[] {5, 6}))); assertFilterEquals("Test=true", FF.equals(TEST_PROPERTY, FF.literal(true))); // test Object case assertFilterEquals("Test=[1, 2, 3]o", FF.equals(TEST_PROPERTY, FF.literal(Arrays.asList(1, 2, 3)))); } @Test public void propertyIsEqualToUri() throws URISyntaxException { String url = "http://www.test.com"; URI uri = null; uri = new URI(url); assertFilterEquals("Test=" + url + "o", FF.equals(TEST_PROPERTY, FF.literal(uri))); } @Test public void propteryIsWithNulls() { assertFilterFails(FF.equals(TEST_PROPERTY, FF.literal(null))); assertFilterFails(FF.equals(FF.property(null), FOO_LITERAL)); assertFilterFails(FF.equals(FF.property(null), FF.property(null))); assertFilterFails(FF.notEqual(FF.property(null), FF.literal(null))); assertFilterFails(FF.greater(FF.property(null), FF.literal(null))); assertFilterFails(FF.greaterOrEqual(FF.property(null), FF.literal(null))); assertFilterFails(FF.less(FF.property(null), FF.literal(null))); assertFilterFails(FF.lessOrEqual(FF.property(null), FF.literal(null))); assertFilterFails(FF.between(FF.property(null), FF.literal(null), FF.literal(null))); assertFilterFails(FF.isNull(FF.property(null))); assertFilterFails(FF.like(FF.property(null), null)); } @Test public void propertyIsNotEqualTo() { assertFilterEquals("Test!=foo", FF.notEqual(TEST_PROPERTY, FOO_LITERAL)); assertFilterEquals("Test!=" + EPOCH.toString(), FF.notEqual(TEST_PROPERTY, FF.literal(EPOCH))); assertFilterEquals("Test!=" + EPOCH.toString(), FF.notEqual(TEST_PROPERTY, FF.literal(EPOCH_INSTANT))); assertFilterEquals("Test!=" + EPOCH.toString() + " to " + EPOCH_PLUS_DAY.toString(), FF.notEqual(TEST_PROPERTY, FF.literal(EPOCH_DAY_PERIOD))); assertFilterEquals("Test!=5i", FF.notEqual(TEST_PROPERTY, FF.literal(new Integer(5)))); assertFilterEquals("Test!=5s", FF.notEqual(TEST_PROPERTY, FF.literal(new Short((short) 5)))); assertFilterEquals("Test!=5l", FF.notEqual(TEST_PROPERTY, FF.literal(new Long(5)))); assertFilterEquals("Test!=5.0d", FF.notEqual(TEST_PROPERTY, FF.literal(new Double(5)))); assertFilterEquals("Test!=5.0f", FF.notEqual(TEST_PROPERTY, FF.literal(new Float(5)))); assertFilterEquals("Test!={5,6}b", FF.notEqual(TEST_PROPERTY, FF.literal(new byte[] {5, 6}))); assertFilterEquals("Test!=true", FF.notEqual(TEST_PROPERTY, FF.literal(true))); // test Object case assertFilterEquals("Test!=[1, 2, 3]o", FF.notEqual(TEST_PROPERTY, FF.literal(Arrays.asList(1, 2, 3)))); } @Test public void propertyIsGreaterThan() { assertFilterEquals("Test>foo", FF.greater(TEST_PROPERTY, FOO_LITERAL)); assertFilterEquals("Test>" + EPOCH.toString(), FF.greater(TEST_PROPERTY, FF.literal(EPOCH))); assertFilterEquals("Test>5i", FF.greater(TEST_PROPERTY, FF.literal(new Integer(5)))); assertFilterEquals("Test>5s", FF.greater(TEST_PROPERTY, FF.literal(new Short((short) 5)))); assertFilterEquals("Test>5l", FF.greater(TEST_PROPERTY, FF.literal(new Long(5)))); assertFilterEquals("Test>5.0d", FF.greater(TEST_PROPERTY, FF.literal(new Double(5)))); assertFilterEquals("Test>5.0f", FF.greater(TEST_PROPERTY, FF.literal(new Float(5)))); // test Object case assertFilterEquals("Test>[1, 2, 3]o", FF.greater(TEST_PROPERTY, FF.literal(Arrays.asList(1, 2, 3)))); } @Test public void propertyIsGreaterThanOrEqualTo() { assertFilterEquals("Test>=foo", FF.greaterOrEqual(TEST_PROPERTY, FOO_LITERAL)); assertFilterEquals("Test>=" + EPOCH.toString(), FF.greaterOrEqual(TEST_PROPERTY, FF.literal(EPOCH))); assertFilterEquals("Test>=5i", FF.greaterOrEqual(TEST_PROPERTY, FF.literal(new Integer(5)))); assertFilterEquals("Test>=5s", FF.greaterOrEqual(TEST_PROPERTY, FF.literal(new Short((short) 5)))); assertFilterEquals("Test>=5l", FF.greaterOrEqual(TEST_PROPERTY, FF.literal(new Long(5)))); assertFilterEquals("Test>=5.0d", FF.greaterOrEqual(TEST_PROPERTY, FF.literal(new Double(5)))); assertFilterEquals("Test>=5.0f", FF.greaterOrEqual(TEST_PROPERTY, FF.literal(new Float(5)))); // test Object case assertFilterEquals("Test>=[1, 2, 3]o", FF.greaterOrEqual(TEST_PROPERTY, FF.literal(Arrays.asList(1, 2, 3)))); } @Test public void propertyIsLessThan() { assertFilterEquals("Test<foo", FF.less(TEST_PROPERTY, FOO_LITERAL)); assertFilterEquals("Test<" + EPOCH.toString(), FF.less(TEST_PROPERTY, FF.literal(EPOCH))); assertFilterEquals("Test<5i", FF.less(TEST_PROPERTY, FF.literal(new Integer(5)))); assertFilterEquals("Test<5s", FF.less(TEST_PROPERTY, FF.literal(new Short((short) 5)))); assertFilterEquals("Test<5l", FF.less(TEST_PROPERTY, FF.literal(new Long(5)))); assertFilterEquals("Test<5.0d", FF.less(TEST_PROPERTY, FF.literal(new Double(5)))); assertFilterEquals("Test<5.0f", FF.less(TEST_PROPERTY, FF.literal(new Float(5)))); // test Object case assertFilterEquals("Test<[1, 2, 3]o", FF.less(TEST_PROPERTY, FF.literal(Arrays.asList(1, 2, 3)))); } @Test public void propertyIsLessThanOrEqualTo() { assertFilterEquals("Test<=foo", FF.lessOrEqual(TEST_PROPERTY, FOO_LITERAL)); assertFilterEquals("Test<=" + EPOCH.toString(), FF.lessOrEqual(TEST_PROPERTY, FF.literal(EPOCH))); assertFilterEquals("Test<=5i", FF.lessOrEqual(TEST_PROPERTY, FF.literal(new Integer(5)))); assertFilterEquals("Test<=5s", FF.lessOrEqual(TEST_PROPERTY, FF.literal(new Short((short) 5)))); assertFilterEquals("Test<=5l", FF.lessOrEqual(TEST_PROPERTY, FF.literal(new Long(5)))); assertFilterEquals("Test<=5.0d", FF.lessOrEqual(TEST_PROPERTY, FF.literal(new Double(5)))); assertFilterEquals("Test<=5.0f", FF.lessOrEqual(TEST_PROPERTY, FF.literal(new Float(5)))); // test Object case assertFilterEquals("Test<=[1, 2, 3]o", FF.lessOrEqual(TEST_PROPERTY, FF.literal(Arrays.asList(1, 2, 3)))); } @Test public void propertyIsBetween() { assertFilterEquals("foo<=Test<=bar", FF.between(TEST_PROPERTY, FOO_LITERAL, FF.literal("bar"))); assertFilterEquals(EPOCH.toString() + "<=Test<=" + EPOCH_PLUS_DAY.toString(), FF.between(TEST_PROPERTY, FF.literal(EPOCH), FF.literal(EPOCH_PLUS_DAY))); assertFilterEquals(EPOCH.toString() + "<=Test<=" + EPOCH_PLUS_DAY.toString(), FF.between(TEST_PROPERTY, FF.literal(EPOCH_INSTANT), FF.literal(EPOCH_PLUS_DAY_INSTANT))); assertFilterEquals("1i<=Test<=5i", FF.between(TEST_PROPERTY, FF.literal(new Integer(1)), FF.literal(new Integer(5)))); assertFilterEquals("1s<=Test<=5s", FF.between(TEST_PROPERTY, FF.literal(new Short((short) 1)), FF.literal(new Short((short) 5)))); assertFilterEquals("1l<=Test<=5l", FF.between(TEST_PROPERTY, FF.literal(new Long(1)), FF.literal(new Long(5)))); assertFilterEquals("1.0d<=Test<=5.0d", FF.between(TEST_PROPERTY, FF.literal(new Double(1)), FF.literal(new Double(5)))); assertFilterEquals("1.0f<=Test<=5.0f", FF.between(TEST_PROPERTY, FF.literal(new Float(1)), FF.literal(new Float(5)))); // test Object case assertFilterEquals("[1, 2, 3]o<=Test<=[2, 3, 4]o", FF.between(TEST_PROPERTY, FF.literal(Arrays.asList(1, 2, 3)), FF.literal(Arrays.asList(2, 3, 4)))); } @Test(expected = UnsupportedQueryException.class) public void bbox() throws UnsupportedQueryException { new GeotoolsFilterAdapterImpl() .adapt(FF.bbox(TEST_PROPERTY.toString(), 1.0, 1.0, 2.0, 2.0, null), null); } @Test(expected = UnsupportedQueryException.class) public void propertyIsNil() throws UnsupportedQueryException { new GeotoolsFilterAdapterImpl().adapt(FF.isNil(null, null), null); } @Test(expected = IllegalArgumentException.class) public void bboxNull() throws UnsupportedQueryException { new GeotoolsFilterAdapterImpl().adapt((BBOX) null, null); } @Test public void propertyIsLike() { // propertyIsLike // remove dangling escape character assertFilterEquals("like(Test,foo*?)", FF.like(TEST_PROPERTY, "foo*?\\")); // replace special characters with normalized characters assertFilterEquals("like(Test,foo*?)", FF.like(TEST_PROPERTY, "foo!@#", "!", "@", "#")); assertFilterEquals("like(Test,! @ # \\* )", FF.like(TEST_PROPERTY, "#! #@ ## #* #", "!", "@", "#")); // fuzzy search assertFilterEquals("fuzzy(Test,foo)", FF.like(new FuzzyFunction(Arrays.asList((Expression) (TEST_PROPERTY)), FF.literal("")), FOO_LITERAL_VALUE)); // TODO test failure if wildcard characters are sent String xpath = "//ns:name"; // xpath exists assertFilterEquals("xpath(" + xpath + ")", FF.like(FF.property(xpath), "")); assertFilterEquals("xpath(" + xpath + ")", FF.like(FF.property(xpath), "*")); // xpath is like // Verify if search phrase ends with an escape character that the // escape character is stripped from the phrase assertFilterEquals("xpath(" + xpath + ",foo*?)", FF.like(FF.property(xpath), "foo*?\\")); // Verify can override widlcard, escape character, and single character defaults assertFilterEquals("xpath(" + xpath + ",foo*?)", FF.like(FF.property(xpath), "foo!@#", "!", "@", "#")); // xpath is fuzzy assertFilterEquals("xpath(" + xpath + ",fuzzy(foo*?))", FF.like(new FuzzyFunction(Arrays.asList((Expression) (FF.property(xpath))), FF.literal("")), "foo*?\\")); assertFilterEquals("xpath(" + xpath + ",fuzzy(foo*?))", FF.like(new FuzzyFunction(Arrays.asList((Expression) (FF.property(xpath))), FF.literal("")), "foo!@#", "!", "@", "#")); } @Test public void unsupportedWildcards() { // more than one character assertFilterFails(FF.like(TEST_PROPERTY, FOO_LITERAL_VALUE, "!!", "@", "#")); assertFilterFails(FF.like(TEST_PROPERTY, FOO_LITERAL_VALUE, "!", "@@", "#")); assertFilterFails(FF.like(TEST_PROPERTY, FOO_LITERAL_VALUE, "!", "@", "##")); // duplicate characters assertFilterFails(FF.like(TEST_PROPERTY, FOO_LITERAL_VALUE, "!", "!", "#")); assertFilterFails(FF.like(TEST_PROPERTY, FOO_LITERAL_VALUE, "!", "@", "@")); assertFilterFails(FF.like(TEST_PROPERTY, FOO_LITERAL_VALUE, "!", "@", "!")); } @Test public void reversedPropertyNameAndLiteral() { assertFilterEquals("Test=foo", FF.equals(FOO_LITERAL, TEST_PROPERTY)); assertFilterEquals("Test!=foo", FF.notEqual(FOO_LITERAL, TEST_PROPERTY)); assertFilterEquals("Test<foo", FF.greater(FOO_LITERAL, TEST_PROPERTY)); assertFilterEquals("Test<=foo", FF.greaterOrEqual(FOO_LITERAL, TEST_PROPERTY)); assertFilterEquals("Test>foo", FF.less(FOO_LITERAL, TEST_PROPERTY)); assertFilterEquals("Test>=foo", FF.lessOrEqual(FOO_LITERAL, TEST_PROPERTY)); } @Test public void unsupportedExpressions() { // divide assertFilterFails(FF.equals(TEST_PROPERTY, FF.divide(FF.literal(6), FF.literal(3)))); // two expressions assertFilterFails(FF.equals(TEST_PROPERTY, FF.property("Test2"))); } @Test public void spatialBeyondFilter() { Geometry polygonGeometry = wktToGeometry(POLYGON_WKT); // meters assertFilterEquals("beyond(Test,wkt(" + POLYGON_WKT + "),10.0)", FF.beyond(TEST_PROPERTY_VALUE, polygonGeometry, DISTANCE_10, UomOgcMapping.METRE.name())); // feet assertFilterEquals("beyond(Test,wkt(" + POLYGON_WKT + "),3.048006096012192)", FF.beyond(TEST_PROPERTY_VALUE, polygonGeometry, DISTANCE_10, UomOgcMapping.FOOT.name())); // nearest neighbor assertFilterEquals("nn(Test,wkt(" + POLYGON_WKT + "))", FF.beyond(TEST_PROPERTY_VALUE, polygonGeometry, 0, UomOgcMapping.METRE.name())); } @Test public void spatialContainsFilter() { Geometry polygonGeometry = wktToGeometry(POLYGON_WKT); assertFilterEquals("contains(Test,wkt(" + POLYGON_WKT + "))", FF.contains(TEST_PROPERTY_VALUE, polygonGeometry)); } @Test public void spatialDWithinFilter() { Geometry polygonGeometry = wktToGeometry(POLYGON_WKT); // as meters assertFilterEquals("dwithin(Test,wkt(" + POLYGON_WKT + "),10.0)", FF.dwithin(TEST_PROPERTY_VALUE, polygonGeometry, DISTANCE_10, UomOgcMapping.METRE.name())); // as feet assertFilterEquals("dwithin(Test,wkt(" + POLYGON_WKT + "),3.048006096012192)", FF.dwithin(TEST_PROPERTY_VALUE, polygonGeometry, DISTANCE_10, UomOgcMapping.FOOT.name())); } @Test public void spatialIntersectsFilter() { Geometry polygonGeometry = wktToGeometry(POLYGON_WKT); assertFilterEquals("intersects(Test,wkt(" + POLYGON_WKT + "))", FF.intersects(TEST_PROPERTY_VALUE, polygonGeometry)); } @Test public void spatialWithinFilter() { Geometry polygonGeometry = wktToGeometry(POLYGON_WKT); assertFilterEquals("within(Test,wkt(" + POLYGON_WKT + "))", FF.within(TEST_PROPERTY_VALUE, polygonGeometry)); } @Test public void spatialCrossesFilter() { Geometry polygonGeometry = wktToGeometry(POLYGON_WKT); assertFilterEquals("crosses(Test,wkt(" + POLYGON_WKT + "))", FF.crosses(TEST_PROPERTY_VALUE, polygonGeometry)); } @Test public void spatialDisjointFilter() { Geometry polygonGeometry = wktToGeometry(POLYGON_WKT); assertFilterEquals("disjoint(Test,wkt(" + POLYGON_WKT + "))", FF.disjoint(TEST_PROPERTY_VALUE, polygonGeometry)); } @Test public void spatialOverlapsFilter() { Geometry polygonGeometry = wktToGeometry(POLYGON_WKT); assertFilterEquals("overlaps(Test,wkt(" + POLYGON_WKT + "))", FF.overlaps(TEST_PROPERTY_VALUE, polygonGeometry)); } @Test public void spatialTouchesFilter() { Geometry polygonGeometry = wktToGeometry(POLYGON_WKT); assertFilterEquals("touches(Test,wkt(" + POLYGON_WKT + "))", FF.touches(TEST_PROPERTY_VALUE, polygonGeometry)); } @Test public void spatialWithNulls() { assertFilterFails(FF.beyond(null, null, 0, null)); assertFilterFails(FF.contains(null, null)); assertFilterFails(FF.dwithin(null, null, 0, null)); assertFilterFails(FF.intersects(null, null)); assertFilterFails(FF.within(null, null)); assertFilterFails(FF.crosses(null, null)); assertFilterFails(FF.disjoint(null, null)); assertFilterFails(FF.overlaps(null, null)); assertFilterFails(FF.touches(null, null)); } @Test public void spatialWrappedGeometry() throws com.vividsolutions.jts.io.ParseException { WKTReader reader = new WKTReader(); com.vividsolutions.jts.geom.Geometry geo = reader.read(MULTIPOLYGON_WKT); Geometry geometry = new JTSGeometryWrapper(geo); assertFilterEquals("beyond(Test,wkt(" + MULTIPOLYGON_WKT + "),10.0)", FF.beyond(TEST_PROPERTY_VALUE, geometry, DISTANCE_10, UomOgcMapping.METRE.name())); assertFilterEquals("contains(Test,wkt(" + MULTIPOLYGON_WKT + "))", FF.contains(TEST_PROPERTY_VALUE, geometry)); assertFilterEquals("dwithin(Test,wkt(" + MULTIPOLYGON_WKT + "),10.0)", FF.dwithin(TEST_PROPERTY_VALUE, geometry, DISTANCE_10, UomOgcMapping.METRE.name())); assertFilterEquals("intersects(Test,wkt(" + MULTIPOLYGON_WKT + "))", FF.intersects(TEST_PROPERTY_VALUE, geometry)); assertFilterEquals("within(Test,wkt(" + MULTIPOLYGON_WKT + "))", FF.within(TEST_PROPERTY_VALUE, geometry)); } private Geometry wktToGeometry(String wkt) { Geometry geometry = null; try { geometry = WKT_PARSER.parse(wkt); } catch (ParseException e) { fail(); } return geometry; } @Test public void temporialAfterFilter() { // date assertFilterEquals("after(Test," + EPOCH.toString() + ")", FF.after(TEST_PROPERTY, FF.literal(EPOCH))); // instant assertFilterEquals("after(Test," + EPOCH.toString() + ")", FF.after(TEST_PROPERTY, FF.literal(EPOCH_INSTANT))); // period assertFilterEquals("after(Test," + EPOCH_PLUS_DAY.toString() + ")", FF.after(TEST_PROPERTY, FF.literal(EPOCH_DAY_PERIOD))); } @Test public void temporialBeforeFilter() { // date assertFilterEquals("before(Test," + EPOCH.toString() + ")", FF.before(TEST_PROPERTY, FF.literal(EPOCH))); // instant assertFilterEquals("before(Test," + EPOCH.toString() + ")", FF.before(TEST_PROPERTY, FF.literal(EPOCH_INSTANT))); // period assertFilterEquals("before(Test," + EPOCH.toString() + ")", FF.before(TEST_PROPERTY, FF.literal(EPOCH_DAY_PERIOD))); } @Test public void temporialDuringFilter() { // Absolute assertFilterEquals( "during(Test," + EPOCH.toString() + "," + EPOCH_PLUS_DAY.toString() + ")", FF.during(TEST_PROPERTY, FF.literal(EPOCH_DAY_PERIOD))); // Relative assertFilterEquals("relative(Test," + DAY_IN_MILLISECONDS + ")", FF.during(TEST_PROPERTY, FF.literal(DAY_DURATION))); } private void assertFilterFails(Filter filter) { FilterDelegate<String> delegate = new FilterToTextDelegate(); FilterAdapter fa = new GeotoolsFilterAdapterImpl(); try { fa.adapt(filter, delegate); fail("Expected UnsupportedQueryException"); } catch (UnsupportedQueryException e) { // pass } } private void assertFilterEquals(String expected, Filter filter) { FilterDelegate<String> delegate = new FilterToTextDelegate(); FilterAdapter fa = new GeotoolsFilterAdapterImpl(); String result = null; try { result = fa.adapt(filter, delegate); } catch (UnsupportedQueryException e) { fail(e.getMessage()); } assertEquals(expected, result); } }