in-memory filter by Expression accessing regular methods

classic Classic list List threaded Threaded
10 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

in-memory filter by Expression accessing regular methods

Musall, Maik
Hi,

when filtering a list of objects by expression.filterObjects( list ), is there a way for the expression to access regular methods instead of Cayenne db properties?

Use Case: I have a class A that has several relationships to class B, and it depends on a number of factors which is relevant in this case. So there is a method that returns either this or that relation to class B. I would like to include the method name in the expression path. (This was possible in EOF, and I just found that it doesn't work in Cayenne.)

Thanks
Maik

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: in-memory filter by Expression accessing regular methods

John Huss
Just use a java 8 stream and lambda in addition or instead of.
On Wed, Apr 12, 2017 at 4:48 PM Musall, Maik <[hidden email]> wrote:

> Hi,
>
> when filtering a list of objects by expression.filterObjects( list ), is
> there a way for the expression to access regular methods instead of Cayenne
> db properties?
>
> Use Case: I have a class A that has several relationships to class B, and
> it depends on a number of factors which is relevant in this case. So there
> is a method that returns either this or that relation to class B. I would
> like to include the method name in the expression path. (This was possible
> in EOF, and I just found that it doesn't work in Cayenne.)
>
> Thanks
> Maik
>
>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: in-memory filter by Expression accessing regular methods

Musall, Maik
Hi John,

how do you mean that? Those filter paths come from the UI, passed on by the user assembling filter criteria. I wouldn't use string filter paths if the criteria would be constant.

Maik

> Am 12.04.2017 um 19:03 schrieb John Huss <[hidden email]>:
>
> Just use a java 8 stream and lambda in addition or instead of.
> On Wed, Apr 12, 2017 at 4:48 PM Musall, Maik <[hidden email]> wrote:
>
>> Hi,
>>
>> when filtering a list of objects by expression.filterObjects( list ), is
>> there a way for the expression to access regular methods instead of Cayenne
>> db properties?
>>
>> Use Case: I have a class A that has several relationships to class B, and
>> it depends on a number of factors which is relevant in this case. So there
>> is a method that returns either this or that relation to class B. I would
>> like to include the method name in the expression path. (This was possible
>> in EOF, and I just found that it doesn't work in Cayenne.)
>>
>> Thanks
>> Maik
>>
>>

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: in-memory filter by Expression accessing regular methods

John Huss
Ok, you can use property utils in conjunction to call a method using
reflection (with a string name)
On Wed, Apr 12, 2017 at 6:07 PM Musall, Maik <[hidden email]> wrote:

> Hi John,
>
> how do you mean that? Those filter paths come from the UI, passed on by
> the user assembling filter criteria. I wouldn't use string filter paths if
> the criteria would be constant.
>
> Maik
>
> > Am 12.04.2017 um 19:03 schrieb John Huss <[hidden email]>:
> >
> > Just use a java 8 stream and lambda in addition or instead of.
> > On Wed, Apr 12, 2017 at 4:48 PM Musall, Maik <[hidden email]>
> wrote:
> >
> >> Hi,
> >>
> >> when filtering a list of objects by expression.filterObjects( list ), is
> >> there a way for the expression to access regular methods instead of
> Cayenne
> >> db properties?
> >>
> >> Use Case: I have a class A that has several relationships to class B,
> and
> >> it depends on a number of factors which is relevant in this case. So
> there
> >> is a method that returns either this or that relation to class B. I
> would
> >> like to include the method name in the expression path. (This was
> possible
> >> in EOF, and I just found that it doesn't work in Cayenne.)
> >>
> >> Thanks
> >> Maik
> >>
> >>
>
>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: in-memory filter by Expression accessing regular methods

Musall, Maik
Hi John,

can you elaborate that on this example?

Previously, I did this to filter:

        result = ExpressionFactory.matchExp( filterPath, filterValue ).filterObjects( result );

Now I tried:

        result = result.stream()
                .filter( obj -> PropertyUtils.getProperty( obj, filterPath ).equals( filterValue ) )
                .collect( Collectors.toList() );

Both times, I get:

java.lang.IllegalArgumentException: Property 'responsibleUser' is not readable

where "result" is like a List<Foo> with Foo being a DataObject that has a method called "responsibleUser", returning another DataObject subclass.

Maik


> Am 12.04.2017 um 19:11 schrieb John Huss <[hidden email]>:
>
> Ok, you can use property utils in conjunction to call a method using
> reflection (with a string name)
> On Wed, Apr 12, 2017 at 6:07 PM Musall, Maik <[hidden email]> wrote:
>
>> Hi John,
>>
>> how do you mean that? Those filter paths come from the UI, passed on by
>> the user assembling filter criteria. I wouldn't use string filter paths if
>> the criteria would be constant.
>>
>> Maik
>>
>>> Am 12.04.2017 um 19:03 schrieb John Huss <[hidden email]>:
>>>
>>> Just use a java 8 stream and lambda in addition or instead of.
>>> On Wed, Apr 12, 2017 at 4:48 PM Musall, Maik <[hidden email]>
>> wrote:
>>>
>>>> Hi,
>>>>
>>>> when filtering a list of objects by expression.filterObjects( list ), is
>>>> there a way for the expression to access regular methods instead of
>> Cayenne
>>>> db properties?
>>>>
>>>> Use Case: I have a class A that has several relationships to class B,
>> and
>>>> it depends on a number of factors which is relevant in this case. So
>> there
>>>> is a method that returns either this or that relation to class B. I
>> would
>>>> like to include the method name in the expression path. (This was
>> possible
>>>> in EOF, and I just found that it doesn't work in Cayenne.)
>>>>
>>>> Thanks
>>>> Maik
>>>>
>>>>
>>
>>

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: in-memory filter by Expression accessing regular methods

Mark Wardle
Can't try it as only have phone at the moment but have you tried adding "get" as a prefix to your method declaration?

I still find it difficult to not name getters without the get.

--
Dr. Mark Wardle
Consultant Neurologist, Cardiff, UK
(Sent from my mobile)


> On 13 Apr 2017, at 10:44, Musall, Maik <[hidden email]> wrote:
>
> Hi John,
>
> can you elaborate that on this example?
>
> Previously, I did this to filter:
>
>    result = ExpressionFactory.matchExp( filterPath, filterValue ).filterObjects( result );
>
> Now I tried:
>
>    result = result.stream()
>        .filter( obj -> PropertyUtils.getProperty( obj, filterPath ).equals( filterValue ) )
>        .collect( Collectors.toList() );
>
> Both times, I get:
>
> java.lang.IllegalArgumentException: Property 'responsibleUser' is not readable
>
> where "result" is like a List<Foo> with Foo being a DataObject that has a method called "responsibleUser", returning another DataObject subclass.
>
> Maik
>
>
>> Am 12.04.2017 um 19:11 schrieb John Huss <[hidden email]>:
>>
>> Ok, you can use property utils in conjunction to call a method using
>> reflection (with a string name)
>>> On Wed, Apr 12, 2017 at 6:07 PM Musall, Maik <[hidden email]> wrote:
>>>
>>> Hi John,
>>>
>>> how do you mean that? Those filter paths come from the UI, passed on by
>>> the user assembling filter criteria. I wouldn't use string filter paths if
>>> the criteria would be constant.
>>>
>>> Maik
>>>
>>>> Am 12.04.2017 um 19:03 schrieb John Huss <[hidden email]>:
>>>>
>>>> Just use a java 8 stream and lambda in addition or instead of.
>>>> On Wed, Apr 12, 2017 at 4:48 PM Musall, Maik <[hidden email]>
>>> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> when filtering a list of objects by expression.filterObjects( list ), is
>>>>> there a way for the expression to access regular methods instead of
>>> Cayenne
>>>>> db properties?
>>>>>
>>>>> Use Case: I have a class A that has several relationships to class B,
>>> and
>>>>> it depends on a number of factors which is relevant in this case. So
>>> there
>>>>> is a method that returns either this or that relation to class B. I
>>> would
>>>>> like to include the method name in the expression path. (This was
>>> possible
>>>>> in EOF, and I just found that it doesn't work in Cayenne.)
>>>>>
>>>>> Thanks
>>>>> Maik
>>>>>
>>>>>
>>>
>>>
>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: in-memory filter by Expression accessing regular methods

Musall, Maik
Wow, Mark, good guess!

That's it. Added a get… method around each part of the path's accessed methods, and it works. Didn't occur to me at all, because those methods are not getters in the strict sense. But I could have discovered this before, by looking at the BeanAcccessor implementation. Dang.

I suppose there is no way in Cayenne to inject a different behaviour for this, through DI or something? It doesn't look like it from the code (BeanAccessor, PropertyUtils, and the readSimpleProperty() method  in CayennDataObject is even marked final). Because I know I will run into this again and again, given the existing large code base.

Maik



> Am 15.04.2017 um 23:18 schrieb Mark Wardle <[hidden email]>:
>
> Can't try it as only have phone at the moment but have you tried adding "get" as a prefix to your method declaration?
>
> I still find it difficult to not name getters without the get.
>
> --
> Dr. Mark Wardle
> Consultant Neurologist, Cardiff, UK
> (Sent from my mobile)
>
>
>> On 13 Apr 2017, at 10:44, Musall, Maik <[hidden email]> wrote:
>>
>> Hi John,
>>
>> can you elaborate that on this example?
>>
>> Previously, I did this to filter:
>>
>>   result = ExpressionFactory.matchExp( filterPath, filterValue ).filterObjects( result );
>>
>> Now I tried:
>>
>>   result = result.stream()
>>       .filter( obj -> PropertyUtils.getProperty( obj, filterPath ).equals( filterValue ) )
>>       .collect( Collectors.toList() );
>>
>> Both times, I get:
>>
>> java.lang.IllegalArgumentException: Property 'responsibleUser' is not readable
>>
>> where "result" is like a List<Foo> with Foo being a DataObject that has a method called "responsibleUser", returning another DataObject subclass.
>>
>> Maik
>>
>>
>>> Am 12.04.2017 um 19:11 schrieb John Huss <[hidden email]>:
>>>
>>> Ok, you can use property utils in conjunction to call a method using
>>> reflection (with a string name)
>>>> On Wed, Apr 12, 2017 at 6:07 PM Musall, Maik <[hidden email]> wrote:
>>>>
>>>> Hi John,
>>>>
>>>> how do you mean that? Those filter paths come from the UI, passed on by
>>>> the user assembling filter criteria. I wouldn't use string filter paths if
>>>> the criteria would be constant.
>>>>
>>>> Maik
>>>>
>>>>> Am 12.04.2017 um 19:03 schrieb John Huss <[hidden email]>:
>>>>>
>>>>> Just use a java 8 stream and lambda in addition or instead of.
>>>>> On Wed, Apr 12, 2017 at 4:48 PM Musall, Maik <[hidden email]>
>>>> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> when filtering a list of objects by expression.filterObjects( list ), is
>>>>>> there a way for the expression to access regular methods instead of
>>>> Cayenne
>>>>>> db properties?
>>>>>>
>>>>>> Use Case: I have a class A that has several relationships to class B,
>>>> and
>>>>>> it depends on a number of factors which is relevant in this case. So
>>>> there
>>>>>> is a method that returns either this or that relation to class B. I
>>>> would
>>>>>> like to include the method name in the expression path. (This was
>>>> possible
>>>>>> in EOF, and I just found that it doesn't work in Cayenne.)
>>>>>>
>>>>>> Thanks
>>>>>> Maik
>>>>>>
>>>>>>
>>>>
>>>>
>>

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: in-memory filter by Expression accessing regular methods

Mark Wardle
Glad it worked!

Mark

--
Dr. Mark Wardle
Consultant Neurologist, Cardiff, UK
(Sent from my mobile)


> On 16 Apr 2017, at 12:13, Musall, Maik <[hidden email]> wrote:
>
> Wow, Mark, good guess!
>
> That's it. Added a get… method around each part of the path's accessed methods, and it works. Didn't occur to me at all, because those methods are not getters in the strict sense. But I could have discovered this before, by looking at the BeanAcccessor implementation. Dang.
>
> I suppose there is no way in Cayenne to inject a different behaviour for this, through DI or something? It doesn't look like it from the code (BeanAccessor, PropertyUtils, and the readSimpleProperty() method  in CayennDataObject is even marked final). Because I know I will run into this again and again, given the existing large code base.
>
> Maik
>
>
>
>> Am 15.04.2017 um 23:18 schrieb Mark Wardle <[hidden email]>:
>>
>> Can't try it as only have phone at the moment but have you tried adding "get" as a prefix to your method declaration?
>>
>> I still find it difficult to not name getters without the get.
>>
>> --
>> Dr. Mark Wardle
>> Consultant Neurologist, Cardiff, UK
>> (Sent from my mobile)
>>
>>
>>> On 13 Apr 2017, at 10:44, Musall, Maik <[hidden email]> wrote:
>>>
>>> Hi John,
>>>
>>> can you elaborate that on this example?
>>>
>>> Previously, I did this to filter:
>>>
>>>  result = ExpressionFactory.matchExp( filterPath, filterValue ).filterObjects( result );
>>>
>>> Now I tried:
>>>
>>>  result = result.stream()
>>>      .filter( obj -> PropertyUtils.getProperty( obj, filterPath ).equals( filterValue ) )
>>>      .collect( Collectors.toList() );
>>>
>>> Both times, I get:
>>>
>>> java.lang.IllegalArgumentException: Property 'responsibleUser' is not readable
>>>
>>> where "result" is like a List<Foo> with Foo being a DataObject that has a method called "responsibleUser", returning another DataObject subclass.
>>>
>>> Maik
>>>
>>>
>>>> Am 12.04.2017 um 19:11 schrieb John Huss <[hidden email]>:
>>>>
>>>> Ok, you can use property utils in conjunction to call a method using
>>>> reflection (with a string name)
>>>>> On Wed, Apr 12, 2017 at 6:07 PM Musall, Maik <[hidden email]> wrote:
>>>>>
>>>>> Hi John,
>>>>>
>>>>> how do you mean that? Those filter paths come from the UI, passed on by
>>>>> the user assembling filter criteria. I wouldn't use string filter paths if
>>>>> the criteria would be constant.
>>>>>
>>>>> Maik
>>>>>
>>>>>> Am 12.04.2017 um 19:03 schrieb John Huss <[hidden email]>:
>>>>>>
>>>>>> Just use a java 8 stream and lambda in addition or instead of.
>>>>>> On Wed, Apr 12, 2017 at 4:48 PM Musall, Maik <[hidden email]>
>>>>> wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> when filtering a list of objects by expression.filterObjects( list ), is
>>>>>>> there a way for the expression to access regular methods instead of
>>>>> Cayenne
>>>>>>> db properties?
>>>>>>>
>>>>>>> Use Case: I have a class A that has several relationships to class B,
>>>>> and
>>>>>>> it depends on a number of factors which is relevant in this case. So
>>>>> there
>>>>>>> is a method that returns either this or that relation to class B. I
>>>>> would
>>>>>>> like to include the method name in the expression path. (This was
>>>>> possible
>>>>>>> in EOF, and I just found that it doesn't work in Cayenne.)
>>>>>>>
>>>>>>> Thanks
>>>>>>> Maik
>>>>>>>
>>>>>>>
>>>>>
>>>>>
>>>
>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: in-memory filter by Expression accessing regular methods

Michael Gentry
In reply to this post by Musall, Maik
Hi Maik,

I'm late to this, but you likely could've used
obj.readProperty("responsibleUser") as well.

mrg


On Sun, Apr 16, 2017 at 7:13 AM, Musall, Maik <[hidden email]> wrote:

> Wow, Mark, good guess!
>
> That's it. Added a get… method around each part of the path's accessed
> methods, and it works. Didn't occur to me at all, because those methods are
> not getters in the strict sense. But I could have discovered this before,
> by looking at the BeanAcccessor implementation. Dang.
>
> I suppose there is no way in Cayenne to inject a different behaviour for
> this, through DI or something? It doesn't look like it from the code
> (BeanAccessor, PropertyUtils, and the readSimpleProperty() method  in
> CayennDataObject is even marked final). Because I know I will run into this
> again and again, given the existing large code base.
>
> Maik
>
>
>
> > Am 15.04.2017 um 23:18 schrieb Mark Wardle <[hidden email]>:
> >
> > Can't try it as only have phone at the moment but have you tried adding
> "get" as a prefix to your method declaration?
> >
> > I still find it difficult to not name getters without the get.
> >
> > --
> > Dr. Mark Wardle
> > Consultant Neurologist, Cardiff, UK
> > (Sent from my mobile)
> >
> >
> >> On 13 Apr 2017, at 10:44, Musall, Maik <[hidden email]> wrote:
> >>
> >> Hi John,
> >>
> >> can you elaborate that on this example?
> >>
> >> Previously, I did this to filter:
> >>
> >>   result = ExpressionFactory.matchExp( filterPath, filterValue
> ).filterObjects( result );
> >>
> >> Now I tried:
> >>
> >>   result = result.stream()
> >>       .filter( obj -> PropertyUtils.getProperty( obj, filterPath
> ).equals( filterValue ) )
> >>       .collect( Collectors.toList() );
> >>
> >> Both times, I get:
> >>
> >> java.lang.IllegalArgumentException: Property 'responsibleUser' is not
> readable
> >>
> >> where "result" is like a List<Foo> with Foo being a DataObject that has
> a method called "responsibleUser", returning another DataObject subclass.
> >>
> >> Maik
> >>
> >>
> >>> Am 12.04.2017 um 19:11 schrieb John Huss <[hidden email]>:
> >>>
> >>> Ok, you can use property utils in conjunction to call a method using
> >>> reflection (with a string name)
> >>>> On Wed, Apr 12, 2017 at 6:07 PM Musall, Maik <[hidden email]>
> wrote:
> >>>>
> >>>> Hi John,
> >>>>
> >>>> how do you mean that? Those filter paths come from the UI, passed on
> by
> >>>> the user assembling filter criteria. I wouldn't use string filter
> paths if
> >>>> the criteria would be constant.
> >>>>
> >>>> Maik
> >>>>
> >>>>> Am 12.04.2017 um 19:03 schrieb John Huss <[hidden email]>:
> >>>>>
> >>>>> Just use a java 8 stream and lambda in addition or instead of.
> >>>>> On Wed, Apr 12, 2017 at 4:48 PM Musall, Maik <[hidden email]>
> >>>> wrote:
> >>>>>
> >>>>>> Hi,
> >>>>>>
> >>>>>> when filtering a list of objects by expression.filterObjects( list
> ), is
> >>>>>> there a way for the expression to access regular methods instead of
> >>>> Cayenne
> >>>>>> db properties?
> >>>>>>
> >>>>>> Use Case: I have a class A that has several relationships to class
> B,
> >>>> and
> >>>>>> it depends on a number of factors which is relevant in this case. So
> >>>> there
> >>>>>> is a method that returns either this or that relation to class B. I
> >>>> would
> >>>>>> like to include the method name in the expression path. (This was
> >>>> possible
> >>>>>> in EOF, and I just found that it doesn't work in Cayenne.)
> >>>>>>
> >>>>>> Thanks
> >>>>>> Maik
> >>>>>>
> >>>>>>
> >>>>
> >>>>
> >>
>
>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: in-memory filter by Expression accessing regular methods

Musall, Maik
Hi Michael,

in the meantime I remembered I had already implemented NSKeyValueCodingAdditions for my DataObject subclass, so I just used that :-)

Maik

> Am 18.04.2017 um 18:23 schrieb Michael Gentry <[hidden email]>:
>
> Hi Maik,
>
> I'm late to this, but you likely could've used
> obj.readProperty("responsibleUser") as well.
>
> mrg
>
>
>> On Sun, Apr 16, 2017 at 7:13 AM, Musall, Maik <[hidden email]> wrote:
>>
>> Wow, Mark, good guess!
>>
>> That's it. Added a get… method around each part of the path's accessed
>> methods, and it works. Didn't occur to me at all, because those methods are
>> not getters in the strict sense. But I could have discovered this before,
>> by looking at the BeanAcccessor implementation. Dang.
>>
>> I suppose there is no way in Cayenne to inject a different behaviour for
>> this, through DI or something? It doesn't look like it from the code
>> (BeanAccessor, PropertyUtils, and the readSimpleProperty() method  in
>> CayennDataObject is even marked final). Because I know I will run into this
>> again and again, given the existing large code base.
>>
>> Maik
>>
>>
>>
>>> Am 15.04.2017 um 23:18 schrieb Mark Wardle <[hidden email]>:
>>>
>>> Can't try it as only have phone at the moment but have you tried adding
>> "get" as a prefix to your method declaration?
>>>
>>> I still find it difficult to not name getters without the get.
>>>
>>> --
>>> Dr. Mark Wardle
>>> Consultant Neurologist, Cardiff, UK
>>> (Sent from my mobile)
>>>
>>>
>>>> On 13 Apr 2017, at 10:44, Musall, Maik <[hidden email]> wrote:
>>>>
>>>> Hi John,
>>>>
>>>> can you elaborate that on this example?
>>>>
>>>> Previously, I did this to filter:
>>>>
>>>>  result = ExpressionFactory.matchExp( filterPath, filterValue
>> ).filterObjects( result );
>>>>
>>>> Now I tried:
>>>>
>>>>  result = result.stream()
>>>>      .filter( obj -> PropertyUtils.getProperty( obj, filterPath
>> ).equals( filterValue ) )
>>>>      .collect( Collectors.toList() );
>>>>
>>>> Both times, I get:
>>>>
>>>> java.lang.IllegalArgumentException: Property 'responsibleUser' is not
>> readable
>>>>
>>>> where "result" is like a List<Foo> with Foo being a DataObject that has
>> a method called "responsibleUser", returning another DataObject subclass.
>>>>
>>>> Maik
>>>>
>>>>
>>>>> Am 12.04.2017 um 19:11 schrieb John Huss <[hidden email]>:
>>>>>
>>>>> Ok, you can use property utils in conjunction to call a method using
>>>>> reflection (with a string name)
>>>>>> On Wed, Apr 12, 2017 at 6:07 PM Musall, Maik <[hidden email]>
>> wrote:
>>>>>>
>>>>>> Hi John,
>>>>>>
>>>>>> how do you mean that? Those filter paths come from the UI, passed on
>> by
>>>>>> the user assembling filter criteria. I wouldn't use string filter
>> paths if
>>>>>> the criteria would be constant.
>>>>>>
>>>>>> Maik
>>>>>>
>>>>>>> Am 12.04.2017 um 19:03 schrieb John Huss <[hidden email]>:
>>>>>>>
>>>>>>> Just use a java 8 stream and lambda in addition or instead of.
>>>>>>> On Wed, Apr 12, 2017 at 4:48 PM Musall, Maik <[hidden email]>
>>>>>> wrote:
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> when filtering a list of objects by expression.filterObjects( list
>> ), is
>>>>>>>> there a way for the expression to access regular methods instead of
>>>>>> Cayenne
>>>>>>>> db properties?
>>>>>>>>
>>>>>>>> Use Case: I have a class A that has several relationships to class
>> B,
>>>>>> and
>>>>>>>> it depends on a number of factors which is relevant in this case. So
>>>>>> there
>>>>>>>> is a method that returns either this or that relation to class B. I
>>>>>> would
>>>>>>>> like to include the method name in the expression path. (This was
>>>>>> possible
>>>>>>>> in EOF, and I just found that it doesn't work in Cayenne.)
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>> Maik
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>>
>>>>
>>
>>

smime.p7s (3K) Download Attachment
Loading...