[rules-users] How to limit results from a collect statement
pentarious
cristiano.giuffrida at gmail.com
Thu Aug 23 09:56:31 EDT 2007
I just opened a JIRA: http://jira.jboss.com/jira/browse/JBRULES-1115.
Regards,
CG
Edson Tirelli-3 wrote:
>
> I do suggest you open a JIRA and attach your test case. I will need to
> do
> some debugging to understand what is happening.
>
> []s
> Edson
>
> 2007/8/22, pentarious <cristiano.giuffrida at gmail.com>:
>
>
>>
>> I hope you can help me find a solution. In the meantime I've tried your
>> workaround, adding an addOption() method with no success. When I use that
>> method in the rule I get the following exception (and I can't understand
>> why):
>> java.lang.ClassNotFoundException: org.test.ItemShadowProxy
>> org.test.Item is the full qualified name of the bean Item. Any idea?
>>
>> Regards,
>>
>> CG
>>
>>
>> Edson Tirelli-3 wrote:
>> >
>> > I think I know what is happening. The getOptions() method is
>> returning
>> > the shadowed options collections, i.e., when you are adding the option,
>> > you
>> > are adding to the shadow instead of the real object.
>> >
>> > Now, I'm not sure how we should handle such thing, since we do need
>> to
>> > shadow the options collection.
>> >
>> > Mark, any idea?
>> >
>> > A workaround is: create an addOption() method to the Item class to
>> add
>> > options, instead of doing getOptions().add(). This way the shadow proxy
>> > will
>> > delegate the call to your real class, instead of adding it to the
>> shadow.
>> >
>> > []s
>> > Edson
>> >
>> > 2007/8/22, pentarious <cristiano.giuffrida at gmail.com>:
>> >>
>> >>
>> >> Actually, before opening a JIRA I would like to show you my actual
>> >> code...
>> >> Here it is:
>> >>
>> >> rule "My Rule"
>> >> no-loop true
>> >> when
>> >> $list : ArrayList() from collect( Item( type == "MY TYPE" ) )
>> >> then
>> >> Item item = (Item) $list.get(0);
>> >> ItemOption option = new ItemOption( item, "MY OPTION" );
>> >> item.setType("MY NEW TYPE");
>> >> item.getOptions().add( option );
>> >> insert(option);
>> >> update(item);
>> >> end
>> >>
>> >> Basically we have some items (Item) and we need to take into
>> >> considerations
>> >> just items of type "MY TYPE", adding a new option "MY OPTION" to the
>> list
>> >> of
>> >> the options of the first item in $list. Item is a bean with a field as
>> >> follows:
>> >> private Collection<ItemOption > options = new
>> >> ArrayList<ItemOption>();
>> >> I thought it was worth writing again before opening a JIRA, as I've
>> >> looked
>> >> further into the problem and I found out another interesting thing. As
>> >> you
>> >> may have noticed I put two lines in my code:
>> >> item.setType("MY NEW TYPE");
>> >> item.getOptions().add( option );
>> >> It's interesting to notice that the first line works as expected (i.e.
>> >> after
>> >> executing the rule the item has a new type called "MY NEW TYPE"),
>> while
>> >> the
>> >> second line doesn't (i.e. after executing the rule the item doesn't
>> have
>> >> a
>> >> new option in its option list). So, do you think I should definitively
>> >> open
>> >> a JIRA (I've never opened one before, can you give a link just in
>> case?)
>> >> or
>> >> I'm just missing something and there is a trivial solution to this
>> issue?
>> >>
>> >> Regards,
>> >>
>> >> CG
>> >>
>> >>
>> >> Edson Tirelli-3 wrote:
>> >> >
>> >> > Well, it must work. Can you open a JIRA with a self contained
>> test
>> >> > case
>> >> > please? I will investigate.
>> >> >
>> >> > []s
>> >> > Edson
>> >> >
>> >> > 2007/8/22, pentarious <cristiano.giuffrida at gmail.com>:
>> >> >>
>> >> >>
>> >> >> I know. Actually I didn't put any update or insert statement in the
>> >> code
>> >> >> just
>> >> >> to make it simpler. The actual code looks like:
>> >> >> when
>> >> >> $itemList : ArrayList() from collect( Item( category ==
>> "VIDEO"
>> >> )
>> >> )
>> >> >> then
>> >> >> ItemDiscount disc = new ItemDiscount(10);
>> >> >> insert(disc);
>> >> >> $myFirstItem = (Item)$itemList.get(0);
>> >> >> $mySecondItem = (Item)$itemList.get(1);
>> >> >> $myFirstItem.addDiscount(disc);
>> >> >> $mySecondItem.addDiscount(disc);
>> >> >> update($myFirstItem);
>> >> >> update($mySecondItem);
>> >> >> Now, why this doesn't work at all? It does work if I write a rule
>> for
>> >> >> each
>> >> >> item using in the when clause $item : Item from $itemList, but as
>> I
>> >> said
>> >> >> I
>> >> >> need to write a list-oriented rule.
>> >> >>
>> >> >> Regards,
>> >> >>
>> >> >> CG
>> >> >>
>> >> >>
>> >> >> Edson Tirelli-3 wrote:
>> >> >> >
>> >> >> > If you want the "engine to see" your changes, in a way you
>> affect
>> >> >> other
>> >> >> > rules, you must call update( object ) for the object you are
>> >> changing.
>> >> >> > Otherwise, the change will happen to the original object, but not
>> to
>> >> >> the
>> >> >> > shadow proxy that the engine uses to ensure consistency.
>> >> >> >
>> >> >> > []s
>> >> >> > Edson
>> >> >> >
>> >> >> > 2007/8/22, pentarious <cristiano.giuffrida at gmail.com>:
>> >> >> >>
>> >> >> >>
>> >> >> >> Ok, I'm still working on that, I'll publish my solution asap. In
>> >> the
>> >> >> >> meantime
>> >> >> >> it turns out our requirements need something more than that. We
>> >> have
>> >> >> an
>> >> >> >> ordered list of beans (items) and we have to be able to modify a
>> >> >> specific
>> >> >> >> subset of the list (adding a discount). Now I tried to solve
>> this
>> >> >> problem
>> >> >> >> by
>> >> >> >> working directly on the list of items. But I can't understand
>> why
>> >> this
>> >> >> >> doesn't work:
>> >> >> >> when
>> >> >> >> $itemList : ArrayList() from collect( Item( category ==
>> >> "VIDEO"
>> >> )
>> >> >> )
>> >> >> >> then
>> >> >> >> ItemDiscount disc = new ItemDiscount(10);
>> >> >> >> $myFirstItem = (Item)$itemList.get(0);
>> >> >> >> $mySecondItem = (Item)$itemList.get(1);
>> >> >> >> $myFirstItem.addDiscount(disc);
>> >> >> >> $mySecondItem.addDiscount(disc);
>> >> >> >>
>> >> >> >> After executing this rule it's like nothing happened! I mean no
>> >> >> discount
>> >> >> >> has
>> >> >> >> been added to the two items! The problem seems to be related to
>> >> >> >> extracting
>> >> >> >> items from the list. Apparently, every time we get an item from
>> the
>> >> >> list,
>> >> >> >> it
>> >> >> >> looses its link with the original item (I don't know if it's a
>> copy
>> >> of
>> >> >> >> the
>> >> >> >> original item or whatever), so that every update doesn't affect
>> the
>> >> >> >> original
>> >> >> >> item any more. But of course that's what we're interested in! We
>> >> want
>> >> >> to
>> >> >> >> modify original items in the rule session. Am I missing
>> something?
>> >> Or
>> >> >> Is
>> >> >> >> it
>> >> >> >> a bug?
>> >> >> >>
>> >> >> >> Regards,
>> >> >> >>
>> >> >> >> CG
>> >> >> >>
>> >> >> >>
>> >> >> >>
>> >> >> >> Edson Tirelli-3 wrote:
>> >> >> >> >
>> >> >> >> > Please, share with us! Send to the list!
>> >> >> >> >
>> >> >> >> > Edson
>> >> >> >> >
>> >> >> >> > 2007/8/21, pentarious <cristiano.giuffrida at gmail.com>:
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >> I found an interesting implementation to do that. If anyone
>> is
>> >> >> >> interested
>> >> >> >> >> I
>> >> >> >> >> could share my solution.
>> >> >> >> >>
>> >> >> >> >> Regards,
>> >> >> >> >>
>> >> >> >> >> CG
>> >> >> >> >>
>> >> >> >> >>
>> >> >> >> >> Mark Proctor wrote:
>> >> >> >> >> >
>> >> >> >> >> > There is no supported way to do this. You could use an
>> >> >> inline-eval
>> >> >> >> >> > against a global, but that is very clunkey. However it does
>> >> seem
>> >> >> >> like
>> >> >> >> a
>> >> >> >> >> > good feature idea for a future release, open a jira and
>> I'll
>> >> look
>> >> >> >> into
>> >> >> >> >> > getting it included.
>> >> >> >> >> >
>> >> >> >> >> > Mark
>> >> >> >> >> > pentarious wrote:
>> >> >> >> >> >> Does anyone know a method to limit the number of results
>> from
>> >> a
>> >> >> >> >> collect
>> >> >> >> >> >> statement? I was just wondering how to do something like
>> >> this:
>> >> >> >> >> >> $myList : List() from collect( MyObject(myField ==
>> >> "something")
>> >> >> )
>> >> >> >> >> limit
>> >> >> >> >> 3
>> >> >> >> >> >> //it should put in $myList just the first 3 objects
>> retrieved
>> >> >> >> >> >> I'm quite sure there is nothing in Drools which can
>> natively
>> >> >> >> support
>> >> >> >> >> >> something like that. So, how to do that, if needed? I
>> tried
>> >> >> this,
>> >> >> >> but
>> >> >> >> >> it
>> >> >> >> >> >> seems not to be working (I can't understand why, though):
>> >> >> >> >> >> $myList : List() from collect( MyObject(myField ==
>> >> "something")
>> >> >> )
>> >> >> >> >> >> $myObject : MyObject() from $myList
>> >> >> >> >> >> eval( $myList.indexOf($myObject) < 3 )
>> >> >> >> >> >> Indeed, it doesn't work because the link beetween $myList
>> and
>> >> >> >> >> $myObject
>> >> >> >> >> >> seems to be released during any execution of the rule (In
>> >> fact
>> >> >> >> >> >> $myList.contains($myObject) returns false! Again, I can't
>> >> >> >> understand
>> >> >> >> >> >> why...)
>> >> >> >> >> >>
>> >> >> >> >> >> Any advice would be really appreciated!
>> >> >> >> >> >>
>> >> >> >> >> >> Regards,
>> >> >> >> >> >>
>> >> >> >> >> >> CG
>> >> >> >> >> >>
>> >> >> >> >> >
>> >> >> >> >> > _______________________________________________
>> >> >> >> >> > rules-users mailing list
>> >> >> >> >> > rules-users at lists.jboss.org
>> >> >> >> >> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> >> >> >
>> >> >> >> >> >
>> >> >> >> >>
>> >> >> >> >> --
>> >> >> >> >> View this message in context:
>> >> >> >> >>
>> >> >> >>
>> >> >>
>> >>
>> http://www.nabble.com/How-to-limit-results-from-a-collect-statement-tf4235669.html#a12249025
>> >> >> >> >> Sent from the drools - user mailing list archive at
>> Nabble.com
>> .
>> >> >> >> >>
>> >> >> >> >> _______________________________________________
>> >> >> >> >> rules-users mailing list
>> >> >> >> >> rules-users at lists.jboss.org
>> >> >> >> >> https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> >> >>
>> >> >> >> >
>> >> >> >> >
>> >> >> >> >
>> >> >> >> > --
>> >> >> >> > Edson Tirelli
>> >> >> >> > Software Engineer - JBoss Rules Core Developer
>> >> >> >> > Office: +55 11 3529-6000
>> >> >> >> > Mobile: +55 11 9287-5646
>> >> >> >> > JBoss, a division of Red Hat @ www.jboss.com
>> >> >> >> >
>> >> >> >> > _______________________________________________
>> >> >> >> > rules-users mailing list
>> >> >> >> > rules-users at lists.jboss.org
>> >> >> >> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> >> >
>> >> >> >> >
>> >> >> >>
>> >> >> >> --
>> >> >> >> View this message in context:
>> >> >> >>
>> >> >>
>> >>
>> http://www.nabble.com/How-to-limit-results-from-a-collect-statement-tf4235669.html#a12270505
>> >> >> >> Sent from the drools - user mailing list archive at Nabble.com.
>> >> >> >>
>> >> >> >> _______________________________________________
>> >> >> >> rules-users mailing list
>> >> >> >> rules-users at lists.jboss.org
>> >> >> >> https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> >>
>> >> >> >
>> >> >> >
>> >> >> >
>> >> >> > --
>> >> >> > Edson Tirelli
>> >> >> > Software Engineer - JBoss Rules Core Developer
>> >> >> > Office: +55 11 3529-6000
>> >> >> > Mobile: +55 11 9287-5646
>> >> >> > JBoss, a division of Red Hat @ www.jboss.com
>> >> >> >
>> >> >> > _______________________________________________
>> >> >> > rules-users mailing list
>> >> >> > rules-users at lists.jboss.org
>> >> >> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >> >
>> >> >> >
>> >> >>
>> >> >> --
>> >> >> View this message in context:
>> >> >>
>> >>
>> http://www.nabble.com/How-to-limit-results-from-a-collect-statement-tf4235669.html#a12272536
>> >> >> Sent from the drools - user mailing list archive at Nabble.com.
>> >> >>
>> >> >> _______________________________________________
>> >> >> rules-users mailing list
>> >> >> rules-users at lists.jboss.org
>> >> >> https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >>
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> > Edson Tirelli
>> >> > Software Engineer - JBoss Rules Core Developer
>> >> > Office: +55 11 3529-6000
>> >> > Mobile: +55 11 9287-5646
>> >> > JBoss, a division of Red Hat @ www.jboss.com
>> >> >
>> >> > _______________________________________________
>> >> > rules-users mailing list
>> >> > rules-users at lists.jboss.org
>> >> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >> >
>> >> >
>> >>
>> >> --
>> >> View this message in context:
>> >>
>> http://www.nabble.com/How-to-limit-results-from-a-collect-statement-tf4235669.html#a12274411
>> >> Sent from the drools - user mailing list archive at Nabble.com.
>> >>
>> >> _______________________________________________
>> >> rules-users mailing list
>> >> rules-users at lists.jboss.org
>> >> https://lists.jboss.org/mailman/listinfo/rules-users
>> >>
>> >
>> >
>> >
>> > --
>> > Edson Tirelli
>> > Software Engineer - JBoss Rules Core Developer
>> > Office: +55 11 3529-6000
>> > Mobile: +55 11 9287-5646
>> > JBoss, a division of Red Hat @ www.jboss.com
>> >
>> > _______________________________________________
>> > rules-users mailing list
>> > rules-users at lists.jboss.org
>> > https://lists.jboss.org/mailman/listinfo/rules-users
>> >
>> >
>>
>> --
>> View this message in context:
>> http://www.nabble.com/How-to-limit-results-from-a-collect-statement-tf4235669.html#a12278683
>> Sent from the drools - user mailing list archive at Nabble.com.
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>
>
>
> --
> Edson Tirelli
> Software Engineer - JBoss Rules Core Developer
> Office: +55 11 3529-6000
> Mobile: +55 11 9287-5646
> JBoss, a division of Red Hat @ www.jboss.com
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
--
View this message in context: http://www.nabble.com/How-to-limit-results-from-a-collect-statement-tf4235669.html#a12294112
Sent from the drools - user mailing list archive at Nabble.com.
More information about the rules-users
mailing list