/*
* 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 java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import junit.framework.TestCase;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.filter.Filters;
import org.geotools.xml.XMLHandlerHints;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory2;
import org.opengis.filter.Id;
import org.opengis.filter.PropertyIsNull;
import org.opengis.filter.identity.FeatureId;
public class FilterEncodingPreProcessorTest extends TestCase {
protected void setUp() throws Exception {
super.setUp();
}
public void testNOTFids() throws Exception {
FilterFactory2 factory = CommonFactoryFinder.getFilterFactory2(null);
String fid1 = "FID.1";
// not id filter does not actually have a valid encoding
Filter filter = factory.not( factory.id( Collections.singleton( factory.featureId(fid1) ) ) );
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
Filters.accept(filter, visitor);
assertEquals(filter, visitor.getFilter());
assertTrue(visitor.getFidFilter().getIdentifiers().isEmpty());
//Test MEDIUM compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
Filters.accept(filter, visitor);
assertEquals(Filter.INCLUDE, visitor.getFilter());
assertTrue(visitor.getFidFilter().getIdentifiers().isEmpty());
assertTrue(visitor.requiresPostProcessing());
//Test HIGH compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
Filters.accept(filter, visitor);
assertEquals(Filter.INCLUDE, visitor.getFilter());
assertTrue(visitor.getFidFilter().getIdentifiers().isEmpty());
assertTrue(visitor.requiresPostProcessing());
}
public void testNOTANDFids() throws Exception {
FilterFactory2 factory = CommonFactoryFinder.getFilterFactory2(null);
String fid1 = "FID.1";
Filter fidFilter = factory.not( factory.id( Collections.singleton( factory.featureId(fid1) ) ) );
PropertyIsNull nullFilter = factory.isNull( factory.property("name"));
Filter filter = factory.and(nullFilter,fidFilter);
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
Filters.accept(filter, visitor);
assertEquals(filter, visitor.getFilter());
assertTrue(visitor.getFidFilter().getIdentifiers().isEmpty());
assertFalse(visitor.requiresPostProcessing());
//Test MEDIUM compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
Filters.accept(filter, visitor);
assertEquals(nullFilter, visitor.getFilter());
assertTrue(visitor.getFidFilter().getIdentifiers().isEmpty());
assertTrue(visitor.requiresPostProcessing());
//Test HIGH compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
Filters.accept(filter, visitor);
assertEquals(nullFilter, visitor.getFilter());
assertTrue(visitor.getFidFilter().getIdentifiers().isEmpty());
assertTrue(visitor.requiresPostProcessing());
}
Id createFidFilter(String... fid){
FilterFactory2 factory = CommonFactoryFinder.getFilterFactory2(null);
Set<FeatureId> set;
if( fid == null || fid.length == 0){
set = Collections.emptySet();
}
else {
set = new HashSet<FeatureId>();
for( String f : fid ){
set.add( factory.featureId(f));
}
}
return factory.id( set );
}
public void testStraightANDFids() throws Exception {
FilterFactory2 factory = CommonFactoryFinder.getFilterFactory2(null);
String fid1 = "FID.1";
String fid2 = "FID.2";
Filter filter = factory.id(Collections.singleton( factory.featureId(fid1)));
filter = factory.and( filter, factory.id(Collections.singleton( factory.featureId(fid2))));
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
Filters.accept(filter, visitor);
assertEquals(filter, visitor.getFilter());
Set<FeatureId> empty = Collections.emptySet();
Filter fidFilter = factory.id( empty );
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
Filters.accept(fidFilter, visitor);
// anding 2 different fids results in nothing.
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
Filters.accept(fidFilter, visitor);
// anding 2 different fids results in nothing.
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test and same fid
filter = factory.and( createFidFilter(fid1), createFidFilter(fid1));
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
Filters.accept(filter, visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = createFidFilter(fid1);
assertEquals(createFidFilter(fid1), visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
Filters.accept(filter, visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
}
public void testMixedAND() throws Exception {
FilterFactory2 factory = CommonFactoryFinder.getFilterFactory2(null);
String fid1 = "FID.1";
String fid2 = "FID.2";
Filter filter = factory.or( createFidFilter(fid1), createFidFilter(fid2));
Filter nullFilter = factory.isNull(factory.property("att"));
filter = factory.and( filter, nullFilter);
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
Filters.accept(filter, visitor);
assertEquals(filter, visitor.getFilter());
Filter fidFilter = createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
Filters.accept(filter, visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = createFidFilter(fid1,fid2);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
Filters.accept(filter, visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = createFidFilter(fid1,fid2);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
}
public void testStraightOrFids() throws Exception {
FilterFactory2 factory = CommonFactoryFinder.getFilterFactory2(null);
String fid1 = "FID.1";
String fid2 = "FID.2";
Filter filter = factory.or( createFidFilter(fid1),createFidFilter(fid2));
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
Filters.accept(filter, visitor);
assertEquals(filter, visitor.getFilter());
Filter fidFilter = createFidFilter(null);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
Filters.accept(filter, visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = createFidFilter(fid1,fid2);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
Filters.accept(filter, visitor);
assertEquals(Filter.EXCLUDE, visitor.getFilter());
fidFilter = createFidFilter(fid1,fid2);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
}
public void testMixedOr() throws Exception {
FilterFactory2 factory = CommonFactoryFinder.getFilterFactory2(null);
String fid1 = "FID.1";
String fid2 = "FID.2";
Filter filter = factory.or( createFidFilter(fid1), createFidFilter(fid2));
Filter nullFilter = factory.isNull(factory.property("att"));
filter = factory.or( filter, nullFilter);
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
Filters.accept(filter, visitor);
assertEquals(filter, visitor.getFilter());
Filter fidFilter = createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
Filters.accept(filter, visitor);
assertEquals(nullFilter, visitor.getFilter());
fidFilter = createFidFilter(fid1,fid2);
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
try {
Filters.accept(filter, 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 {
FilterFactory2 factory = CommonFactoryFinder.getFilterFactory2(null);
String fid1 = "FID.1";
Filter nullFilter1 = factory.isNull(factory.property("att"));
Filter filter = factory.or( createFidFilter(fid1),nullFilter1);
Filter nullFilter2 = factory.isNull(factory.property("name"));
filter = factory.and( nullFilter2,filter);
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
Filters.accept(filter, visitor);
assertEquals(filter, visitor.getFilter());
Filter fidFilter = createFidFilter();
assertEquals(fidFilter, visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
Filters.accept(filter, visitor);
assertEquals( factory.and( nullFilter1,nullFilter2), visitor.getFilter());
fidFilter = createFidFilter(fid1);
assertEquals(fidFilter, visitor.getFidFilter());
assertTrue(visitor.requiresPostProcessing());
// Test High compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
try {
Filters.accept(filter, visitor);
fail("This is not a legal filter for this compliance level");
} catch (UnsupportedFilterException e) {
// good
}
}
public void testStrictlyLegalFilter() throws Exception {
FilterFactory2 factory = CommonFactoryFinder.getFilterFactory2(null);
Filter nullFilter1 = factory.isNull(factory.property("att"));
Filter nullFilter2 = factory.isNull(factory.property("name"));
Filter compareFilter = factory.equals(factory.property("name"), factory.literal(3));
Filter filter = factory.and( nullFilter2,nullFilter1);
filter = factory.not(filter);
filter = factory.or(filter,compareFilter);
// Test Low compliance
FilterEncodingPreProcessor visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_LOW);
Filters.accept(filter, visitor);
assertEquals(filter, visitor.getFilter());
assertEquals(createFidFilter(), visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
// Test Medium level compliance.
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_MEDIUM);
Filters.accept(filter, visitor);
assertEquals(filter, visitor.getFilter());
assertEquals(createFidFilter(), visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
//Test High level compliance
visitor = new FilterEncodingPreProcessor(XMLHandlerHints.VALUE_FILTER_COMPLIANCE_HIGH);
Filters.accept(filter, visitor);
assertEquals(filter, visitor.getFilter());
assertEquals(createFidFilter(), visitor.getFidFilter());
assertFalse(visitor.requiresPostProcessing());
}
}