Please use the new "knowledge" API for compiling and building a knowledge (not: rule) base.

This bug has been fixed for 5.3.0. It is one of several that may occur when you use 5.2.0 and deviate from the constraint syntax as defined with 5.1.1.

-W


On 26 September 2011 22:51, matvey1414 <matvey1414@gmail.com> wrote:
Hi,

I am working with Drools to implement a high-profile rules-engine. I have
two rules defined. Clearly, only the first should fire, but both do. Here is
my DRL:


package com.sample

import com.sample.DroolsTest.Request;

rule "ExpensiveCanonShopper0"
when
       Request( attributeMap["camera0"] == "canon" &&
attributeMap["price0"] >= 500 )
then
       System.out.println("ExpensiveCanonShopper0");
end

rule "ExpensiveCanonShopper1"
when
       Request( attributeMap["camera1"] == "canon" &&
attributeMap["price1"] >= 500 )
then
       System.out.println("ExpensiveCanonShopper1");
end

And the Java class to execute it:

public class DroolsTest {

       @SuppressWarnings({ "rawtypes", "unchecked" })
       public static final void main(String[] args) {
               try {
                       //Loading the Rules
                       System.out.println("Loading rules");
                       RuleBase ruleBase = readRule();
                       StatelessSession workingMemory =
ruleBase.newStatelessSession();

                       System.out.println("Firing rules");

                       Map map = new HashMap();
                       map.put("camera0", "canon");
                       map.put("price0", 600);

                       Request request = new Request();
                       request.setAttributeMap(map);
                       workingMemory.execute(request);

               } catch (Throwable t) {
                       t.printStackTrace();
               }
       }

       /**
        * Please note that this is the “low level” rule assembly API.
        */
       private static RuleBase readRule() throws Exception {
               //read in the source
               Reader source = new FileReader(new File("drl",
"Generated.drl"));

               //optionally read in the DSL (if you are using it).
               //Reader dsl = new InputStreamReader(
DroolsTest.class.getResourceAsStream( “/mylang.dsl” ) );

               //Use package builder to build up a rule package.
               //An alternative lower level class called “DrlParser” can
also be used…

               PackageBuilder builder = new PackageBuilder();

               //this wil parse and compile in one step
               //NOTE: There are 2 methods here, the one argument one is
for normal DRL.
               builder.addPackageFromDrl( source );
               if (builder.hasErrors()) {
                       PackageBuilderErrors errors = builder.getErrors();
                       throw new RuntimeException("Error adding package to
builder: " + errors.toString());
               }

               //Use the following instead of above if you are using a DSL:
               //builder.addPackageFromDrl( source, dsl );

               //get the compiled package (which is serializable)
               Package pkg = builder.getPackage();

               //add the package to a rulebase (deploy the rule package).
               RuleBase ruleBase = RuleBaseFactory.newRuleBase();
               ruleBase.addPackage( pkg );
               return ruleBase;
       }

       public static class Request {
               private Map attributeMap;

               public Map getAttributeMap() {
                       return attributeMap;
               }

               public void setAttributeMap(Map attributeMap) {
                       this.attributeMap = attributeMap;
               }
       }
}

The output is this, meaning both rules fired:
Loading rules
Firing rules
ExpensiveCanonShopper1
ExpensiveCanonShopper0

I have two questions:

1. Is this a bug, or am I doing something wrong? Only
"ExpensiveCanonShopper0" should fire.

2. I am pretty sure this is somehow related to the fact that I'm using Map
attributes, and not POJO to get "price0" and "camera0". My issue is that I
won't know the parameters in advance (they are coming in a URL), so I can't
pre-declare them, and thus need something dynamic like a Map. Is this how
Drools is intended to be used? The documentation appears very POJO-centric.

I am using Drools 5.2

Thank you!
-Matt

--
View this message in context: http://drools.46999.n3.nabble.com/Unsatisfied-rule-fires-Drools-bug-tp3370653p3370653.html
Sent from the Drools: User forum mailing list archive at Nabble.com.

_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users