|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.geotools.filter.visitor.CapabilitiesFilterSplitter
public class CapabilitiesFilterSplitter
Determines what queries can be processed server side and which can be processed client side.
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
org.geotools.filter.Capabilities
by Gabriel RoldanConstructor Summary | |
---|---|
CapabilitiesFilterSplitter(Capabilities fcs,
org.opengis.feature.type.FeatureType parent,
ClientTransactionAccessor transactionAccessor)
Create a new instance. |
Method Summary | |
---|---|
org.opengis.filter.Filter |
getFilterPost()
Gets the filter that cannot be sent to the server and must be post-processed on the client by geotools. |
org.opengis.filter.Filter |
getFilterPre()
Gets the filter that can be sent to the server for pre-processing. |
java.lang.Object |
visit(org.opengis.filter.expression.Add filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.And filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.spatial.BBOX filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.spatial.Beyond filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.spatial.Contains filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.spatial.Crosses filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.spatial.Disjoint filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.expression.Divide filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.spatial.DWithin filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.spatial.Equals filter,
java.lang.Object notUsed)
|
void |
visit(org.opengis.filter.ExcludeFilter filter)
|
java.lang.Object |
visit(org.opengis.filter.ExcludeFilter filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.expression.Function expression,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.Id filter,
java.lang.Object notUsed)
|
void |
visit(org.opengis.filter.IncludeFilter filter)
|
java.lang.Object |
visit(org.opengis.filter.IncludeFilter filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.spatial.Intersects filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.expression.Literal expression,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.expression.Multiply filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.expression.NilExpression nilExpression,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.Not filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.Or filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.spatial.Overlaps filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.PropertyIsBetween filter,
java.lang.Object extradata)
|
java.lang.Object |
visit(org.opengis.filter.PropertyIsEqualTo filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.PropertyIsGreaterThan filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.PropertyIsGreaterThanOrEqualTo filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.PropertyIsLessThan filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.PropertyIsLessThanOrEqualTo filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.PropertyIsLike filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.PropertyIsNotEqualTo filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.PropertyIsNull filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.expression.PropertyName expression,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.expression.Subtract filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.spatial.Touches filter,
java.lang.Object notUsed)
|
java.lang.Object |
visit(org.opengis.filter.spatial.Within filter,
java.lang.Object notUsed)
|
java.lang.Object |
visitNullFilter(java.lang.Object notUsed)
|
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Constructor Detail |
---|
public CapabilitiesFilterSplitter(Capabilities fcs, org.opengis.feature.type.FeatureType 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.Method Detail |
---|
public org.opengis.filter.Filter getFilterPost()
public org.opengis.filter.Filter getFilterPre()
public void visit(org.opengis.filter.IncludeFilter filter)
filter
- the Filter
to visitFilterVisitor.visit(IncludeFilter, Object)
public void visit(org.opengis.filter.ExcludeFilter filter)
filter
- the Filter
to visitFilterVisitor.visit(ExcludeFilter, Object)
public java.lang.Object visit(org.opengis.filter.PropertyIsBetween filter, java.lang.Object extradata)
visit
in interface org.opengis.filter.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 java.lang.Object visit(org.opengis.filter.PropertyIsEqualTo filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.PropertyIsGreaterThan filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.PropertyIsGreaterThanOrEqualTo filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.PropertyIsLessThan filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.PropertyIsLessThanOrEqualTo filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.PropertyIsNotEqualTo filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.spatial.BBOX filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.spatial.Beyond filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.spatial.Contains filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.spatial.Crosses filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.spatial.Disjoint filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.spatial.DWithin filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.spatial.Equals filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.spatial.Intersects filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.spatial.Overlaps filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.spatial.Touches filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.spatial.Within filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.PropertyIsLike filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.And filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.Not filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.Or filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visitNullFilter(java.lang.Object notUsed)
visitNullFilter
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.IncludeFilter filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.ExcludeFilter filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.PropertyIsNull filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.Id filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.FilterVisitor
public java.lang.Object visit(org.opengis.filter.expression.PropertyName expression, java.lang.Object notUsed)
visit
in interface org.opengis.filter.expression.ExpressionVisitor
public java.lang.Object visit(org.opengis.filter.expression.Literal expression, java.lang.Object notUsed)
visit
in interface org.opengis.filter.expression.ExpressionVisitor
public java.lang.Object visit(org.opengis.filter.expression.Add filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.expression.ExpressionVisitor
public java.lang.Object visit(org.opengis.filter.expression.Divide filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.expression.ExpressionVisitor
public java.lang.Object visit(org.opengis.filter.expression.Multiply filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.expression.ExpressionVisitor
public java.lang.Object visit(org.opengis.filter.expression.Subtract filter, java.lang.Object notUsed)
visit
in interface org.opengis.filter.expression.ExpressionVisitor
public java.lang.Object visit(org.opengis.filter.expression.Function expression, java.lang.Object notUsed)
visit
in interface org.opengis.filter.expression.ExpressionVisitor
FilterVisitor.visit(org.geotools.filter.FunctionExpression)
public java.lang.Object visit(org.opengis.filter.expression.NilExpression nilExpression, java.lang.Object notUsed)
visit
in interface org.opengis.filter.expression.ExpressionVisitor
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |