Mike,

May I ask you please to open a JIRA for that, attaching your sample code? Also, either assign the ticket for me or let me know the ticket number after you open it.

  I will take a detailed look.

  Thank you,
      Edson

Anstis, Michael (M.) wrote:

Hi Edson,

I've tested branch in SVN but have to report that the following does not
work as expected:-

** Java

Machine mt1=new Machine();
mt1.setDescription("Test Machine");
Attribute at1=new Attribute("TEST1", 5);
Attribute at2=new Attribute("TEST2", 25);
mt1.addAttribute(at1);  // <-- A machine contains an ArrayList of
Attributes
mt1.addAttribute(at2);  // <-- A machine contains an ArrayList of
Attributes
wm.assertObject(mt1);
wm.assertObject(at1);
wm.assertObject(at2);

** Rules

rule "Test 1a"                // <-- Works OK
when
        $m : Machine ( description == "Test Machine" )
then
        System.out.println("DEBUG---> Adding new Attribute(\"TEST3\") to
Machine");
        Attribute a = new Attribute("TEST3", 100);
        $m.addAttribute(a);
        assertLogical(a);
end

rule "Test 1b"                // <-- Does not activate
when
        $a : Attribute ( name == "TEST3" )
        $m : Machine ( attributesList contains $a )
then
        System.out.println("DEBUG---> Found machine with new
Attribute");
End

The following rule does however work which suggests a problem with
"contains"(?):-

rule "Test 1c"                // <-- Does activate
when
        $m : Machine ( description == "Test Machine" )
        $a1 : Attribute ( name == "TEST1", parent == $m )
        $a2 : Attribute ( name == "TEST2", parent == $m )
        $a3 : Attribute ( name == "TEST3", parent == $m )
then
        System.out.println("DEBUG---> " + $m.toString());
        System.out.println("DEBUG---> " + $a1.toString());
        System.out.println("DEBUG---> " + $a2.toString());
end

Also, the following type of syntax appears problematic:-

rule "Test 2"
when
        $m : Machine ( description == "Test Machine" )
        $a1 : Attribute ( name == "TEST1", parent == $m )
        $a2 : Attribute ( name == "TEST2", parent == $m )
then
        System.out.println("DEBUG---> " + $m.toString());
        System.out.println("DEBUG---> " + $a1.toString());
        System.out.println("DEBUG---> " + $a2.toString());
End

This particular example works OK (all facts asserted outside of rules)
however this (real life) example does not:-

rule "Material - Lock Pressure Modifier"
salience 849
when
        MaterialEntry ( $m : material )
        $a1 : Attribute ( name == Constants.ATTRIBUTES_PROCESS_TOTAL_XY,
$txy : number )
        $a2 : Attribute ( name ==
Constants.ATTRIBUTES_MATERIAL_LOCK_PRESSURE, $mlp : number, parent == $m
)
then
        Attribute a = new
Attribute(Constants.ATTRIBUTES_MATERIAL_LOCK_PRESSURE_MODIFIER, m);
        assertLogical(a);
        $m.addAttribute(a);
end

rule "Material - Clamping Force"
salience 848
when
        MaterialEntry ( $m : material )
        $a1 : Attribute( name == Constants.ATTRIBUTES_PROCESS_TOTAL_XY,
$txy : number )                                         // <-- Same as
above
        $a2 : Attribute( name ==
Constants.ATTRIBUTES_MATERIAL_LOCK_PRESSURE, $mlp : number, parent == $m
)                       // <-- Same as above
//(a)   $a3 : Attribute( name ==
Constants.ATTRIBUTES_MATERIAL_LOCK_PRESSURE_MODIFIER, $lpm : number,
parent == $m )  // <-- Asserted above
//(b)   $a3 : Attribute( name ==
Constants.ATTRIBUTES_MATERIAL_LOCK_PRESSURE_MODIFIER, $lpm : number )
then
        System.out.println("DEBUG--->" + $a2.getParent());
        System.out.println("DEBUG--->" + $a3.getParent());
end
If line "//(a)" is used the rule does not fire; if rule "//(b)" is used
instead (i.e. the RHS does not check the "parent" property) the rule
triggers. However the two debug lines show "$a2.getParent()" and
"$a3.getParent()" point to the same object - one "parent == $m" worked
the other (asserted by a rule) does not appear to work.
Thanks,

Mike

-----Original Message-----
From: Anstis, Michael (M.) Sent: 15 March 2007 12:34
To: 'Rules Users List'
Subject: RE: [rules-users] Shadow fact problem?

Hi Edson,

Don't worry Edson - you have enough to do to excuse missing a question.

I don't want to put the check into the consequence - oh no, but as given
by my examples the rule "A" never fires when its in the LHS. I wanted to
check my understanding that rule "A" should work the same as rule "B"
with the difference being that the condition is handled by the RETE
network and not some hacky code in the RHS. I am planning on checking
both in trunk tonight - unfortunately family matters mean I can't spend
too much time on the computer in the evenings and I was only able to
play with Maven last night.

Cheers,

Mike


-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Edson Tirelli
Sent: 15 March 2007 12:08
To: Rules Users List
Subject: Re: [rules-users] Shadow fact problem?


  Michael,

  Sorry, I missed your previous message... why are you moving the check

into the consequence? As you already realized, that is not a good solution...
  Did you tried your original rule in trunk? Bug is still there?

   []s
   Edson

Anstis, Michael (M.) wrote:

Sorry to push Edson,

The performance degradation from having the "parental check" in the RHS
versus the LHS is (expectedly) terrific. We have thousands of
"attributes" relating to different parent objects and having the rule
activate for every combination is causing performance problems. Moving
the RHS into a LHS "eval" would be no better either.

On a different matter, I have successfully installed the source with
Maven (thanks Mark) and can debug trunk in Eclipse at home!

With kind regards,

Mike

-----Original Message-----
From: Anstis, Michael (M.) Sent: 14 March 2007 12:28
To: 'Rules Users List'
Subject: RE: [rules-users] Shadow fact problem?

OK, Edson, I will try to check it out (I'm having problems accessing
subversion from work so will try from home).

Whilst trying to implement a workaround though I may have discovered
another problem (which might have been fixed too):-

rule "A"
when
        MaterialEntry ( $m : material )
        $a2 : Attribute( name ==
Constants.ATTRIBUTES_MATERIAL_LOCK_PRESSURE, $mlp : number, parent ==
$m
)
        $a3 : Attribute( name ==
Constants.ATTRIBUTES_MATERIAL_LOCK_PRESSURE_MODIFIER, $lpm : number,
parent == $m )
then
        System.out.println("Rule A"); //<-- Never fires
end

rule "B"
when
        MaterialEntry ( $m : material )
        $a2 : Attribute( name ==
Constants.ATTRIBUTES_MATERIAL_LOCK_PRESSURE, $mlp : number )
        $a3 : Attribute( name ==
Constants.ATTRIBUTES_MATERIAL_LOCK_PRESSURE_MODIFIER, $lpm : number )
Then
        if($a2.getParent() == $m && $a3.getParent() == $m) {
                System.out.println("Rule B"); //<-- Fires
        }
end

If the check for "parent" being equal across $m, $a2 and $a3 is in the
LHS the rule doesn't activate. However if check is in the RHS the rule
is OK.

Any thoughts or views (Edson)?

Thanks,

Mike
-----Original Message-----
From: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] On Behalf Of Edson Tirelli
Sent: 13 March 2007 22:57
To: Rules Users List
Subject: Re: [rules-users] Shadow fact problem?


 Mike,

Yes, that is a "shadow fact unwanted side-effect" (nice name for a bug hm? :) ), but I remember fixing something similar as part of
another
ticket I was working on. Is it possible for you to verify if the
problem
is happening in trunk?
 If it is still hapenning, let me know and I will fix it.

 Thank you,
     Edson

Anstis, Michael (M.) wrote:



Hi,

I am running 3.1-M1 and have (by way of example) two simple rules; A and B as follows:-

    *rule* "A"
    *when*
            $a1 : Attribute ( name == Constants.ATTRIBUTES_A, $pa :
    number )
            $a2 : Attribute ( name == Constants.ATTRIBUTES_B, $nc :
    number )
            $p : Process ( attributesList* contains* $a1,
    attributesList* contains* $a2 )
    *then*
           * double* txy = doSomeMaths($pa, $nc, $p);
            Attribute a =* new* Attribute(Constants.ATTRIBUTES_C,
txy);


            $p.addAttribute(a);
           * assertLogical*(a);
           * modify*($p);
            System.out.println("Rule 'A' fired");
    *end*
*rule* "B"
    *when*
            $a1 : Attribute ( name == Constants.ATTRIBUTES_C, $txy :
    number)
$p : Process( attributesList* contains* $a1 ) // <-- Line causing rule not to activate

    *then*
           * double* m = doSomeMoreMaths($txy, $p);
            System.out.println("Rule 'B' fired");
    *end*

Process exposes an ArrayList of Attribute objects (each having a name\value pair).

When the content of the ArrayList held by Process is added to (Rule 'A') the next rule (Rule 'B') is not being activated.

Can anybody provide any insight into how best a workaround can be engineered?

With kind regards,

Mike

----------------------------------------------------------------------
-
-


_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users








--
Edson Tirelli
Software Engineer - JBoss Rules Core Developer
Office: +55 11 3124-6000
Mobile: +55 11 9218-4151
JBoss, a division of Red Hat @ www.jboss.com


_______________________________________________
rules-users mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to