/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo) * * 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.geotools.filter; import junit.framework.Test; import junit.framework.TestSuite; import org.geotools.feature.IllegalAttributeException; import org.geotools.feature.SchemaException; import org.geotools.filter.expression.AddImpl; /** * Unit test for SQLUnpacker. * * @author Chris Holmes, TOPP * @source $URL$ */ public class SQLUnpackerTest extends SQLFilterTestSupport { /** Standard logging instance */ //private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.geotools.defaultcore"); /** Filters on which to perform tests */ private BetweenFilterImpl btwnFilter; private CompareFilter compFilter; private GeometryFilter geomFilter; private LikeFilterImpl likeFilter; private NullFilterImpl nullFilter; private AttributeExpressionImpl attrExp1; private AttributeExpressionImpl attrExp2; private LiteralExpressionImpl litExp1; private LiteralExpressionImpl litExp2; private MathExpressionImpl mathExp1; /** strings for Like filter */ private String pattern = "te_st!"; private String wcMulti = "!"; private String wcSingle = "_"; private String escape = "#"; /** capabilities for unpacker */ private FilterCapabilities capabilities; // private SQLEncoder encoder; private SQLUnpacker unpacker; /** Test suite for this test case */ TestSuite suite = null; /** * Constructor with test name. * * @param testName DOCUMENT ME! */ public SQLUnpackerTest(String testName) { super(testName); LOGGER.finer("running SQLUnpackerTests"); } /** * Main for test runner. * * @param args DOCUMENT ME! */ public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } /** * Required suite builder. * * @return A test suite for this unit test. */ public static Test suite() { //_log.getLoggerRepository().setThreshold(Level.DEBUG); TestSuite suite = new TestSuite(SQLUnpackerTest.class); return suite; } /** * Sets up a schema and a test feature. * * @throws SchemaException If there is a problem setting up the schema. * @throws IllegalAttributeException If problem setting up the feature. */ protected void setUp() throws SchemaException, IllegalAttributeException { //if(setup) return; super.setUp(); setup = true; //_log.getLoggerRepository().setThreshold(Level.INFO); //Set capabilities for the SQLUnpacker capabilities = new FilterCapabilities(); capabilities.addType(AbstractFilter.LOGIC_OR); capabilities.addType(AbstractFilter.LOGIC_AND); capabilities.addType(AbstractFilter.LOGIC_NOT); capabilities.addType(AbstractFilter.COMPARE_EQUALS); capabilities.addType(AbstractFilter.COMPARE_LESS_THAN); capabilities.addType(AbstractFilter.COMPARE_GREATER_THAN); capabilities.addType(AbstractFilter.COMPARE_LESS_THAN_EQUAL); capabilities.addType(AbstractFilter.COMPARE_GREATER_THAN_EQUAL); capabilities.addType(AbstractFilter.NULL); capabilities.addType(AbstractFilter.BETWEEN); unpacker = new SQLUnpacker(capabilities); try { attrExp1 = new AttributeExpressionImpl(testSchema, "testInteger"); attrExp2 = new AttributeExpressionImpl(testSchema, "testGeometry"); litExp1 = new LiteralExpressionImpl(new Integer(65)); litExp2 = new LiteralExpressionImpl(new Integer(35)); mathExp1 = new AddImpl(null,null); mathExp1.addLeftValue(litExp1); mathExp1.addRightValue(litExp2); btwnFilter = new BetweenFilterImpl(); btwnFilter.addLeftValue(litExp1); btwnFilter.addMiddleValue(attrExp1); btwnFilter.addRightValue(mathExp1); FilterFactory factory = FilterFactoryFinder.createFilterFactory(); compFilter = factory.createCompareFilter(AbstractFilter.COMPARE_LESS_THAN); compFilter.addLeftValue(attrExp1); compFilter.addRightValue(litExp2); geomFilter = factory.createGeometryFilter(AbstractFilter.GEOMETRY_TOUCHES); geomFilter.addLeftGeometry(attrExp2); geomFilter.addRightGeometry(litExp2); likeFilter = new LikeFilterImpl(); likeFilter.setValue(attrExp1); likeFilter.setPattern(pattern, wcMulti, wcSingle, escape); nullFilter = new NullFilterImpl(); nullFilter.nullCheckValue(attrExp2); } catch (IllegalFilterException e) { //should not happen. fail(e.getMessage()); } // testFeature = factory.create(attributes); LOGGER.finer("...set up complete"); //_log.getLoggerRepository().setThreshold(Level.DEBUG); } public void testBasics() throws IllegalFilterException { unpacker.unPackAND(btwnFilter); //Unsupported should be null, supported btwnFilter assertNull(unpacker.getUnSupported()); assertEquals(btwnFilter, unpacker.getSupported()); unpacker.unPackAND(compFilter); //null, compFilter assertNull(unpacker.getUnSupported()); assertEquals(compFilter, unpacker.getSupported()); unpacker.unPackAND(geomFilter); //Unsupported should be geomFilter, supported null assertEquals(geomFilter, unpacker.getUnSupported()); assertNull(unpacker.getSupported()); unpacker.unPackAND(likeFilter); //likeFilter, null assertEquals(likeFilter, unpacker.getUnSupported()); assertNull(unpacker.getSupported()); unpacker.unPackAND(nullFilter); //null, nullFilter assertNull(unpacker.getUnSupported()); assertEquals(nullFilter, unpacker.getSupported()); } public void testBasicsOR() throws IllegalFilterException { unpacker.unPackOR(btwnFilter); //Unsupported should be null, supported btwnFilter assertNull(unpacker.getUnSupported()); assertEquals(btwnFilter, unpacker.getSupported()); unpacker.unPackOR(compFilter); //null, compFilter assertNull(unpacker.getUnSupported()); assertEquals(compFilter, unpacker.getSupported()); unpacker.unPackOR(geomFilter); //Unsupported should be geomFilter, supported null assertEquals(geomFilter, unpacker.getUnSupported()); assertNull(unpacker.getSupported()); unpacker.unPackOR(likeFilter); //likeFilter, null assertEquals(likeFilter, unpacker.getUnSupported()); assertNull(unpacker.getSupported()); unpacker.unPackOR(nullFilter); //null, nullFilter assertNull(unpacker.getUnSupported()); assertEquals(nullFilter, unpacker.getSupported()); } public void testAnd() throws IllegalFilterException { //I will use the notation (Unsupported, Supported) to indicate //the filters that should result, that we are testing against. Filter andFilter = btwnFilter.and(compFilter); unpacker.unPackAND(andFilter); //both supported (null, andFilter) assertNull(unpacker.getUnSupported()); assertEquals(andFilter, unpacker.getSupported()); andFilter = likeFilter.and(compFilter); unpacker.unPackAND(andFilter); //Comp supported, Like not: (likeFilter, compFilter) assertEquals(likeFilter, unpacker.getUnSupported()); assertEquals(compFilter, unpacker.getSupported()); andFilter = likeFilter.and(geomFilter); unpacker.unPackAND(andFilter); //both unsupported (andFilter, null) assertEquals(andFilter, unpacker.getUnSupported()); assertNull(unpacker.getSupported()); } public void testNot() throws IllegalFilterException { Filter notFilter = nullFilter.not(); unpacker.unPackAND(notFilter); //nullFilters supported (null, nullFilter) assertNull(unpacker.getUnSupported()); assertEquals(notFilter, unpacker.getSupported()); notFilter = geomFilter.not(); unpacker.unPackAND(notFilter); //geomFilters not supported (geomFilter, null); assertEquals(notFilter, unpacker.getUnSupported()); assertNull(unpacker.getSupported()); } public void testOr() throws IllegalFilterException { Filter orFilter = btwnFilter.or(compFilter); unpacker.unPackAND(orFilter); //both supported (null, orFilter) assertNull(unpacker.getUnSupported()); assertEquals(orFilter, unpacker.getSupported()); orFilter = likeFilter.or(compFilter); unpacker.unPackAND(orFilter); //both unsupported: (orFilter, null) assertEquals(orFilter, unpacker.getUnSupported()); assertNull(unpacker.getSupported()); orFilter = likeFilter.and(geomFilter); unpacker.unPackAND(orFilter); //both unsupported (orFilter, null) assertEquals(orFilter, unpacker.getUnSupported()); assertNull(unpacker.getSupported()); } //put in more unPackOR's public void testComplex() throws IllegalFilterException { Filter orFilter = likeFilter.or(btwnFilter); Filter andFilter = orFilter.and(compFilter); unpacker.unPackAND(andFilter); //compFilter supported, none of orFilter: (orFilter, compFilter) assertEquals(orFilter, unpacker.getUnSupported()); assertEquals(compFilter, unpacker.getSupported()); Filter bigOrFilter = (andFilter.or(compFilter)).or(nullFilter); Filter biggerOrFilter = bigOrFilter.or(nullFilter); //Top level or with one unsupported (like from orFilter) //makes all unsupported: (bigOrFilter, null) unpacker.unPackAND(biggerOrFilter); assertEquals(biggerOrFilter, unpacker.getUnSupported()); assertNull(unpacker.getSupported()); Filter bigAndFilter = (geomFilter.and(compFilter)).and(orFilter); //comp supported, orFilter not, geomFilter not: //(orFilter AND geomFilter, compFilter) unpacker.unPackAND(bigAndFilter); assertEquals((orFilter.and(geomFilter)), unpacker.getUnSupported()); assertEquals(compFilter, unpacker.getSupported()); unpacker.unPackOR(bigAndFilter); assertEquals(bigAndFilter, unpacker.getUnSupported()); assertNull(unpacker.getSupported()); Filter hugeAndFilter = (bigAndFilter.and(andFilter)).and(bigOrFilter); unpacker.unPackAND(hugeAndFilter); // two comps should be supported; geom, or and bigOr unsupported // (compFilter AND compFilter, geomFilter AND orFilter AND orFilter AND bigOrFilter) assertEquals( (compFilter.and(compFilter)), unpacker.getSupported() ); Filter expected = (((geomFilter.and(orFilter)).and(orFilter)).and( bigOrFilter)); org.opengis.filter.Filter unsupported = unpacker.getUnSupported(); assertEquals( expected, unsupported ); } }