Hello,
I am using filters through CQL.
I am trying to execute this extract of code which test that encoding and
decoding works with CQL and dates.
The main problem is that BEFORE and DURING temporal predicates are converted in
simple property value comparison (lessthan or greaterThan).
Whereas, with the AFTER temporal predicate it works fine because it is never
converted but kept as temporal.
How can we fix that issue?
Thank you very much for your help.
Here is a description of my tests:
//test 1 with AFTER temporal predicate
Filter filter2Expected = CQL.toFilter("attr AFTER 2006-12-31T01:30:00Z");
String ecqlEncoding2 = CQL.toCQL(filter2Expected);
Filter ecqlDecoding2 = CQL.toFilter(ecqlEncoding2);
//test 2 with BEFORE temporal predicate
Filter filter3Expected = CQL.toFilter("attr BEFORE 2006-12-31T01:30:00Z");
String ecqlEncoding3 = CQL.toCQL(filter3Expected);
Filter ecqlDecoding3 = CQL.toFilter(ecqlEncoding3);
//test 3 with DURING temporal predicate
Filter filter4Expected = CQL.toFilter("dateAttr DURING
2006-10-10T01:30:00Z/2010-12-31T01:30:00Z");
String ecqlEncoding4 = CQL.toCQL(filter4Expected);
Filter ecqlDecoding4 = CQL.toFilter(ecqlEncoding4);
Test1 works fine:
filter2Expected.toString() == "[ attr > Sun Dec 31 01:30:00 CET 2006 ]"
ecqlEncoding2 == "attr AFTER 2006-12-31T01:30:00Z"
ecqlDecoding2.toString() == "[ attr > Sun Dec 31 01:30:00 CET 2006 ]"
Test2 does not work because the line " CQL.toFilter(ecqlEncoding3);" throws an
exception:
org.geotools.filter.text.cql2.CQLException: Encountered "<
2006-12-31T01:30:00Z" at line 1, column 6.
In debug, what I saw is that the CQL.toCQL does not return a result similar to
the AFTER predicate: ecqlEncoding3 == "attr < 2006-12-31T01:30:00Z"
Or with in the previous test using AFTER predicate : ecqlEncoding2 == "attr
AFTER 2006-12-31T01:30:00Z"
It sounds like the toCQL function does not consider the BEFORE predicate as a
temporal one but as a simple lessThan property predicate.
Tes3 does not work for 2 reasons:
--> the first one is the same as in test2 : temporal predicate is transformed
in simple lessThan or greaterThan property predicates whereas it should not do
that (like with AFTER predicate).
--> the second one is an issue that I localized in the code of FilterToCQL.
PropertyIsLessThanOrEqualTo. This method (and other similars) expects that the
name of the property is always in expression1 of the filter. But it is not
always the case. Typically in case of DURING predicate, a classcast exception
is raised :
java.lang.ClassCastException: org.geotools.filter.LiteralExpressionImpl cannot
be cast to org.opengis.filter.expression.PropertyName.
For this second problem, a workarounf could be to test expression1.class , like
this:
public Object visit(PropertyIsLessThanOrEqualTo filter, Object extraData) {
LOGGER.finer("exporting PropertyIsLessThanOrEqualTo");
StringBuffer output = asStringBuffer(extraData);
Expression expr1 = filter.getExpression1();
Expression expr2 = filter.getExpression2();
if(PropertyName.class.isInstance(expr1)){
PropertyName propertyName = (PropertyName) expr1;
propertyName.accept(this, output);
output.append(" <= ");
expr2.accept(this, output);
}
else{
PropertyName propertyName = (PropertyName) expr2;
propertyName.accept(this, output);
output.append(" >= ");
expr1.accept(this, output);
}
return output;
}
------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Geotools-gt2-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users