[rules-users] Synch Business Object / Working Memory

Anstis, Michael (M.) manstis1 at ford.com
Fri Apr 11 10:57:03 EDT 2008


I am confident Drools supports what you are looking for; did you try
update() - or modify() - in the "then" part of the rule (and not in Java as
you code snippet)?
 
Can you explain more the need for the "computed" flag on the fact? Is the
value of a property set sometimes whilst calculated at other times?
 
Stick with both Drools and the group - we'll get you to where you want to
be.


  _____  

From: rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Jonathan
Guéhenneux
Sent: 11 April 2008 15:41
To: Rules Users List
Subject: RE: [rules-users] Synch Business Object / Working Memory


First, thank you for yours answers which are very clear. Your solution will
probably work. I'm just desapointed that there is no way to synchronized the
shadow with the object. That would be great for my work.



  _____  

Subject: RE: [rules-users] Synch Business Object / Working Memory
Date: Fri, 11 Apr 2008 14:57:52 +0100
From: manstis1 at ford.com
To: rules-users at lists.jboss.org


Do you need ruleflow? Perhaps this is too simple and I misunderstood.
 
package com.sample;
 
public class Test {
 
    private Integer a;
    private Integer b;
    private Integer c;
 
    public Integer getA() {
        return a;
    }
 
    public Integer getB() {
        return b;
    }
 
    public Integer getC() {
        return c;
    }
 
    public void setA(Integer a) {
        this.a = a;
    }
 
    public void setB(Integer b) {
        this.b = b;
    }
 
    public void setC(Integer c) {
        this.c = c;
    }
 
}
 
package com.sample
 
import com.sample.Test
 
rule "rule 1"
    salience 90
    when
        a : Test( a != null, b == null )
    then
     System.out.println("setting b to 10");
        a.setB(10);
        update(a);
end
 
rule "rule 2"
    salience 80
    when
        a : Test( b : b != null, c == null )
    then
     System.out.println("setting c to b x 5");
        a.setC(b * 5);
        update(a);
end
 
rule "rule 3"
    salience 70
    when
        a : Test( c != null )
    then
     System.out.println("c = " + a.getC());
end

 


  _____  

From: rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Jonathan
Guéhenneux
Sent: 11 April 2008 13:23
To: Rules Users List
Subject: RE: [rules-users] Synch Business Object / Working Memory


Indeed, it works but I will have to use such booleans for a lot of rules.

Cause my rule flow is schematically :

compute A
compute B(A)
compute C(B)
...

Perhaps I may create several ruleflows, one per independant computing?



  _____  

Subject: RE: [rules-users] Synch Business Object / Working Memory
Date: Fri, 11 Apr 2008 12:11:32 +0100
From: manstis1 at ford.com
To: rules-users at lists.jboss.org


I was thinking something more like this:-
 
package com.sample

import com.sample.Test
 
rule "rule 1 - 1"
    salience 90
    when
        a : Test(
         computed == "false",
            c < 15,
            d >= 75)        
    then
     System.out.println("setting e to 0");
        a.setE(0);
        update(a);
end

 

rule "rule 1 - 2"
    salience 10
    when
        a : Test(
            computed == "false",
            c < 15,
            d >= 75)        
    then
     System.out.println("setting e to 1");
        a.setE(1);
end


Note rule "rule 1 - 2" deliberately uses the same patterns as rule "rule 1 -
1".

 
package com.sample;
 
public class Test {
    
    private boolean computed =false;
    private int c=0;
    private int d=80;
    private int e;
 
    public String getComputed(){
       if(computed)
          return "true";
       else
          return "false";
    }
 
    public int getC() {
        return c;
    }
 
    public int getD() {
        return d;
    }
 
    public void setE(int e){
        this.e = e;
        computed = true;
    }
 
}

Rule "rule 1 - 1" is the only rule to run (and runs once); the second
activatino being cancelled due to the update to "computed". Here's the audit
view:-
 
<object-stream>
  <list>
    <org.drools.audit.event.ActivationLogEvent>
      <activationId>rule 1 - 1 [1]</activationId>
      <rule>rule 1 - 1</rule>
      <declarations>a=com.sample.Test at 67126712(1)</declarations>
      <type>4</type>
    </org.drools.audit.event.ActivationLogEvent>
    <org.drools.audit.event.ActivationLogEvent>
      <activationId>rule 1 - 2 [1]</activationId>
      <rule>rule 1 - 2</rule>
      <declarations>a=com.sample.Test at 67126712(1)</declarations>
      <type>4</type>
    </org.drools.audit.event.ActivationLogEvent>
    <org.drools.audit.event.ObjectLogEvent>
      <factId>1</factId>
      <objectToString>com.sample.Test at 67126712</objectToString>
      <type>1</type>
    </org.drools.audit.event.ObjectLogEvent>
    <org.drools.audit.event.ActivationLogEvent>
      <activationId>rule 1 - 1 [1]</activationId>
      <rule>rule 1 - 1</rule>
      <declarations>a=com.sample.Test at 67126712(1)</declarations>
      <type>6</type>
    </org.drools.audit.event.ActivationLogEvent>
    <org.drools.audit.event.ActivationLogEvent>
      <activationId>rule 1 - 2 [1]</activationId>
      <rule>rule 1 - 2</rule>
      <declarations>a=com.sample.Test at 67126712(1)</declarations>
      <type>5</type>
    </org.drools.audit.event.ActivationLogEvent>
    <org.drools.audit.event.ObjectLogEvent>
      <factId>1</factId>
      <objectToString>com.sample.Test at 67126712</objectToString>
      <type>2</type>
    </org.drools.audit.event.ObjectLogEvent>
    <org.drools.audit.event.ActivationLogEvent>
      <activationId>rule 1 - 1 [1]</activationId>
      <rule>rule 1 - 1</rule>
      <declarations>a=com.sample.Test at 67126712(1)</declarations>
      <type>7</type>
    </org.drools.audit.event.ActivationLogEvent>
  </list>
</object-stream> 
 


  _____  

From: rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Jonathan
Guéhenneux
Sent: 11 April 2008 11:33
To: Rules Users List
Subject: RE: [rules-users] Synch Business Object / Working Memory


Ok, I think I understood well. I modified my business code, now I call if

(wm != null)
            wm.update(wm.getFactHandle(this), this);

each time a properties is modified.

But it is worse. Rules that sould be activated only once actually loop, even
if I add the no-loop clause.

I understand why they loop, assuming update = (rectact + insert), but I dont
get a solution to my problem. I just want to notify an object changement in
order to read again the properties, but I dont want to restart the ruleflow.

Sorry, but I find hard to say it in english because even in french, it's not
very clear ;)


  _____  

Subject: RE: [rules-users] Synch Business Object / Working Memory
Date: Fri, 11 Apr 2008 10:39:41 +0100
From: manstis1 at ford.com
To: rules-users at lists.jboss.org


In essence, yes. Have a look at "update" in the manual (and a read on Shadow
Facts will probably be useful too).


  _____  

From: rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Jonathan
Guéhenneux
Sent: 11 April 2008 10:24
To: Rules Users List
Subject: RE: [rules-users] Synch Business Object / Working Memory


yes, i made a mistake. its a.setE(...) and not c.setE(...).

I don't call update. If I dont call update, properties of an object are just
read one time for all rules?




  _____  

Subject: RE: [rules-users] Synch Business Object / Working Memory
Date: Fri, 11 Apr 2008 09:47:43 +0100
From: manstis1 at ford.com
To: rules-users at lists.jboss.org


I guess the example is a simplification as "c" (in RHS) has not been bound
to a fact.
 
Anyway, that aside, do you call "update" to ensure WM knows of changes to
facts otherwise properties need to be "time-constant" which in your example
they are not.


  _____  

From: rules-users-bounces at lists.jboss.org
[mailto:rules-users-bounces at lists.jboss.org] On Behalf Of Jonathan
Guéhenneux
Sent: 11 April 2008 09:34
To: Rules Users List
Subject: [rules-users] Synch Business Object / Working Memory


Hi,

I have two rules :

rule "rule 1 - 1"
    
    salience 90
    ruleflow-group "rfg1"
    when
        a : A(
            eComputed == "false",
            c < 15,
            d >= 75)        
    then
        c.setE(0);
end



rule "rule 1 - 2"

    salience 10
    ruleflow-group "rfg1"
    when
        a : A(
            eComputed == "false",
            c >= 15,
            d >= 75)        
    then
        c.setE(1);
end



and part of the corresponding business code :

public class A {

    ...

    public String getEComputed(){
       if(eComputed)
          return "true";
       else
          return "false";
    }

    ...

    public void setE(int e){
        this.e = e;
        eComputed = true;
    }

    ...

}



so, I expected that if the first rule is activated, the second won't be. But
according to my tests, the two rule can be fired on the same object A.
While debugging, I noticed the getEComputed method was only called once. I
suppose that I should write this :


rule "rule 1 - 1"
    
    salience 90
    ruleflow-group "rfg1"
    when
        a : A(
            eComputed == "false",
            c < 15,
            d >= 75)        
    then
        c.setE(0);
        c.setEComputed("true);
end



rule "rule 1 - 2"

    salience 10
    ruleflow-group "rfg1"
    when
        a : A(
            eComputed == "false",
            c >= 15,
            d >= 75)        
    then
        c.setE(1);
        c.setEComputed("true);
end

But I would prefer another solution. Thanks for help.


  _____  

Plus de 15 millions de français utilisent Windows Live Messenger !
Téléchargez Messenger, c'est gratuit !
<http://www.windowslive.fr/messenger/>  


  _____  

Plus de 15 millions de français utilisent Windows Live Messenger !
Téléchargez Messenger, c'est gratuit !
<http://www.windowslive.fr/messenger/>  


  _____  

Tous vos amis discutent sur Messenger, et vous ? Téléchargez
<http://www.windowslive.fr/messenger/> Messenger, c'est gratuit ! 


  _____  

Tous vos amis discutent sur Messenger, et vous ? Téléchargez
<http://www.windowslive.fr/messenger/> Messenger, c'est gratuit ! 


  _____  

Discutez gratuitement avec vos amis en vidéo ! Téléchargez Messenger,
<http://www.windowslive.fr/messenger/> c'est gratuit ! 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20080411/a1036704/attachment.html 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 7206 bytes
Desc: not available
Url : http://lists.jboss.org/pipermail/rules-users/attachments/20080411/a1036704/attachment.bin 


More information about the rules-users mailing list