/*
* 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.xml.filter;
import junit.framework.TestCase;
import org.geotools.filter.CompareFilter;
import org.geotools.filter.FidFilter;
import org.geotools.filter.Filter;
import org.geotools.filter.FilterFactory;
import org.geotools.filter.FilterFactoryFinder;
import org.geotools.filter.FilterType;
import org.geotools.filter.NullFilter;
import org.geotools.xml.XMLHandlerHints;
public class FilterEncodingPreProcessorTest extends TestCase {
protected void setUp() throws Exception {
super.setUp();
}
public void testNOTFids() throws Exception {
FilterFactory factory = FilterFactoryFinder
.createFilterFactory();
String fid1 = "FID.1";
Filter filter = factory.createFidFilter(fid1).not();
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
filter.accept(visitor);
assertEquals(filter, visitor.getFilter());
assertEquals(factory.createFidFilter(), visitor.getFidFilter());
//Test MEDIUM compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
filter.accept(visitor);
assertEquals(Filter.INCLUDE, visitor.getFilter());
assertEquals(factory.createFidFilter(), visitor.getFidFilter());
assertTrue(visitor.requiresPostProcessing());
//Test HIGH compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
filter.accept(visitor);
assertEquals(Filter.INCLUDE, visitor.getFilter());
assertEquals(factory.createFidFilter(), visitor.getFidFilter());
assertTrue(visitor.requiresPostProcessing());
}
public void testNOTANDFids() throws Exception {
FilterFactory factory = FilterFactoryFinder.createFilterFactory();
String fid1 = "FID.1";
Filter fidFilter = factory.createFidFilter(fid1).not();
NullFilter nullFilter = factory.createNullFilter();
nullFilter.nullCheckValue(factory.createAttributeExpression("name"));
Filter filter = nullFilter.and(fidFilter);
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
filter.accept(visitor);
assertEquals(filter, visitor.getFilter());
assertEquals(factory.createFidFilter(), visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
//Test MEDIUM compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
filter.accept(visitor);
assertEquals(nullFilter, visitor.getFilter());
assertEquals(factory.createFidFilter(), visitor.getFidFilter());
assertTrue(visitor.requiresPostProcessing());
//Test HIGH compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
filter.accept(visitor);
assertEquals(nullFilter, visitor.getFilter());
assertEquals(factory.createFidFilter(), visitor.getFidFilter());
assertTrue(visitor.requiresPostProcessing());
}
public void testStraightANDFids() throws Exception {
FilterFactory factory = FilterFactoryFinder.createFilterFactory();
String fid1 = "FID.1";
String fid2 = "FID.2";
Filter filter = factory.createFidFilter(fid1)
.and(factory.createFidFilter(fid2));
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
filter.accept(visitor);
assertEquals(filter, visitor.getFilter());
FidFilter fidFilter = factory.createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
filter.accept(visitor);
// anding 2 different fids results in nothing.
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = factory.createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
filter.accept(visitor);
// anding 2 different fids results in nothing.
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = factory.createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test and same fid
filter = factory.createFidFilter(fid1).and(factory.createFidFilter(fid1));
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
filter.accept(visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = factory.createFidFilter();
fidFilter.addFid(fid1);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
filter.accept(visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
}
public void testMixedAND() throws Exception {
FilterFactory factory = FilterFactoryFinder.createFilterFactory();
String fid1 = "FID.1";
String fid2 = "FID.2";
Filter filter = factory.createFidFilter(fid1)
.or(factory.createFidFilter(fid2));
NullFilter nullFilter = factory.createNullFilter();
nullFilter.nullCheckValue(factory.createAttributeExpression("att"));
filter = filter.and(nullFilter);
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
filter.accept(visitor);
assertEquals(filter, visitor.getFilter());
FidFilter fidFilter = factory.createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
filter.accept(visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = factory.createFidFilter();
fidFilter.addFid(fid1);
fidFilter.addFid(fid2);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
filter.accept(visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = factory.createFidFilter();
fidFilter.addFid(fid1);
fidFilter.addFid(fid2);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
}
public void testStraightOrFids() throws Exception {
FilterFactory factory = FilterFactoryFinder.createFilterFactory();
String fid1 = "FID.1";
String fid2 = "FID.2";
Filter filter = factory.createFidFilter(fid1)
.or(factory.createFidFilter(fid2));
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
filter.accept(visitor);
assertEquals(filter, visitor.getFilter());
FidFilter fidFilter = factory.createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
filter.accept(visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = factory.createFidFilter();
fidFilter.addFid(fid1);
fidFilter.addFid(fid2);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
filter.accept(visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = factory.createFidFilter();
fidFilter.addFid(fid1);
fidFilter.addFid(fid2);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
}
public void testMixedOr() throws Exception {
FilterFactory factory = FilterFactoryFinder.createFilterFactory();
String fid1 = "FID.1";
String fid2 = "FID.2";
Filter filter = factory.createFidFilter(fid1)
.or(factory.createFidFilter(fid2));
NullFilter nullFilter = factory.createNullFilter();
nullFilter.nullCheckValue(factory.createAttributeExpression("att"));
filter = filter.or(nullFilter);
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
filter.accept(visitor);
assertEquals(filter, visitor.getFilter());
FidFilter fidFilter = factory.createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
filter.accept(visitor);
assertEquals(nullFilter, visitor.getFilter());
fidFilter = factory.createFidFilter();
fidFilter.addFid(fid1);
fidFilter.addFid(fid2);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
try {
filter.accept(visitor);
fail("This is not a legal filter for this compliance level");
} catch (UnsupportedFilterException e) {
// good
}
}
/**
* Tests the following filter:
*
* and {
* nullFilter
* or{
* fidFilter
* nullFilter
* }
* }
*
* for medium it should end up as:
*
* and{
* nullFilter
* nullFilter
* }
*
* and the fids should be included.
*
* @throws Exception
*/
public void testMixedAndOr() throws Exception {
FilterFactory factory = FilterFactoryFinder.createFilterFactory();
String fid1 = "FID.1";
NullFilter nullFilter1 = factory.createNullFilter();
nullFilter1.nullCheckValue(factory.createAttributeExpression("att"));
Filter filter = factory.createFidFilter(fid1).or(nullFilter1);
NullFilter nullFilter2 = factory.createNullFilter();
nullFilter2.nullCheckValue(factory.createAttributeExpression("name"));
filter = nullFilter2.and(filter);
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
filter.accept(visitor);
assertEquals(filter, visitor.getFilter());
FidFilter fidFilter = factory.createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
filter.accept(visitor);
assertEquals(nullFilter1.and(nullFilter2), visitor.getFilter());
fidFilter = factory.createFidFilter();
fidFilter.addFid(fid1);
assertEquals(fidFilter, visitor.getFidFilter());
assertTrue(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
try {
filter.accept(visitor);
fail("This is not a legal filter for this compliance level");
} catch (UnsupportedFilterException e) {
// good
}
}
public void testStrictlyLegalFilter() throws Exception {
FilterFactory factory = FilterFactoryFinder.createFilterFactory();
NullFilter nullFilter1 = factory.createNullFilter();
nullFilter1.nullCheckValue(factory.createAttributeExpression("att"));
NullFilter nullFilter2 = factory.createNullFilter();
nullFilter2.nullCheckValue(factory.createAttributeExpression("name"));
CompareFilter compareFilter = factory.createCompareFilter(FilterType.COMPARE_EQUALS);
compareFilter.addLeftValue(factory.createAttributeExpression("name"));
compareFilter.addRightValue(factory.createLiteralExpression(3));
Filter filter = nullFilter2.and(nullFilter1);
filter = filter.not();
filter = filter.or(compareFilter);
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
filter.accept(visitor);
assertEquals(filter, visitor.getFilter());
FidFilter fidFilter = factory.createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
filter.accept(visitor);
assertEquals(filter, visitor.getFilter());
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
//Test High level compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
filter.accept(visitor);
assertEquals(filter, visitor.getFilter());
assertEquals(factory.createFidFilter(), visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
}
}