org.geotools.data.jdbc
Class FilterToSQL

Object
  extended by FilterToSQL
All Implemented Interfaces:
ExpressionVisitor, FilterVisitor
Direct Known Subclasses:
FilterToSQLSDE, SQLEncoderDB2

public class FilterToSQL
extends Object
implements FilterVisitor, ExpressionVisitor

Encodes a filter into a SQL WHERE statement. It should hopefully be generic enough that any SQL database will work with it. This generic SQL encoder should eventually be able to encode all filters except Geometry Filters. This is because the OGC's SFS for SQL document specifies two ways of doing SQL databases, one with native geometry types and one without. To implement an encoder for one of the two types simply subclass off of this encoder and put in the proper GeometryFilter visit method. Then add the filter types supported to the capabilities by overriding the {createFilterCapabilities() method. This version was ported from the original to support org.opengis.filter type Filters.

Author:
originally by Chris Holmes, TOPP, ported by Saul Farber, MassGIS
TODO:
REVISIT: need to figure out exceptions, we're currently eating io errors, which is bad. Probably need a generic visitor exception.

Field Summary
protected  FilterCapabilities capabilities
          The filter types that this class can encode
protected  boolean encodingFunction
          flag which indicates that the encoder is currently encoding a function
protected  SimpleFeatureType featureType
          the schmema the encoder will be used to be encode sql for
protected static String IO_ERROR
          error message for exceptions
protected  FIDMapper mapper
          the fid mapper used to encode the fid filters
protected  Writer out
          where to write the constructed string from visiting the filters.
 
Constructor Summary
FilterToSQL()
          Default constructor
FilterToSQL(Writer out)
           
 
Method Summary
protected  FilterCapabilities createFilterCapabilities()
          Sets the capabilities of this filter.
 void encode(Expression expression)
          Performs the encoding, sends the encoded sql to the writer passed in.
 void encode(Filter filter)
          Performs the encoding, sends the encoded sql to the writer passed in.
 String encodeToString(Expression expression)
          purely a convenience method.
 String encodeToString(Filter filter)
          purely a convenience method.
 String escapeName(String name)
          Surrounds a name with the SQL escape character.
protected  Object evaluateLiteral(Literal expression, Class target)
           
 FilterCapabilities getCapabilities()
          Describes the capabilities of this encoder.
 FIDMapper getFIDMapper()
           
 void setCapabilities(FilterCapabilities capabilities)
          Sets the capabilities for the encoder.
 void setFeatureType(SimpleFeatureType featureType)
          Sets the featuretype the encoder is encoding sql for.
 void setFIDMapper(FIDMapper mapper)
          Sets the FIDMapper that will be used in subsequente visit calls.
 void setSqlNameEscape(String escape)
          Sets the SQL name escape string.
 void setWriter(Writer out)
          Sets the writer the encoder will write to.
 Object visit(Add expression, Object extraData)
           
 Object visit(And filter, Object extraData)
          Write the SQL for an And filter
 Object visit(BBOX filter, Object extraData)
           
 Object visit(Beyond filter, Object extraData)
           
protected  Object visit(BinaryExpression expression, String operator, Object extraData)
          Writes the SQL for the Math Expression.
protected  Object visit(BinaryLogicOperator filter, Object extraData)
          Common implementation for BinaryLogicOperator filters.
 Object visit(Contains filter, Object extraData)
           
 Object visit(Crosses filter, Object extraData)
           
 Object visit(Disjoint filter, Object extraData)
           
 Object visit(Divide expression, Object extraData)
           
 Object visit(DWithin filter, Object extraData)
           
 Object visit(Equals filter, Object extraData)
           
 Object visit(ExcludeFilter filter, Object extraData)
           
 Object visit(Function function, Object extraData)
          Writes sql for a function expression.
 Object visit(Id filter, Object extraData)
          Encodes an Id filter
 Object visit(IncludeFilter filter, Object extraData)
           
 Object visit(Intersects filter, Object extraData)
           
 Object visit(Literal expression, Object context)
          Export the contents of a Literal Expresion
 Object visit(Multiply expression, Object extraData)
           
 Object visit(NilExpression expression, Object extraData)
           
 Object visit(Not filter, Object extraData)
          Write the SQL for a Not filter
 Object visit(Or filter, Object extraData)
          Write the SQL for an Or filter
 Object visit(Overlaps filter, Object extraData)
           
 Object visit(PropertyIsBetween filter, Object extraData)
          Writes the SQL for the PropertyIsBetween Filter.
 Object visit(PropertyIsEqualTo filter, Object extraData)
          Write the SQL for this kind of filter
 Object visit(PropertyIsGreaterThan filter, Object extraData)
          Write the SQL for this kind of filter
 Object visit(PropertyIsGreaterThanOrEqualTo filter, Object extraData)
          Write the SQL for this kind of filter
 Object visit(PropertyIsLessThan filter, Object extraData)
          Write the SQL for this kind of filter
 Object visit(PropertyIsLessThanOrEqualTo filter, Object extraData)
          Write the SQL for this kind of filter
 Object visit(PropertyIsLike filter, Object extraData)
          Writes the SQL for the Like Filter.
 Object visit(PropertyIsNotEqualTo filter, Object extraData)
          Write the SQL for this kind of filter
 Object visit(PropertyIsNull filter, Object extraData)
          Writes the SQL for the Null Filter.
 Object visit(PropertyName expression, Object extraData)
          Writes the SQL for the attribute Expression.
 Object visit(Subtract expression, Object extraData)
           
 Object visit(Touches filter, Object extraData)
           
 Object visit(Within filter, Object extraData)
           
protected  void visitBinaryComparisonOperator(BinaryComparisonOperator filter, Object extraData)
          Common implementation for BinaryComparisonOperator filters.
protected  Object visitBinarySpatialOperator(BinarySpatialOperator filter, Object extraData)
           
protected  void visitLiteralGeometry(Literal expression)
          Subclasses must implement this method in order to encode geometry filters according to the specific database implementation
 Object visitNullFilter(Object extraData)
          Encodes a null filter value.
protected  void writeLiteral(Object literal)
          Writes out a non null, non geometry literal.
 
Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

IO_ERROR

protected static final String IO_ERROR
error message for exceptions

See Also:
Constant Field Values

capabilities

protected FilterCapabilities capabilities
The filter types that this class can encode


out

protected Writer out
where to write the constructed string from visiting the filters.


mapper

protected FIDMapper mapper
the fid mapper used to encode the fid filters


featureType

protected SimpleFeatureType featureType
the schmema the encoder will be used to be encode sql for


encodingFunction

protected boolean encodingFunction
flag which indicates that the encoder is currently encoding a function

Constructor Detail

FilterToSQL

public FilterToSQL()
Default constructor


FilterToSQL

public FilterToSQL(Writer out)
Method Detail

setWriter

public void setWriter(Writer out)
Sets the writer the encoder will write to.


encode

public void encode(Filter filter)
            throws FilterToSQLException
Performs the encoding, sends the encoded sql to the writer passed in.

Parameters:
filter - the Filter to be encoded.
Throws:
OpenGISFilterToOpenGISFilterToSQLEncoderException - If filter type not supported, or if there were io problems.
FilterToSQLException

encodeToString

public String encodeToString(Filter filter)
                      throws FilterToSQLException
purely a convenience method. Equivalent to: StringWriter out = new StringWriter(); new FilterToSQL(out).encode(filter); out.getBuffer().toString();

Parameters:
filter -
Returns:
a string representing the filter encoded to SQL.
Throws:
FilterToSQLException

encode

public void encode(Expression expression)
            throws FilterToSQLException
Performs the encoding, sends the encoded sql to the writer passed in.

Parameters:
filter - the Filter to be encoded.
Throws:
OpenGISFilterToOpenGISFilterToSQLEncoderException - If filter type not supported, or if there were io problems.
FilterToSQLException

encodeToString

public String encodeToString(Expression expression)
                      throws FilterToSQLException
purely a convenience method. Equivalent to: StringWriter out = new StringWriter(); new FilterToSQL(out).encode(filter); out.getBuffer().toString();

Parameters:
filter -
Returns:
a string representing the filter encoded to SQL.
Throws:
FilterToSQLException

setFeatureType

public void setFeatureType(SimpleFeatureType featureType)
Sets the featuretype the encoder is encoding sql for.

This is used for context for attribute expressions when encoding to sql.

Parameters:
featureType -

setFIDMapper

public void setFIDMapper(FIDMapper mapper)
Sets the FIDMapper that will be used in subsequente visit calls. There must be a FIDMapper in order to invoke the FIDFilter encoder.

Parameters:
mapper -

getFIDMapper

public FIDMapper getFIDMapper()

createFilterCapabilities

protected FilterCapabilities createFilterCapabilities()
Sets the capabilities of this filter.

Returns:
FilterCapabilities for this Filter

getCapabilities

public final FilterCapabilities getCapabilities()
Describes the capabilities of this encoder.

Performs lazy creation of capabilities.

If you're subclassing this class, override createFilterCapabilities to declare which filtercapabilities you support. Don't use this method.

Returns:
The capabilities supported by this encoder.

setCapabilities

public void setCapabilities(FilterCapabilities capabilities)
Sets the capabilities for the encoder.


visit

public Object visit(ExcludeFilter filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor
Parameters:
the - filter to be visited
See Also:
FilterVisitor#visit(ExcludeFilter, Object)} Writes the SQL for the IncludeFilter by writing "FALSE".

visit

public Object visit(IncludeFilter filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor
Parameters:
the - filter to be visited
See Also:
FilterVisitor#visit(IncludeFilter, Object)} Writes the SQL for the IncludeFilter by writing "TRUE".

visit

public Object visit(PropertyIsBetween filter,
                    Object extraData)
             throws RuntimeException
Writes the SQL for the PropertyIsBetween Filter.

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the Filter to be visited.
Throws:
RuntimeException - for io exception with writer

visit

public Object visit(PropertyIsLike filter,
                    Object extraData)
Writes the SQL for the Like Filter. Assumes the current java implemented wildcards for the Like Filter: . for multi and .? for single. And replaces them with the SQL % and _, respectively.

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the Like Filter to be visited.
TODO:
REVISIT: Need to think through the escape char, so it works right when Java uses one, and escapes correctly with an '_'.

visit

public Object visit(And filter,
                    Object extraData)
Write the SQL for an And filter

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the filter to visit
extraData - extra data (unused by this method)

visit

public Object visit(Not filter,
                    Object extraData)
Write the SQL for a Not filter

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the filter to visit
extraData - extra data (unused by this method)

visit

public Object visit(Or filter,
                    Object extraData)
Write the SQL for an Or filter

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the filter to visit
extraData - extra data (unused by this method)

visit

protected Object visit(BinaryLogicOperator filter,
                       Object extraData)
Common implementation for BinaryLogicOperator filters. This way they're all handled centrally.

Parameters:
filter - the logic statement to be turned into SQL.
extraData - extra filter data. Not modified directly by this method.

visit

public Object visit(PropertyIsEqualTo filter,
                    Object extraData)
Write the SQL for this kind of filter

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the filter to visit
extraData - extra data (unused by this method)

visit

public Object visit(PropertyIsGreaterThanOrEqualTo filter,
                    Object extraData)
Write the SQL for this kind of filter

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the filter to visit
extraData - extra data (unused by this method)

visit

public Object visit(PropertyIsGreaterThan filter,
                    Object extraData)
Write the SQL for this kind of filter

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the filter to visit
extraData - extra data (unused by this method)

visit

public Object visit(PropertyIsLessThan filter,
                    Object extraData)
Write the SQL for this kind of filter

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the filter to visit
extraData - extra data (unused by this method)

visit

public Object visit(PropertyIsLessThanOrEqualTo filter,
                    Object extraData)
Write the SQL for this kind of filter

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the filter to visit
extraData - extra data (unused by this method)

visit

public Object visit(PropertyIsNotEqualTo filter,
                    Object extraData)
Write the SQL for this kind of filter

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the filter to visit
extraData - extra data (unused by this method)

visitBinaryComparisonOperator

protected void visitBinaryComparisonOperator(BinaryComparisonOperator filter,
                                             Object extraData)
                                      throws RuntimeException
Common implementation for BinaryComparisonOperator filters. This way they're all handled centrally. DJB: note, postgis overwrites this implementation because of the way null is handled. This is for filters and filters are handled. They will come here with "property = null". NOTE: SELECT * FROM WHERE isnull; -- postgresql SELECT * FROM
WHERE isnull(); -- oracle???

Parameters:
filter - the comparison to be turned into SQL.
Throws:
RuntimeException - for io exception with writer

visit

public Object visit(PropertyIsNull filter,
                    Object extraData)
             throws RuntimeException
Writes the SQL for the Null Filter.

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the null filter to be written to SQL.
Throws:
RuntimeException - for io exception with writer

visit

public Object visit(Id filter,
                    Object extraData)
Encodes an Id filter

Specified by:
visit in interface FilterVisitor
Parameters:
filter - the
Throws:
RuntimeException - If there's a problem writing output

visit

public Object visit(BBOX filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor

visit

public Object visit(Beyond filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor

visit

public Object visit(Contains filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor

visit

public Object visit(Crosses filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor

visit

public Object visit(Disjoint filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor

visit

public Object visit(DWithin filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor

visit

public Object visit(Equals filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor

visit

public Object visit(Intersects filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor

visit

public Object visit(Overlaps filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor

visit

public Object visit(Touches filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor

visit

public Object visit(Within filter,
                    Object extraData)
Specified by:
visit in interface FilterVisitor

visitBinarySpatialOperator

protected Object visitBinarySpatialOperator(BinarySpatialOperator filter,
                                            Object extraData)
See Also:
FilterVisitor#visit()}

visitNullFilter

public Object visitNullFilter(Object extraData)
Encodes a null filter value. The current implementation does exactly nothing.

Specified by:
visitNullFilter in interface FilterVisitor
Parameters:
extraData - extra data to be used to evaluate the filter
Returns:
the untouched extraData parameter

visit

public Object visit(PropertyName expression,
                    Object extraData)
             throws RuntimeException
Writes the SQL for the attribute Expression.

Specified by:
visit in interface ExpressionVisitor
Parameters:
expression - the attribute to turn to SQL.
Throws:
RuntimeException - for io exception with writer

visit

public Object visit(Literal expression,
                    Object context)
             throws RuntimeException
Export the contents of a Literal Expresion

Specified by:
visit in interface ExpressionVisitor
Parameters:
expression - the Literal to export
Throws:
RuntimeException - for io exception with writer

evaluateLiteral

protected Object evaluateLiteral(Literal expression,
                                 Class target)

writeLiteral

protected void writeLiteral(Object literal)
                     throws IOException
Writes out a non null, non geometry literal. The base class properly handles null, numeric and booleans (true|false), and turns everything else into a string. Subclasses are expected to override this shall they need a different treatment (e.g. for dates)

Parameters:
literal -
Throws:
IOException

visitLiteralGeometry

protected void visitLiteralGeometry(Literal expression)
                             throws IOException
Subclasses must implement this method in order to encode geometry filters according to the specific database implementation

Parameters:
expression -
Throws:
IOException - DOCUMENT ME!
RuntimeException - DOCUMENT ME!

visit

public Object visit(Add expression,
                    Object extraData)
Specified by:
visit in interface ExpressionVisitor

visit

public Object visit(Divide expression,
                    Object extraData)
Specified by:
visit in interface ExpressionVisitor

visit

public Object visit(Multiply expression,
                    Object extraData)
Specified by:
visit in interface ExpressionVisitor

visit

public Object visit(Subtract expression,
                    Object extraData)
Specified by:
visit in interface ExpressionVisitor

visit

protected Object visit(BinaryExpression expression,
                       String operator,
                       Object extraData)
                throws RuntimeException
Writes the SQL for the Math Expression.

Parameters:
expression - the Math phrase to be written.
operator - The operator of the expression.
Throws:
RuntimeException - for io problems

visit

public Object visit(Function function,
                    Object extraData)
             throws RuntimeException
Writes sql for a function expression.

Specified by:
visit in interface ExpressionVisitor
Parameters:
expression - a function expression
Throws:
RuntimeException - If an IO error occurs.

visit

public Object visit(NilExpression expression,
                    Object extraData)
Specified by:
visit in interface ExpressionVisitor

setSqlNameEscape

public void setSqlNameEscape(String escape)
Sets the SQL name escape string.

The value of this string is prefixed and appended to table schema names, table names and column names in an SQL statement to support mixed-case and non-English names. Without this, the DBMS may assume a mixed-case name in the query should be treated as upper-case and an SQLCODE of -204 or 206 may result if the name is not found.

Typically this is the double-quote character, ", but may not be for all databases.

For example, consider the following query:

SELECT Geom FROM Spear.ArchSites May be interpreted by the database as: SELECT GEOM FROM SPEAR.ARCHSITES If the column and table names were actually created using mixed-case, the query needs to be specified as: SELECT "Geom" from "Spear"."ArchSites"

Parameters:
escape - the character to be used to escape database names

escapeName

public String escapeName(String name)
Surrounds a name with the SQL escape character.

Parameters:
name -
Returns:
DOCUMENT ME!


Copyright © 1996-2009 Geotools. All Rights Reserved.