package mil.nga.giat.geowave.format.landsat8; import org.apache.commons.lang.ArrayUtils; import org.geotools.data.DataUtilities; import org.geotools.filter.visitor.DuplicatingFilterVisitor; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.filter.Filter; 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.PropertyIsNil; import org.opengis.filter.PropertyIsNotEqualTo; import org.opengis.filter.PropertyIsNull; import org.opengis.filter.spatial.BBOX; import org.opengis.filter.spatial.Beyond; 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; public class PropertyIgnoringFilterVisitor extends DuplicatingFilterVisitor { private final String[] validPropertyNames; private final SimpleFeatureType type; public PropertyIgnoringFilterVisitor( final String[] validPropertyNames, final SimpleFeatureType type ) { this.validPropertyNames = validPropertyNames; this.type = type; } @Override public Object visit( final PropertyIsBetween filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final PropertyIsEqualTo filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final PropertyIsNotEqualTo filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final PropertyIsGreaterThan filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final PropertyIsGreaterThanOrEqualTo filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final PropertyIsLessThan filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final PropertyIsLessThanOrEqualTo filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final PropertyIsLike filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final PropertyIsNull filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final PropertyIsNil filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final BBOX filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final Beyond filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final Contains filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final Crosses filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final Disjoint filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final DWithin filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final Equals filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final Intersects filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final Overlaps filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final Touches filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final Within filter, final Object extraData ) { if (!usesProperty(filter)) { return Filter.INCLUDE; } return super.visit( filter, extraData); } @Override public Object visit( final After after, final Object extraData ) { if (!usesProperty(after)) { return Filter.INCLUDE; } return super.visit( after, extraData); } @Override public Object visit( final AnyInteracts anyInteracts, final Object extraData ) { if (!usesProperty(anyInteracts)) { return Filter.INCLUDE; } return super.visit( anyInteracts, extraData); } @Override public Object visit( final Before before, final Object extraData ) { if (!usesProperty(before)) { return Filter.INCLUDE; } return super.visit( before, extraData); } @Override public Object visit( final Begins begins, final Object extraData ) { if (!usesProperty(begins)) { return Filter.INCLUDE; } return super.visit( begins, extraData); } @Override public Object visit( final BegunBy begunBy, final Object extraData ) { if (!usesProperty(begunBy)) { return Filter.INCLUDE; } return super.visit( begunBy, extraData); } @Override public Object visit( final During during, final Object extraData ) { if (!usesProperty(during)) { return Filter.INCLUDE; } return super.visit( during, extraData); } @Override public Object visit( final EndedBy endedBy, final Object extraData ) { if (!usesProperty(endedBy)) { return Filter.INCLUDE; } return super.visit( endedBy, extraData); } @Override public Object visit( final Ends ends, final Object extraData ) { if (!usesProperty(ends)) { return Filter.INCLUDE; } return super.visit( ends, extraData); } @Override public Object visit( final Meets meets, final Object extraData ) { if (!usesProperty(meets)) { return Filter.INCLUDE; } return super.visit( meets, extraData); } @Override public Object visit( final MetBy metBy, final Object extraData ) { if (!usesProperty(metBy)) { return Filter.INCLUDE; } return super.visit( metBy, extraData); } @Override public Object visit( final OverlappedBy overlappedBy, final Object extraData ) { if (!usesProperty(overlappedBy)) { return Filter.INCLUDE; } return super.visit( overlappedBy, extraData); } @Override public Object visit( final TContains contains, final Object extraData ) { if (!usesProperty(contains)) { return Filter.INCLUDE; } return super.visit( contains, extraData); } @Override public Object visit( final TEquals equals, final Object extraData ) { if (!usesProperty(equals)) { return Filter.INCLUDE; } return super.visit( equals, extraData); } @Override public Object visit( final TOverlaps contains, final Object extraData ) { if (!usesProperty(contains)) { return Filter.INCLUDE; } return super.visit( contains, extraData); } private boolean usesProperty( final Filter filter ) { final String[] attributes = DataUtilities.attributeNames( filter, type); // rely on best scene aggregation at a higher level if the filter is // using attributes not contained in the scene for (final String attr : attributes) { if (!ArrayUtils.contains( validPropertyNames, attr)) { return false; } } return true; } }