public class PostPreProcessFilterSplittingVisitor extends Object implements FilterVisitor, ExpressionVisitor
IMPLEMENTATION NOTE: This class is implemented as a stack processor. If you're curious how it works, compare it with the old SQLUnpacker class, which did the same thing using recursion in a more straightforward way.
Here's a non-implementors best-guess at the algorithm: Starting at the top of the filter, split each filter into its constituent parts. If the given FilterCapabilities support the given operator, then keep checking downwards.
The key is in knowing whether or not something "down the tree" from you wound up being supported or not. This is where the stacks come in. Right before handing off to accept() the sub- filters, we count how many things are currently on the "can be proccessed by the underlying datastore" stack (the preStack) and we count how many things are currently on the "need to be post- processed" stack.
After the accept() call returns, we look again at the preStack.size() and postStack.size(). If the postStack has grown, that means that there was stuff down in the accept()-ed filter that wasn't supportable. Usually this means that our filter isn't supportable, but not always.
In some cases a sub-filter being unsupported isn't necessarily bad, as we can 'unpack' OR statements into AND statements (DeMorgans rule/modus poens) and still see if we can handle the other side of the OR. Same with NOT and certain kinds of AND statements.
In addition this class supports the case where we're doing an split in the middle of a
client-side transaction. I.e. imagine doing a
CapabilitiesFilterSplitter instead for geoapi
FilterCapabilities| Modifier and Type | Field and Description |
|---|---|
protected FilterCapabilities |
fcs
The given filterCapabilities that we're splitting on.
|
protected Filter |
original |
protected Stack<Object> |
postStack
The stack holding the bits of the filter that are not processable by something with the given
FilterCapabilities |
protected Stack<Object> |
preStack
The stack holding the bits of the filter that are processable by something with the
given
FilterCapabilities |
| Constructor and Description |
|---|
PostPreProcessFilterSplittingVisitor(FilterCapabilities fcs,
SimpleFeatureType parent,
ClientTransactionAccessor transactionAccessor)
Create a new instance.
|
| Modifier and Type | Method and Description |
|---|---|
Filter |
getFilterPost()
Gets the filter that cannot be sent to the server and must be post-processed on the client by
geotools.
|
Filter |
getFilterPre()
Gets the filter that can be sent to the server for pre-processing.
|
protected boolean |
supports(Object value) |
Object |
visit(Add filter,
Object notUsed) |
Object |
visit(After after,
Object extraData) |
Object |
visit(And filter,
Object notUsed) |
Object |
visit(AnyInteracts anyInteracts,
Object extraData) |
Object |
visit(BBOX filter,
Object notUsed) |
Object |
visit(Before before,
Object extraData) |
Object |
visit(Begins begins,
Object extraData) |
Object |
visit(BegunBy begunBy,
Object extraData) |
Object |
visit(Beyond filter,
Object notUsed) |
protected Object |
visit(BinaryTemporalOperator filter,
Object data) |
Object |
visit(Contains filter,
Object notUsed) |
Object |
visit(Crosses filter,
Object notUsed) |
Object |
visit(Disjoint filter,
Object notUsed) |
Object |
visit(Divide filter,
Object notUsed) |
Object |
visit(During during,
Object extraData) |
Object |
visit(DWithin filter,
Object notUsed) |
Object |
visit(EndedBy endedBy,
Object extraData) |
Object |
visit(Ends ends,
Object extraData) |
Object |
visit(Equals filter,
Object notUsed) |
void |
visit(ExcludeFilter filter) |
Object |
visit(ExcludeFilter filter,
Object notUsed)
Visit
Filter.EXCLUDE (often used during data structure transformations). |
Object |
visit(Function expression,
Object notUsed) |
Object |
visit(Id filter,
Object notUsed) |
void |
visit(IncludeFilter filter) |
Object |
visit(IncludeFilter filter,
Object notUsed)
Visit
Filter.INCLUDE (often used during data structure transformations). |
Object |
visit(Intersects filter,
Object notUsed) |
Object |
visit(Literal expression,
Object notUsed) |
Object |
visit(Meets meets,
Object extraData) |
Object |
visit(MetBy metBy,
Object extraData) |
Object |
visit(Multiply filter,
Object notUsed) |
Object |
visit(NativeFilter nativeFilter,
Object extraData) |
Object |
visit(NilExpression nilExpression,
Object notUsed)
Used to visit a Expression.NIL, also called for
null where an expression is
expected. |
Object |
visit(Not filter,
Object notUsed) |
Object |
visit(Or filter,
Object notUsed) |
Object |
visit(OverlappedBy overlappedBy,
Object extraData) |
Object |
visit(Overlaps filter,
Object notUsed) |
Object |
visit(PropertyIsBetween filter,
Object extradata) |
Object |
visit(PropertyIsEqualTo filter,
Object notUsed) |
Object |
visit(PropertyIsGreaterThan filter,
Object notUsed) |
Object |
visit(PropertyIsGreaterThanOrEqualTo filter,
Object notUsed) |
Object |
visit(PropertyIsLessThan filter,
Object notUsed) |
Object |
visit(PropertyIsLessThanOrEqualTo filter,
Object notUsed) |
Object |
visit(PropertyIsLike filter,
Object notUsed) |
Object |
visit(PropertyIsNil filter,
Object extraData) |
Object |
visit(PropertyIsNotEqualTo filter,
Object notUsed) |
Object |
visit(PropertyIsNull filter,
Object notUsed) |
Object |
visit(PropertyName expression,
Object notUsed) |
Object |
visit(Subtract filter,
Object notUsed) |
Object |
visit(TContains contains,
Object extraData) |
Object |
visit(TEquals equals,
Object extraData) |
Object |
visit(Touches filter,
Object notUsed) |
Object |
visit(TOverlaps contains,
Object extraData) |
Object |
visit(Within filter,
Object notUsed) |
protected void |
visitBinaryComparisonOperator(BinaryComparisonOperator filter) |
protected void |
visitBinarySpatialOperator(BinarySpatialOperator filter) |
protected void |
visitMathExpression(BinaryExpression expression) |
Object |
visitNullFilter(Object notUsed)
Used to account for a
null filter value. |
protected Stack<Object> postStack
FilterCapabilitiesprotected Stack<Object> preStack
FilterCapabilitiesprotected FilterCapabilities fcs
protected Filter original
public PostPreProcessFilterSplittingVisitor(FilterCapabilities fcs, SimpleFeatureType parent, ClientTransactionAccessor transactionAccessor)
fcs - The FilterCapabilties that describes what Filters/Expressions the server can
process.parent - The FeatureType that this filter involves. Why is this needed?transactionAccessor - If the transaction is handled on the client and not the server
then different filters must be sent to the server. This class provides a generic way of
obtaining the information from the transaction.public Filter getFilterPost()
public Filter getFilterPre()
public void visit(IncludeFilter filter)
filter - the Filter to visitFilterVisitor.visit(IncludeFilter, Object)public void visit(ExcludeFilter filter)
filter - the Filter to visitFilterVisitor.visit(ExcludeFilter, Object)public Object visit(PropertyIsBetween filter, Object extradata)
visit in interface FilterVisitorfilter - the Filter to visitNOTE: This method is extra documented as an example of how all the other methods are
implemented. If you want to know how this class works read this method first!
public Object visit(PropertyIsEqualTo filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(PropertyIsGreaterThan filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(PropertyIsGreaterThanOrEqualTo filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(PropertyIsLessThan filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(PropertyIsLessThanOrEqualTo filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(PropertyIsNotEqualTo filter, Object notUsed)
visit in interface FilterVisitorprotected void visitBinaryComparisonOperator(BinaryComparisonOperator filter)
public Object visit(BBOX filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Beyond filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Contains filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Crosses filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Disjoint filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(DWithin filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Equals filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Intersects filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Overlaps filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Touches filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Within filter, Object notUsed)
visit in interface FilterVisitorprotected void visitBinarySpatialOperator(BinarySpatialOperator filter)
public Object visit(PropertyIsLike filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(And filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Not filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Or filter, Object notUsed)
visit in interface FilterVisitorpublic Object visitNullFilter(Object notUsed)
FilterVisitornull filter value.
This is particularly used during data structure transofrmations, however the use of
null is not recommended. Please make use of Filter.NONE and Filter.ALL as placeholder
objects that communicate intent.
visitNullFilter in interface FilterVisitornotUsed - Value object provided to visitorpublic Object visit(IncludeFilter filter, Object notUsed)
FilterVisitorFilter.INCLUDE (often used during data structure transformations).visit in interface FilterVisitorfilter - Filter.INCLUDE.notUsed - Value object provided to visitorpublic Object visit(ExcludeFilter filter, Object notUsed)
FilterVisitorFilter.EXCLUDE (often used during data structure transformations).visit in interface FilterVisitorfilter - Filter.EXCLUDE.notUsed - Value object provided to visitorpublic Object visit(PropertyIsNil filter, Object extraData)
visit in interface FilterVisitorpublic Object visit(PropertyIsNull filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(Id filter, Object notUsed)
visit in interface FilterVisitorpublic Object visit(PropertyName expression, Object notUsed)
visit in interface ExpressionVisitorpublic Object visit(Literal expression, Object notUsed)
visit in interface ExpressionVisitorpublic Object visit(Add filter, Object notUsed)
visit in interface ExpressionVisitorpublic Object visit(Divide filter, Object notUsed)
visit in interface ExpressionVisitorpublic Object visit(Multiply filter, Object notUsed)
visit in interface ExpressionVisitorpublic Object visit(Subtract filter, Object notUsed)
visit in interface ExpressionVisitorprotected void visitMathExpression(BinaryExpression expression)
public Object visit(Function expression, Object notUsed)
visit in interface ExpressionVisitorpublic Object visit(NilExpression nilExpression, Object notUsed)
ExpressionVisitornull where an expression is
expected.
This is particularly useful when doing data transformations, as an example when using a StyleSymbolizer Expression.NIL can be used to represent the default stroke color.
visit in interface ExpressionVisitorpublic Object visit(After after, Object extraData)
visit in interface FilterVisitorpublic Object visit(AnyInteracts anyInteracts, Object extraData)
visit in interface FilterVisitorpublic Object visit(Before before, Object extraData)
visit in interface FilterVisitorpublic Object visit(Begins begins, Object extraData)
visit in interface FilterVisitorpublic Object visit(BegunBy begunBy, Object extraData)
visit in interface FilterVisitorpublic Object visit(During during, Object extraData)
visit in interface FilterVisitorpublic Object visit(EndedBy endedBy, Object extraData)
visit in interface FilterVisitorpublic Object visit(Ends ends, Object extraData)
visit in interface FilterVisitorpublic Object visit(Meets meets, Object extraData)
visit in interface FilterVisitorpublic Object visit(MetBy metBy, Object extraData)
visit in interface FilterVisitorpublic Object visit(OverlappedBy overlappedBy, Object extraData)
visit in interface FilterVisitorpublic Object visit(TContains contains, Object extraData)
visit in interface FilterVisitorpublic Object visit(TEquals equals, Object extraData)
visit in interface FilterVisitorpublic Object visit(TOverlaps contains, Object extraData)
visit in interface FilterVisitorprotected Object visit(BinaryTemporalOperator filter, Object data)
public Object visit(NativeFilter nativeFilter, Object extraData)
visit in interface FilterVisitorprotected boolean supports(Object value)
Copyright © 1996–2021 Geotools. All rights reserved.