You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@nifi.apache.org by Mike Thomsen <mi...@gmail.com> on 2018/06/02 22:30:53 UTC

Using EL classes with just java Map objects

I tried working with the EL package's Query object to try building
something like this:

def evaluate(String query, Map coordinates) {
    def compiled = Query.compile(query)
    compiled.evaluate(coordinates)
}

Which for [ name: "John Smith" ] and query '${name}-${name:length()}' I
expected would return a string with both bracketed operations executed. It
threw an exception saying unexpected token '-' at column 7.

Am I missing something here?

Thanks,

Mike

Re: Using EL classes with just java Map objects

Posted by Koji Kawamura <ij...@gmail.com>.
Hi Mike,

In order to evaluate an ExpressionLanguage with Map containing
variables, I used Query.prepare, to parse a query String into
PreparedQuery.
Following code snippet works without issue. Is that something you want to do?

final Map<String, String> map = Collections.singletonMap("name", "John Smith");
final PreparedQuery query = Query.prepare("${name}-${name:length()}");
final String result = query.evaluateExpressions(map, null);
System.out.println(result);

The code prints:
John Smith-10

Thanks,
Koji

On Sun, Jun 3, 2018 at 9:56 AM, Mike Thomsen <mi...@gmail.com> wrote:
> Point of clarification, the templated URL would itself be part of the
> coordinate Map, not a descriptor on the service so users would have total
> freedom there to send different variations with each record depending on
> their needs per record being enriched.
>
> On Sat, Jun 2, 2018 at 8:55 PM Mike Thomsen <mi...@gmail.com> wrote:
>
>> Ok. That makes sense. The idea was that the RestLookupService would
>> provide a templated URL option so you could specify roughly this as an
>> example:
>>
>> GET "https://something.com:${port}/service/${username}/something/${related
>> }"
>>
>> And have the EL engine take the Map and fill in the blanks.
>>
>> On Sat, Jun 2, 2018 at 6:53 PM Matt Burgess <ma...@apache.org> wrote:
>>
>>> Mike,
>>>
>>> IIRC the "top-level" EL evaluator will go through a string finding EL
>>> constructs and pass them into Query I think.  Also ReplaceText (for
>>> some reason) is the only place I know of where you can quote something
>>> and (if EL is present), the result is treated as a string literal.
>>> Otherwise in NiFi Expression Language I believe a quoted construct on
>>> its own is an attribute to be evaluated. You might want the following:
>>>
>>> literal('${name}-${name:length()}')
>>>
>>> or if that doesn't work, it might be because the Query has to be a
>>> full EL construct so maybe you'd have to put the whole thing together
>>> yourself:
>>>
>>> Query.compile("${name}").evaluate(coordinates) + "-" +
>>> Query.compile("${name:length()}")
>>>
>>> I didn't try this out, and it's very possible my assumptions are not
>>> spot-on, so if these don't work let me know and I'll take a closer
>>> look.
>>>
>>> Regards,
>>> Matt
>>>
>>>
>>>
>>>
>>> On Sat, Jun 2, 2018 at 6:30 PM, Mike Thomsen <mi...@gmail.com>
>>> wrote:
>>> > I tried working with the EL package's Query object to try building
>>> > something like this:
>>> >
>>> > def evaluate(String query, Map coordinates) {
>>> >     def compiled = Query.compile(query)
>>> >     compiled.evaluate(coordinates)
>>> > }
>>> >
>>> > Which for [ name: "John Smith" ] and query '${name}-${name:length()}' I
>>> > expected would return a string with both bracketed operations executed.
>>> It
>>> > threw an exception saying unexpected token '-' at column 7.
>>> >
>>> > Am I missing something here?
>>> >
>>> > Thanks,
>>> >
>>> > Mike
>>>
>>

Re: Using EL classes with just java Map objects

Posted by Mike Thomsen <mi...@gmail.com>.
Point of clarification, the templated URL would itself be part of the
coordinate Map, not a descriptor on the service so users would have total
freedom there to send different variations with each record depending on
their needs per record being enriched.

On Sat, Jun 2, 2018 at 8:55 PM Mike Thomsen <mi...@gmail.com> wrote:

> Ok. That makes sense. The idea was that the RestLookupService would
> provide a templated URL option so you could specify roughly this as an
> example:
>
> GET "https://something.com:${port}/service/${username}/something/${related
> }"
>
> And have the EL engine take the Map and fill in the blanks.
>
> On Sat, Jun 2, 2018 at 6:53 PM Matt Burgess <ma...@apache.org> wrote:
>
>> Mike,
>>
>> IIRC the "top-level" EL evaluator will go through a string finding EL
>> constructs and pass them into Query I think.  Also ReplaceText (for
>> some reason) is the only place I know of where you can quote something
>> and (if EL is present), the result is treated as a string literal.
>> Otherwise in NiFi Expression Language I believe a quoted construct on
>> its own is an attribute to be evaluated. You might want the following:
>>
>> literal('${name}-${name:length()}')
>>
>> or if that doesn't work, it might be because the Query has to be a
>> full EL construct so maybe you'd have to put the whole thing together
>> yourself:
>>
>> Query.compile("${name}").evaluate(coordinates) + "-" +
>> Query.compile("${name:length()}")
>>
>> I didn't try this out, and it's very possible my assumptions are not
>> spot-on, so if these don't work let me know and I'll take a closer
>> look.
>>
>> Regards,
>> Matt
>>
>>
>>
>>
>> On Sat, Jun 2, 2018 at 6:30 PM, Mike Thomsen <mi...@gmail.com>
>> wrote:
>> > I tried working with the EL package's Query object to try building
>> > something like this:
>> >
>> > def evaluate(String query, Map coordinates) {
>> >     def compiled = Query.compile(query)
>> >     compiled.evaluate(coordinates)
>> > }
>> >
>> > Which for [ name: "John Smith" ] and query '${name}-${name:length()}' I
>> > expected would return a string with both bracketed operations executed.
>> It
>> > threw an exception saying unexpected token '-' at column 7.
>> >
>> > Am I missing something here?
>> >
>> > Thanks,
>> >
>> > Mike
>>
>

Re: Using EL classes with just java Map objects

Posted by Mike Thomsen <mi...@gmail.com>.
Ok. That makes sense. The idea was that the RestLookupService would provide
a templated URL option so you could specify roughly this as an example:

GET "https://something.com:${port}/service/${username}/something/${related}"

And have the EL engine take the Map and fill in the blanks.

On Sat, Jun 2, 2018 at 6:53 PM Matt Burgess <ma...@apache.org> wrote:

> Mike,
>
> IIRC the "top-level" EL evaluator will go through a string finding EL
> constructs and pass them into Query I think.  Also ReplaceText (for
> some reason) is the only place I know of where you can quote something
> and (if EL is present), the result is treated as a string literal.
> Otherwise in NiFi Expression Language I believe a quoted construct on
> its own is an attribute to be evaluated. You might want the following:
>
> literal('${name}-${name:length()}')
>
> or if that doesn't work, it might be because the Query has to be a
> full EL construct so maybe you'd have to put the whole thing together
> yourself:
>
> Query.compile("${name}").evaluate(coordinates) + "-" +
> Query.compile("${name:length()}")
>
> I didn't try this out, and it's very possible my assumptions are not
> spot-on, so if these don't work let me know and I'll take a closer
> look.
>
> Regards,
> Matt
>
>
>
>
> On Sat, Jun 2, 2018 at 6:30 PM, Mike Thomsen <mi...@gmail.com>
> wrote:
> > I tried working with the EL package's Query object to try building
> > something like this:
> >
> > def evaluate(String query, Map coordinates) {
> >     def compiled = Query.compile(query)
> >     compiled.evaluate(coordinates)
> > }
> >
> > Which for [ name: "John Smith" ] and query '${name}-${name:length()}' I
> > expected would return a string with both bracketed operations executed.
> It
> > threw an exception saying unexpected token '-' at column 7.
> >
> > Am I missing something here?
> >
> > Thanks,
> >
> > Mike
>

Re: Using EL classes with just java Map objects

Posted by Matt Burgess <ma...@apache.org>.
Mike,

IIRC the "top-level" EL evaluator will go through a string finding EL
constructs and pass them into Query I think.  Also ReplaceText (for
some reason) is the only place I know of where you can quote something
and (if EL is present), the result is treated as a string literal.
Otherwise in NiFi Expression Language I believe a quoted construct on
its own is an attribute to be evaluated. You might want the following:

literal('${name}-${name:length()}')

or if that doesn't work, it might be because the Query has to be a
full EL construct so maybe you'd have to put the whole thing together
yourself:

Query.compile("${name}").evaluate(coordinates) + "-" +
Query.compile("${name:length()}")

I didn't try this out, and it's very possible my assumptions are not
spot-on, so if these don't work let me know and I'll take a closer
look.

Regards,
Matt




On Sat, Jun 2, 2018 at 6:30 PM, Mike Thomsen <mi...@gmail.com> wrote:
> I tried working with the EL package's Query object to try building
> something like this:
>
> def evaluate(String query, Map coordinates) {
>     def compiled = Query.compile(query)
>     compiled.evaluate(coordinates)
> }
>
> Which for [ name: "John Smith" ] and query '${name}-${name:length()}' I
> expected would return a string with both bracketed operations executed. It
> threw an exception saying unexpected token '-' at column 7.
>
> Am I missing something here?
>
> Thanks,
>
> Mike