[rules-users] Drools + EMF + CDO

Wolfgang Laun wolfgang.laun at gmail.com
Mon Aug 2 08:10:44 EDT 2010


I can only say that I tested your (original) rule, and here I need the
 modify( $parent ){}
in the rule where I change the children's states.

However, not selecting the "DOWN" state in the first forall pattern
does *not* require this additional modify:

rule allChidrenDown
when
    $parent : Device ( $children : eContents, eContents.size > 0 )
    forall ( $child : Device ( ) from $children
             Device( this == $child,state == "DOWN" ) )
then
    System.out.println( $parent.getId() + ": all down" );
end

Note the difference: This version says
   for all Device objects [that are children]:
       state == "DOWN"
Whereas the original version says
   for all Device objects with state =="DOWN" [that are children]:
       true
which is something different.

In any case, you are better off without having to use from.

If you aren't scared by a little math notation, have a look at
 http://www.jessrules.com/jess/docs/PropPred.pdf
Even though this uses a different rule notation, it might help.

-W


2010/8/2 Georg Maier <Georg.Maier at cjt.de>

>  Wolfgang,
>
>
>
> thank you so much for your remarks! It’s really interesting:
>
>
>
> -          I tried the approach to update the parent whenever a child is
> modified before – without any success
>
> -          Now I changed my rule to your (definitely much better)
> suggestion – and it works!
>
>
>
> So despite of the fact that I’m really happy to have this one solved I
> would really be interested in what the problem with the forall is.
>
> Is it possible that a forall statement creates some kind of copy or
> “summary” of the facts to be evaluated and is checked only once? Like an
> eval statement?
>
>
>
> Anyways – thank you so much for your help!
>
>
>
> Best regards
>
>
>
> Georg
>
>
>
>
>
> *Von:* rules-users-bounces at lists.jboss.org [mailto:
> rules-users-bounces at lists.jboss.org] *Im Auftrag von *Wolfgang Laun
> *Gesendet:* Montag, 2. August 2010 12:15
> *An:* Rules Users List
> *Betreff:* Re: [rules-users] Drools + EMF + CDO
>
>
>
> Several remarks:
> (1) Make sure that a parent is asserted after all of its children.
> Otherwise initial evaluation will not comprise the entire children's list.
> (2) After changing a child's state, update the parent.
> (3) The rule as you have it now is somewhat circumstantial. A simpler
> approach would be
>
> rule NoUpChild
> when
>     $p : Device(  $children : eContents, eContents.size > 0 )
>     not( Device( state == "UP" ) from $children )
> then
>     System.out.println( $p.getId() + ": no child up" );
> end
>
> (4) If you have a "parent" field, this could even be written:
>
> rule NoUpChild
> when
>     $p : Device(   children.size > 0 )
>     not( Device( parent == $p, state == "UP" ) )
> then
>     System.out.println( $p.getId() + ": no child up" );
> end
>
> -W
>
>
>  2010/8/2 Georg Maier <Georg.Maier at cjt.de>
>
> Hi,
>
>
>
> I’m trying to figure out an issue for three days now and I’m getting kind
> of desperate, so I hope someone can help.
>
> I’m using Drools in combination with an EMF model which is modeling a
> computer network. On init, I read the whole structure of the model and
> insert all elements into the working memory. Some of the entities share the
> super class “Device” which has an attribute “state”.
>
>
>
> Now I’m having the following rule to change an attribute of one of the
> model entities:
>
>
>
> *rule* "Set received status to model"
>
>       *when*
>
>             $event : SomeEvent (
>
>                   $hostname : hostname,
>
>                   $hoststate : hoststate,
>
>                   $timestamp : timestamp
>
>             )
>
>
>
>             $device : Device (
>
>                   name == $hostname
>
>             )
>
>
>
>       *then*
>
>             *modify*($device) {
>
>                   setState($hoststate);
>
>             }
>
>             db.commit(*false*);
>
>
>
>             *retract*($event);
>
>             System.err.println("Set status of " + $device + " to " +
> $hoststate);
>
> *end*
>
>
>
> … which works perfectly fine. Anyway, what I want to do in this test case
> is to *react whenever all child devices of a mutual parent device* (e.g.
> hosts on one switch) are no longer reachable. I thought of a rule like the
> following:
>
>
>
> *rule* "Parent Children Test"
>
>       *when*
>
>             $parent : Device (
>
>                   $children : eContents,
>
>                   eContents.size > 0
>
>             )
>
>
>
>             *forall* (
>
>                   $child : Device (
>
>                         state == "DOWN"
>
>                   ) *from* $children
>
>             )
>
>
>
>       *then*
>
>>
> *end*
>
> * *
>
> … which by the way worked perfectly fine as long as I was not using objects
> from a model. My first idea was that for some strange reason the object
> might get copied so that I actually would have two different references
> after modifying it, but this is not the case. When I initialize the rule
> base with the circumstances that the second rule would fire, it really does.
> It just seems as it would not being evaluated after changing the attribute,
> but this is not the case either! So all I can think of is some strange
> caching, maybe in combination with the *forall *statement? Maybe someone
> has some experience when using Drools with EMF + CDO and experienced as
> similar issue?
>
> Any help would be very very very much appreciated!
>
> Thanks in advance
>
>
>
> Georg
>
>
> _______________________________________________
> 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/20100802/29f1d4c4/attachment.html 


More information about the rules-users mailing list