Andrea,
2) Actual function encoding seems only required if functions cannot be
encoded like "functionName(a1, a2, ..., aN)", that is referred to
"custom encoding":
https://github.com/geotools/geotools/blob/main/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/FilterToSqlHelper.java#L522
In PostgisFilterToSQL, visit only tries with
FilterToSqlHelper.visitFunction and, if it did NOT encode the function
in a custom manner, calls forwards to the super class
org.geotools.data.jdbc.FilterToSQL, which supports generic function
encoding:
https://github.com/geotools/geotools/blob/main/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/PostgisFilterToSQL.java#L126
Seems like the actual problem is, that my new function's class is not
registered in the PostgreSQL Store's FilterCapabilities. However, I'm
planing a private plugin-based (SPI) solution for this. How could I
modify (extend) FilterToSqlHelper.createFilterCapabilities?
Couldn't there be a more extensible way to declare a SPI provided
function "SQL encodable" for a certain Store (e.g. PostGIS)? Maybe a tag
interface "SqlEncodable" could do that job?
Cheers
Carsten
Am 02.10.2023 um 10:03 schrieb Andrea Aime:
On Mon, Oct 2, 2023 at 9:05 AM Carsten Klein <c.kl...@datagis.com> wrote:
I managed to add a simple function "add", which returns the sum of
both its Double arguments. The add function follows the GeoTools
Function tutorial: it directly implements the Function interface
and gets created by my own FunctionFactory, which is registered
via META-INF/services/org.geotools.filter.FunctionFactory.
However, only the Java implementation is actually used.
GeoTools/GeoServer makes no attempt to encode the "add" function
in SQL when using a PostgreSQL store. What am I missing?
Because you haven't modified the database code to advertise it can
encode the function, and add the code
to perform the actual encoding. E.g., in the case of PostGIS:
1) Declaration that functions are supported
https://github.com/geotools/geotools/blob/main/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/FilterToSqlHelper.java#L167
2) Actual function encoding:
https://github.com/geotools/geotools/blob/main/modules/plugin/jdbc/jdbc-postgis/src/main/java/org/geotools/data/postgis/FilterToSqlHelper.java#L522
Another question: most of the built-in functions do not implement
the Function interface directly but extend FunctionExpressionImpl
(which implements FunctionExpression). According to the docs,
these functions must be registered via
META-INF/services/org.geotools.api.filter.Function. So, I added a
"sub" function, returning a - b, which is based on the
FunctionExpression approach (which seems to be quite a bit more
comfortable and newer). Unfortunately, GeoServer/GeoTools seems
not to know the new "sub" function and throws an error when I try
to use that function through a WFS GetFeature request.
The docs are probably pointing you at the wrong registration file, the
functions are registered in "org.geotools.api.filter.expression.Function":
https://github.com/geotools/geotools/blob/main/modules/library/main/src/main/resources/META-INF/services/org.geotools.api.filter.expression.Function
If you spot issues in the docs please contribute fixes for it.
Cheers
Andrea
==
GeoServer Professional Services from the experts!
Visit http://bit.ly/gs-services-us <http://bit.ly/gs-services-us>for
more information.==Ing. Andrea Aime @geowolfTechnical Lead
GeoSolutions Groupphone: +39 0584 962313
fax: +39 0584 1660272
mob: +39 339 8844549
https://www.geosolutionsgroup.com/ <https://www.geosolutionsgroup.com/>
http://twitter.com/geosolutions_it <http://twitter.com/geosolutions_it>
-------------------------------------------------------
Con riferimento alla normativa sul trattamento dei dati personali
(Reg. UE 2016/679 - Regolamento generale sulla protezione dei dati
“GDPR”), si precisa che ogni circostanza inerente alla presente email
(il suo contenuto, gli eventuali allegati, etc.) è un dato la cui
conoscenza è riservata al/i solo/i destinatario/i indicati dallo
scrivente. Se il messaggio Le è giunto per errore, è tenuta/o a
cancellarlo, ogni altra operazione è illecita. Le sarei comunque grato
se potesse darmene notizia.This email is intended only for the person
or entity to which it is addressed and may contain information that is
privileged, confidential or otherwise protected from disclosure. We
remind that - as provided by European Regulation 2016/679 “GDPR” -
copying, dissemination or use of this e-mail or the information herein
by anyone other than the intended recipient is prohibited. If you have
received this email by mistake, please notify us immediately by
telephone or e-mail
_______________________________________________
Geoserver-devel mailing list
Geoserver-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geoserver-devel