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(a)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(a)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(a)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(a)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(a)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-tf423...
>> >> >> Sent from the drools - user mailing list archive at
Nabble.com.
>> >> >>
>> >> >> _______________________________________________
>> >> >> rules-users mailing list
>> >> >> rules-users(a)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(a)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-tf423...
>> >> Sent from the drools - user mailing list archive at
Nabble.com.
>> >>
>> >> _______________________________________________
>> >> rules-users mailing list
>> >> rules-users(a)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(a)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-tf423...
>> Sent from the drools - user mailing list archive at
Nabble.com.
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users(a)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(a)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-tf423...
Sent from the drools - user mailing list archive at
Nabble.com.
_______________________________________________
rules-users mailing list
rules-users(a)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 @