[rules-users] Unsatisfied rule fires - Drools bug?

Wolfgang Laun wolfgang.laun at gmail.com
Tue Sep 27 05:10:11 EDT 2011


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 at 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 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/20110927/aea6d2bb/attachment.html 


More information about the rules-users mailing list