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
FilterCapabilitiesModifier 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
FilterCapabilities
protected Stack<Object> preStack
FilterCapabilities
protected 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 FilterVisitor
filter
- 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 FilterVisitor
public Object visit(PropertyIsGreaterThan filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(PropertyIsGreaterThanOrEqualTo filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(PropertyIsLessThan filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(PropertyIsLessThanOrEqualTo filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(PropertyIsNotEqualTo filter, Object notUsed)
visit
in interface FilterVisitor
protected void visitBinaryComparisonOperator(BinaryComparisonOperator filter)
public Object visit(BBOX filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Beyond filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Contains filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Crosses filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Disjoint filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(DWithin filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Equals filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Intersects filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Overlaps filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Touches filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Within filter, Object notUsed)
visit
in interface FilterVisitor
protected void visitBinarySpatialOperator(BinarySpatialOperator filter)
public Object visit(PropertyIsLike filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(And filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Not filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Or filter, Object notUsed)
visit
in interface FilterVisitor
public Object visitNullFilter(Object notUsed)
FilterVisitor
null
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 FilterVisitor
notUsed
- Value object provided to visitorpublic Object visit(IncludeFilter filter, Object notUsed)
FilterVisitor
Filter.INCLUDE
(often used during data structure transformations).visit
in interface FilterVisitor
filter
- Filter.INCLUDE
.notUsed
- Value object provided to visitorpublic Object visit(ExcludeFilter filter, Object notUsed)
FilterVisitor
Filter.EXCLUDE
(often used during data structure transformations).visit
in interface FilterVisitor
filter
- Filter.EXCLUDE
.notUsed
- Value object provided to visitorpublic Object visit(PropertyIsNil filter, Object extraData)
visit
in interface FilterVisitor
public Object visit(PropertyIsNull filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(Id filter, Object notUsed)
visit
in interface FilterVisitor
public Object visit(PropertyName expression, Object notUsed)
visit
in interface ExpressionVisitor
public Object visit(Literal expression, Object notUsed)
visit
in interface ExpressionVisitor
public Object visit(Add filter, Object notUsed)
visit
in interface ExpressionVisitor
public Object visit(Divide filter, Object notUsed)
visit
in interface ExpressionVisitor
public Object visit(Multiply filter, Object notUsed)
visit
in interface ExpressionVisitor
public Object visit(Subtract filter, Object notUsed)
visit
in interface ExpressionVisitor
protected void visitMathExpression(BinaryExpression expression)
public Object visit(Function expression, Object notUsed)
visit
in interface ExpressionVisitor
public Object visit(NilExpression nilExpression, Object notUsed)
ExpressionVisitor
null
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 ExpressionVisitor
public Object visit(After after, Object extraData)
visit
in interface FilterVisitor
public Object visit(AnyInteracts anyInteracts, Object extraData)
visit
in interface FilterVisitor
public Object visit(Before before, Object extraData)
visit
in interface FilterVisitor
public Object visit(Begins begins, Object extraData)
visit
in interface FilterVisitor
public Object visit(BegunBy begunBy, Object extraData)
visit
in interface FilterVisitor
public Object visit(During during, Object extraData)
visit
in interface FilterVisitor
public Object visit(EndedBy endedBy, Object extraData)
visit
in interface FilterVisitor
public Object visit(Ends ends, Object extraData)
visit
in interface FilterVisitor
public Object visit(Meets meets, Object extraData)
visit
in interface FilterVisitor
public Object visit(MetBy metBy, Object extraData)
visit
in interface FilterVisitor
public Object visit(OverlappedBy overlappedBy, Object extraData)
visit
in interface FilterVisitor
public Object visit(TContains contains, Object extraData)
visit
in interface FilterVisitor
public Object visit(TEquals equals, Object extraData)
visit
in interface FilterVisitor
public Object visit(TOverlaps contains, Object extraData)
visit
in interface FilterVisitor
protected Object visit(BinaryTemporalOperator filter, Object data)
public Object visit(NativeFilter nativeFilter, Object extraData)
visit
in interface FilterVisitor
protected boolean supports(Object value)
Copyright © 1996–2023 Geotools. All rights reserved.