I would like to go over my earlier answer of split( string, delimiter )
since it was my answer on how to handle arrays.

*I am sorry the design of Filter and Converters is so "brittle" and hard to
communicate clearly. Each function implementation has to use the evaluate
methods correctly, and developers need to add additional converters over
time, for the architecture to work out as planned.*

It would help if I had an example of where you needed an array of integers,
I am going to assume Stroke stroke-dasharray just to talk it through.

It is up to the code evaluating the expression to call:

Integer[] array = (int[]) expression.evaluate( feature, Integer[].class );


The above looks easy, what do we need to do to make this happen?

CQL: split( "2 2", " ")

This:

1. Evaluates to a String[]
2. ArrayConverterFactory should be able to convert String[] to the
requested Integer[]

Reading the code of ArrayConverterFactory
<https://github.com/geotools/geotools/blob/master/modules/library/main/src/main/java/org/geotools/data/util/ArrayConverterFactory.java>
shows
that:
a) Incomplete (only providing SingleToArrayConverter
and ArrayToSingleConverter)
b) Does not provide a a converter for element by element conversion
c) Written by me (sigh)

This factory should make a ArrayConverter instance covering a few more
cases:

1. Be willing to traverse the array (right now it just does a single value)
2. Make use of Converters to convert each element if needed to the target
element type.
3. Converters in this example would delegate to NumericConverterFactory
<https://github.com/geotools/geotools/blob/master/modules/library/main/src/main/java/org/geotools/data/util/NumericConverterFactory.java>
(and NumericConverter)
converting each element from String to Integer

-- split vs array --

I would make the second parameter optional and default to "\w" whitespace.
Not sure if you want to offer a regex or just a simple split?
CQL: split( "1 2 3" )
CQL: split( "1 2 3", " ")
CQL: split( "1 2 3", "\w")

An array( ... ) or list function would also be fine, just be sure to allow
min occurs 0 / max occurs 1 on the element parameter:

CQL: array()
CQL: array(1, 1.0, "1", "1.2")

The above would work just fine and convert to an Integer[] if requested.

-- primitives --

Because Java primates are a pain:

Integer[] array = (int[]) expression.evaluate( feature, Integer[].class );
int[] array = ArrayUtils.toPrimitive( array );


That strikes me as boilerplate code, too easy to make a mistake. To address
we would need a PrimitiveArrayConverter so that the following would work:

int[] array = (int[]) expression.evaluate( feature, int[].class );


 --
Jody Garnett


On Fri, 24 Apr 2020 at 06:52, Mauro Bartolomeoli <
mauro.bartolome...@geo-solutions.it> wrote:

> Hi Jody and all,
> I did a little bit more of investigation, and I replaced arrayOverlap with
> a more generic FilterFunction_multipleEqualTo (better names are welcome)
> that is like FilterFunction_equalTo with an additional parameter to specify
> the MatchAction (ANY, ONE or ALL).
> Still open the reasoning on how to express array literals in ECQL. For my
> own use case I can move the arrayFromString function in my project code,
> but I think a more general solution to this problem could be useful to have
> in GeoTools.
>
> Il giorno ven 24 apr 2020 alle ore 09:01 Mauro Bartolomeoli <
> mauro.bartolome...@geo-solutions.it> ha scritto:
>
>> Hi Jody,
>>
>>
>> Il giorno gio 23 apr 2020 alle ore 19:44 Jody Garnett <
>> jody.garn...@gmail.com> ha scritto:
>>
>>> Filter is not typed, seeing types in the function name read more like
>>> java and less like CQL.
>>>
>>> *split( string, delimiter )*
>>>
>>>
>>> For the same reason I do not want to see parameters like
>>> 'java.lang.Integer' used when Filter environment is untyped. If you do need
>>> an int[] from an expression, make sure Converters handles it appropriately
>>> so the work is done once. It is bad enough we have functions like int2bbool
>>> and int2double as there should not be a need for it.
>>>
>>
>> I understand your concern, and I try to express my underlying need, so
>> that we can identify the best solution, What I miss in (E)CQL right now is
>> a way to express array literals. The proposal above was indeed about being
>> able to create an array of numbers. Do you have any alternative idea on how
>> we can do that?
>>
>>
>>> I am not sure what to make of array overlaps function:
>>> - I see the name conflict with overlaps(geom,geom) function
>>> - We already have equals with matchAction Any to handle this
>>> functionality, is there any reason why you need it to be a function and not
>>> a filter?
>>> - There are examples where filters have been repurposed as functions
>>> already, for example the equalTo(a,b): Boolean function. I would follow
>>> that example.
>>>
>>> equalTo( value, value, matchPolicy ) - where matchPolicy is "All", "Any"
>>> or "One"
>>>
>>>
>> After reading this, I had a look at the postgis driver code to handle
>> array comparisons, and maybe I can make it work using equalTo. Going to try
>> and let you know.
>> Thanks for your suggestions.
>>
>> --
>>
>> Regards,
>>
>> Mauro Bartolomeoli
>>
>> ==
>> GeoServer Professional Services from the experts! Visit
>> http://goo.gl/it488V for more information.
>> ==
>>
>> Dott. Mauro Bartolomeoli
>> @mauro_bart
>> Technical Lead
>>
>> GeoSolutions S.A.S.
>> Via di Montramito 3/A
>> 55054  Massarosa (LU)
>> Italy
>>
>> mobile: +39 393 904 1756
>> phone: +39 0584 962313
>> fax:      +39 0584 1660272
>>
>> 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.
>>
>
>
> --
>
> Regards,
>
> Mauro Bartolomeoli
>
> ==
> GeoServer Professional Services from the experts! Visit
> http://goo.gl/it488V for more information.
> ==
>
> Dott. Mauro Bartolomeoli
> @mauro_bart
> Technical Lead
>
> GeoSolutions S.A.S.
> Via di Montramito 3/A
> 55054  Massarosa (LU)
> Italy
>
> mobile: +39 393 904 1756
> phone: +39 0584 962313
> fax:      +39 0584 1660272
>
> 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.
>
_______________________________________________
GeoTools-Devel mailing list
GeoTools-Devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geotools-devel

Reply via email to