[rules-users] Avoid propagation of update in a then block.
Patrik Dufresne
ikus060 at gmail.com
Tue Mar 13 18:20:59 EDT 2012
Hi Mike,
I see your point, it's very valid for the snippet rule, but can't be apply
to the real one since I need to run a function using eval().
Patrik Dufresne
On Tue, Mar 13, 2012 at 4:45 PM, Mike Melton <mike.melton at gmail.com> wrote:
> Let the rule engine do what it does best. You are fighting against the
> optimizations of the engine by trying to control the flow. You can rewrite
> your rule as
>
> rule "my-rule"
> when
> $entity : Entity( closed == false )
> then
> modify($entity) { setClosed(true); }
> end
>
> The rule will fire (once) for each Entity which matches the condition. I
> haven't taken the time to apply the same exercise to your more complex
> rule, but a general rule you should abide by is "No looping in the
> consequence unless I have a really good reason."
>
> Mike
>
>
> 2012/3/13 Patrik Dufresne <ikus060 at gmail.com>
>
>> Hi,
>>
>> I have some trouble to figure out how to stop / start the propagation of
>> updates within a Then block.
>> Here is a snippet to represent the problem I have.
>>
>> rule "my-rule"
>> when
>> $objects : List()
>> from accumulate( $entity : Entity(closed==false),
>> collectList($entity) )
>> then
>> for(Object obj : $objects) {
>> ((Entity) obj).setClosed(true);
>> update(obj);
>> }
>> end
>>
>> When this rule's consequence is called first, the first enity in the list
>> is 'update', but then update if propagated to immediately causing the rule
>> to be evaluated with all the entities minus the updated one. So I'm
>> wondering if there is a transaction like operation allowing me to update
>> all the entities in the list and then fire the rules.
>>
>> According to the documentation no-loop should have help me for this.
>>
>> Here is the original rules
>> rule "close-shift"
>> salience -1
>> when
>> $shift : Shift( )
>> $assignments : List( size > 0 )
>> from accumulate (
>> $assignment : PlanifEventAssignment(
>> close == false,
>> shift == $shift ),
>> collectList($assignment) )
>> $availables : List( size >= $assignments.size )
>> from accumulate ( ( and
>> ShiftAssignment(
>> shift == $shift,
>> $employee : employee)
>> $available : EmployeeAvailable (
>> employee == $employee,
>> assignment.shift == $shift) ),
>> collectList($available) )
>> eval( Dfs.search($assignments, $availables) != null )
>> then
>> // Recalculate the result.
>> Map table = Dfs.search($assignments, $availables);
>> for(Object entry : table.entrySet()) {
>> PlanifEventAssignment assignment =
>> (PlanifEventAssignment)((Entry)entry).getKey();
>> EmployeeValue employee = (EmployeeValue)((Entry)entry).getValue();
>> assignment.setClose(true);
>> assignment.setEmployee(employee);
>> update(assignment);
>> }
>> end
>>
>>
>> Patrik Dufresne
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20120313/2f1892a8/attachment.html
More information about the rules-users
mailing list