[rules-users] From v 3.0.6 to 4.0.0

Edson Tirelli tirelli at post.com
Tue May 15 08:35:39 EDT 2007


   Chris

   Version 3.0.x prevents by default a single fact from matching multiple
patterns. For a couple of reasons we had to change the default in 4.0 to
allow a single fact to match multiple patterns. If you don't want this to
happen, you can use one of the following approaches:

* Change the behavior for the whole rulebase. You can do that by either
setting a system property ("drools.removeIdentities=true") or creating a
RuleBaseConfiguration instance:

RuleBaseConfiguration conf = new RuleBaseConfiguration();
conf.setRemoveIdentities( true );
RuleBase rulebase = new ReteooRuleBase( conf );

* Alternativelly, you can manually add a constraint to avoid the behavior
for specific rules, using the "this" keyword.

rule "TwoCheeses"
    when
        $cheese1 : Cheese();
        $cheese2 : Cheese( this != $cheese1 );
    then
        System.out.println($cheese1);
        System.out.println($cheese2);
        System.out.println("TwoCheeses");
end


    We will add such information to the documentation, but the above shall
give you the idea.

    Hope it helps,
      Edson

2007/5/15, Chris Woodrow <woodrow.chris at gmail.com>:
>
> Hi everyone,
> I am new to this mailing list, I've had a quick look at archives and
> didn't find anything ont this subject but sorry if this has allready been
> underlined.
>
> Here is my problem, while I was doing some test on v3.0.6, 4.0.0 came out,
> so I started to migrate on the new version. Then I found out an unexpecteed
> behavior on the 4.0.0.
>
> I have been compiling both with Java 5 and running whith Java 1.5.0_11.
> And I used versions with dependencies on both tests.
>
> I have made an exemple for you to make it as clear as possible, here is
> the rule :
>
>
> ---------------------------------------------------------------------------------------
> package rules
>
> rule "TwoCheeses"
>     when
>         $cheese1 : Cheese();
>         $cheese2 : Cheese();
>     then
>         System.out.println($cheese1);
>         System.out.println($cheese2);
>         System.out.println("TwoCheeses");
> end
>
> ---------------------------------------------------------------------------------------
>
> When I run it on V3.0.6, with this code :
>
> ---------------------------------------------------------------------------------------
>
> package rules;
>
> import java.io.InputStreamReader;
>
> import org.drools.RuleBase;
> import org.drools.RuleBaseFactory;
> import org.drools.WorkingMemory;
> import org.drools.compiler.PackageBuilder;
>
> public class Cheese {
>     public static void main(String[] args) throws Exception{
>         PackageBuilder builder = new PackageBuilder();
>         builder.addPackageFromDrl(new InputStreamReader(
> Cheese.class.getResourceAsStream ("rule.drl")));
>
>         RuleBase ruleBase = RuleBaseFactory.newRuleBase();
>
>         ruleBase.addPackage(builder.getPackage());
>
>         WorkingMemory workingMemory = ruleBase.newWorkingMemory ();
>
>         Cheese cheese = new Cheese();
>
>         workingMemory.assertObject(cheese);
>
>         workingMemory.fireAllRules();
>     }
> }
> ---------------------------------------------------------------------------------------
>
>
> The rule doesn't fire, which is normal AMHA since only one Cheese object
> is asserted to the WM
>
> When I run it on V4.0.0, whith this code :
> ---------------------------------------------------------------------------------------
>
> package rules;
>
> import java.io.InputStreamReader;
>
> import org.drools.RuleBase;
> import org.drools.RuleBaseFactory;
> import org.drools.StatefulSession;
> import org.drools.compiler.PackageBuilder;
>
> public class Cheese {
>     public static void main(String[] args) throws Exception{
>         PackageBuilder builder = new PackageBuilder();
>         builder.addPackageFromDrl(new InputStreamReader(
> Cheese.class.getResourceAsStream ("rule.drl")));
>
>         RuleBase ruleBase = RuleBaseFactory.newRuleBase();
>
>         ruleBase.addPackage(builder.getPackage());
>
>         StatefulSession statefulSession = ruleBase.newStatefulSession();
>
>         Cheese cheese = new Cheese();
>
>         statefulSession.assertObject(cheese);
>
>         statefulSession.fireAllRules();
>     }
> }
> ---------------------------------------------------------------------------------------
>
> Now the rule fires and $cheese1 $cheese2 have the same reference.
>
> I have been searching in all docs, this modification of behavior doesn't
> seem to be expected, has anyone noticed this?
>
> Thanks for your help.
>
> Chris
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20070515/063a1664/attachment.html 


More information about the rules-users mailing list