[rules-users] Unsatisfied rule fires - Drools bug?
Wolfgang Laun
wolfgang.laun at gmail.com
Wed Sep 28 12:57:19 EDT 2011
2011/9/28 matvey1414 <matvey1414 at gmail.com>
> Hi,
>
> Thank you for your reply. I will use the Knowledge API going forward.
>
> Can you please explain what you mean by "deviate from the constraint syntax
> as defined with 5.1.1"? What's an example of 5.1.1 syntax,
>
For a complete picture, get the Expert manual of 5.1.1. Most constraint have
to be written as
<field> <comp-op> <value>
and there's a restrictive list of what is permitted as a <value>, e.g.
field == (one + 2) // parens are required
or
field > 42 // OK
and so on.
> and what's an example of a deviation?
>
For instance:
42 < field
or
field == one + 2
and so on.
HTH
-W
>
> -Matt
>
> On Tue, Sep 27, 2011 at 5:12 AM, laune [via Drools] <[hidden email]<http://user/SendEmail.jtp?type=node&node=3376645&i=0>
> > wrote:
>
>> 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 <[hidden email]<http://user/SendEmail.jtp?type=node&node=3372058&i=0>
>> > 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
>>> [hidden email] <http://user/SendEmail.jtp?type=node&node=3372058&i=1>
>>>
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>
>>
>> _______________________________________________
>> rules-users mailing list
>> [hidden email] <http://user/SendEmail.jtp?type=node&node=3372058&i=2>
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>> ------------------------------
>> If you reply to this email, your message will be added to the discussion
>> below:
>>
>> http://drools.46999.n3.nabble.com/Unsatisfied-rule-fires-Drools-bug-tp3370653p3372058.html
>> To unsubscribe from Unsatisfied rule fires - Drools bug?, click here.
>>
>
>
>
> --
> www.calcmachine.com - easy online calculator.
>
> ------------------------------
> View this message in context: Re: [rules-users] Unsatisfied rule fires -
> Drools bug?<http://drools.46999.n3.nabble.com/Unsatisfied-rule-fires-Drools-bug-tp3370653p3376645.html>
>
> Sent from the Drools: User forum mailing list archive<http://drools.46999.n3.nabble.com/Drools-User-forum-f47000.html>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/20110928/734725b4/attachment.html
More information about the rules-users
mailing list