Dear Jody,

Sorry for the late reply.

Thanks for the suggestions.

I will check the best way to add the CASEWHEN function in ECQL and delegate it to the SQL engine.

Erwan


Le 22/09/2020 à 00:34, Jody Garnett a écrit :
Erwan:

If you were interested in writing a caseWhen function you could do so, and then map it to the CASE WHEN syntax during SQL generation. We do need the pure java function as a fallback so that the resulting expressions work with all manner of datastores. We have functions such as categorization which may be a good starting point.

Although it may not help your readability the function implementations delegate to the filter implementation.

FilterFunction_greaterEqualThan implements greaterEqualThan function using:

   return Boolean.valueOf(StaticGeometry.greaterEqualThan(arg0, arg1));

StaticGeometry:

    public static boolean greaterThan(Object o1, Object o2) {
        return getFilterFactory2().greater(ff.literal(o1), ff.literal(o2)).evaluate(null);
    }


We do maintain an ECQL parser that extends the CQL standard. If you wished to do the work in geotools you could look at allowing ECQL to know about this relationship and parse ">" into a greaterEqualThan function.
--
Jody Garnett


On Mon, 21 Sep 2020 at 03:54, Erwan Bocher <erwan.boc...@univ-ubs.fr <mailto:erwan.boc...@univ-ubs.fr>> wrote:

    Thanks Andrea,



    Le 21/09/2020 à 12:18, Andrea Aime a écrit :
    On Mon, Sep 21, 2020 at 11:08 AM Erwan Bocher
    <erwan.boc...@univ-ubs.fr <mailto:erwan.boc...@univ-ubs.fr>> wrote:

        I'd like to apply more complex expressions as the Case When
        above. It
        seems there is a function  closed to the SQL Case When called
        if_then_else.

        So I try :

        Expression expression =
        ECQL.toExpression("if_then_else(area(THE_GEOM)>10,5, 1)");

        definitions.add(new Definition("EXP", expression));

        SimpleFeatureSource transformed =
        TransformFactory.transform((SimpleFeatureSource) fs,
        "OUTPUT_TABLE_TEST_F", definitions);

        Unfortunately, it returns the following exception

        Exception in thread "main"
        org.geotools.filter.text.cql2.CQLException:
        Encountered ">" at line 1, column 28.

        Is there a way to execute nested expression with Geotools
        ECQL parser ?


    It is, but you're mixing filters and expressions in the wrong
    way. Filters use expressions, but
    they are not expressions. So something like "area(THE_GEOM)>10"
    is a filter, it cannot
    be nested inside an expression, only inside another filter.

    There are filter functions that try to work around this
    limitation, so you could write this instead:

    if_then_else(greater(area(THE_GEOM), 10),5, 1)

    Thanks Andrea,

    if_then_else(greater(area(THE_GEOM), 10),5, 1) is a good way but
    I'd like to write in plain text form as SQL does.


    I'd love to see an improvement in GeoTools allowing to treat a
    Filter like an Expression that returns
    a boolean but... the change would not be trivial, and rife with
    repercussions (would allow building
    filters/expressions that are not valid anymore, not in CQL, nor
    in Filter Encoding).

    I understand the standard compliant pb ;-) There is a need for an
    abstract and extensible language for expressions.

    We will have to think about something else and maybe implement our
    own parser expression.

    A temporary solution would be to parse the expression with a lib
    like JSQLParser (https://github.com/JSQLParser/JSqlParser) and
    build a "CQL compliant" expression.

    Best regards

    Erwan


    Cheers
    Andrea

    == GeoServer Professional Services from the experts! Visit
    http://goo.gl/it488V for more information. == Ing. Andrea Aime
    @geowolf Technical Lead GeoSolutions S.A.S. Via di Montramito 3/A
    55054 Massarosa (LU) phone: +39 0584 962313 fax: +39 0584 1660272
    mob: +39 339 8844549 http://www.geo-solutions.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./

-- Ingénieur de Recherche CNRS - HDR,
    Laboratoire Lab-STICC – UMR 6285
    Equipe DECIDE
    Institut Universitaire de Technologie de Vannes
    8, Rue Montaigne - BP 561 56017 Vannes Cedex
    T: +33 2 97 62 64 92
    W:https://cv.archives-ouvertes.fr/erwan-bocher
    W:http://www.labsticc.fr

    _______________________________________________
    GeoTools-GT2-Users mailing list
    GeoTools-GT2-Users@lists.sourceforge.net
    <mailto:GeoTools-GT2-Users@lists.sourceforge.net>
    https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

--
Ingénieur de Recherche CNRS - HDR,
Laboratoire Lab-STICC – UMR 6285
Equipe DECIDE
Institut Universitaire de Technologie de Vannes
8, Rue Montaigne - BP 561 56017 Vannes Cedex
T: +33 2 97 62 64 92
W: https://cv.archives-ouvertes.fr/erwan-bocher
W: http://www.labsticc.fr

_______________________________________________
GeoTools-GT2-Users mailing list
GeoTools-GT2-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to