[rules-users] Inheritance-Like Design Question

Edson Tirelli ed.tirelli at gmail.com
Fri Mar 5 17:06:16 EST 2010


   :) I do believe you are seeing this errors, but I have no idea why. I
just created a new drools project in my eclipse environment, set the target
runtime to Drools 5.0.1, and copy and pasted your rules bellow. I executed a
the rules and I got the correct results:

----------
Rule Definitions TermContractions 1.1 Executed
----------

   I have no error in my eclipse either, so I guess you have some other
problem (maybe in your environment) going on there...

   Edson


2010/3/5 Moe Alkhafaji <moe.alkhafaji at medcpu.com>

> Thanks Edson. I wish I can send a screen shot, but I just had a bunch of
> white lines in the file on top of this. I removed all the bad lines, and
> simplified the rule to isolate any potential problem outside of this. Here
> is the simplified version (entire content of the rule file):
>
> #created on: Jun 23, 2009
> package com.medcpu.eephratobmain
>
>
> rule "Definitions TermContractions 1.1"
>     when
>         eval(1 == 1)
>     then
>         System.out.println("Rule Definitions TermContractions 1.1
> Executed");
>
> end
>
> rule "TermContractions 2.8" extends "Definitions TermContractions
> 1.1"             <=== Line 11
>     when
>         eval(2 == 3)
>     then
>         System.out.println("Rule TermContractions 2.8 Executed");
> end
>
> And here are the errors again:
>
>
> nds.when cannot be resolved to a
> type                                                   MPU/src/rules
> EEphratOBMain.drl    line 11
> Syntax error on token ""Definitions TermContractions 1.1"", . expected
> MPU/src/rules    EEphratOBMain.drl    line 11
> Syntax error on token "then", invalid
> AssignmentOperator                        MPU/src/rules
> EEphratOBMain.drl    line 11
> Syntax error, insert ";" to complete
> BlockStatements                              MPU/src/rules
> EEphratOBMain.drl    line 11
> The left-hand side of an assignment must be a
> variable                            MPU/src/rules    EEphratOBMain.drl
> line 11
> unknown:11:28 mismatched token: [@42,260:266='extends',<7>,11:28];
> expecting type THEN    MPU/src/rules    EEphratOBMain.drl
>
>
> 2010/3/5 Edson Tirelli <ed.tirelli at gmail.com>
>
>>
>>    These error messages don't make much sense to me, but it is accusing
>> error on line 19 now... considering that I removed lines and the error
>> before was on line 11, isn't this another problems in rules down in the
>> file?
>>
>>
>>    Edson
>>
>> 2010/3/5 Moe Alkhafaji <moe.alkhafaji at medcpu.com>
>>
>>> Thanks Edson,
>>>
>>> I tried using the rules you pasted below, and here are the errors again
>>> (same line)
>>>
>>>
>>> nds.when cannot be resolved to a
>>> type                                                  MPU/src/rules
>>> EEphratOBMain.drl    line 19
>>> Syntax error on token ""Definitions TermContractions 1.1"", . expected
>>> MPU/src/rules    EEphratOBMain.drl    line 19
>>> Syntax error on token "then", invalid
>>> AssignmentOperator                       MPU/src/rules
>>> EEphratOBMain.drl    line 19
>>> Syntax error, insert ";" to complete
>>> BlockStatements                             MPU/src/rules
>>> EEphratOBMain.drl    line 19
>>> The left-hand side of an assignment must be a
>>> variable                           MPU/src/rules    EEphratOBMain.drl
>>> line 19
>>> unknown:19:28 mismatched token: [@134,611:617='extends',<7>,19:28];
>>> expecting type THEN    MPU/src/rules    EEphratOBMain.drl
>>>
>>>
>>> I also understand about what you saying regarding additional things I
>>> have to do to ensure that only the child rule executes, but I want to go
>>> through the first step first :) Thanks!
>>>
>>>
>>> 2010/3/5 Edson Tirelli <ed.tirelli at gmail.com>
>>>
>>>>
>>>>    Hmmm, you should be receiving a duplicate variable declaration
>>>> error... would you please open a JIRA for us to double check what is
>>>> happening and fix the error message?
>>>>
>>>>    Meanwhile, try without repeating the constraints on the parent rule
>>>> in the child rule:
>>>>
>>>>
>>>> rule "Definitions TermContractions 1.1"
>>>>     when
>>>>         mpr : MPUFacade()
>>>>
>>>> eval(!mpr.isImportant(Constants.FINDING_KEYWORD_Contractions_Frequency))
>>>>     then
>>>>         mpr.print("Rule Definitions TermContractions 1.1 Executed");
>>>> end
>>>>
>>>> rule "TermContractions 2.8" extends "Definitions TermContractions
>>>> 1.1"
>>>>      when
>>>>
>>>>         eval(!mpr.isImportant(Constants.FINDING_KEYWORD_TEST))
>>>>     then
>>>>         mpr.print("Rule TermContractions 2.8 Executed");
>>>> end
>>>>
>>>>     Also, remember that unless you use some of the tricks I mentioned
>>>> before, both rules will fire.
>>>>
>>>>    []s
>>>>    Edson
>>>>
>>>>
>>>> 2010/3/5 Moe Alkhafaji <moe.alkhafaji at medcpu.com>
>>>>
>>>> Here are the rules that I created (sorry for breaking that in multiple
>>>>> emails), I hope this is all the information needed:
>>>>>
>>>>> rule "Definitions TermContractions 1.1"
>>>>>     when
>>>>>         mpr : MPUFacade()
>>>>>
>>>>> eval(!mpr.isImportant(Constants.FINDING_KEYWORD_Contractions_Frequency))
>>>>>     then
>>>>>         mpr.print("Rule Definitions TermContractions 1.1 Executed");
>>>>>
>>>>> end
>>>>>
>>>>> rule "TermContractions 2.8" extends "Definitions TermContractions
>>>>> 1.1"                  <=== Line 11
>>>>>     when
>>>>>         mpr : MPUFacade()
>>>>>
>>>>> eval(!mpr.isImportant(Constants.FINDING_KEYWORD_Contractions_Frequency))
>>>>>         eval(!mpr.isImportant(Constants.FINDING_KEYWORD_TEST))
>>>>>     then
>>>>>         mpr.print("Rule TermContractions 2.8 Executed");
>>>>> end
>>>>>
>>>>>
>>>>> On Fri, Mar 5, 2010 at 12:33 PM, Moe Alkhafaji <
>>>>> moe.alkhafaji at medcpu.com> wrote:
>>>>>
>>>>>> Specifically speaking, here is what I get on Eclipse when I do that:
>>>>>>
>>>>>>
>>>>>> nds.when cannot be resolved to a
>>>>>> type                                                 MPU/src/rules
>>>>>> EEphratOBMain.drl    line 11
>>>>>> Syntax error on token ":", ;
>>>>>> expected                                                    MPU/src/rules
>>>>>> EEphratOBMain.drl    line 11
>>>>>> Syntax error on token ""Definitions TermContractions 1.1"", .
>>>>>> expected    MPU/src/rules    EEphratOBMain.drl    line 11
>>>>>> Syntax error on token "then", invalid
>>>>>> AssignmentOperator                       MPU/src/rules
>>>>>> EEphratOBMain.drl    line 11
>>>>>> Syntax error, insert ";" to complete
>>>>>> Statement                                       MPU/src/rules
>>>>>> EEphratOBMain.drl    line 11
>>>>>> Syntax error, insert ";" to complete
>>>>>> Statement                                       MPU/src/rules
>>>>>> EEphratOBMain.drl    line 11
>>>>>> Syntax error, insert ";" to complete
>>>>>> Statement                                       MPU/src/rules
>>>>>> EEphratOBMain.drl    line 11
>>>>>>
>>>>>> Line 11 is:
>>>>>>
>>>>>> * rule "TermContractions 2.8" extends "Definitions TermContractions
>>>>>> 1.1"*
>>>>>>
>>>>>> and "Definitions TermContractions 1.1" is another rule defined in the
>>>>>> same drl.
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Fri, Mar 5, 2010 at 12:04 PM, Moe Alkhafaji <
>>>>>> moe.alkhafaji at medcpu.com> wrote:
>>>>>>
>>>>>>> Thanks Edson, I will try that. However, I have one follow up
>>>>>>> question. I tried to use the "extends" command and it did not work (it gave
>>>>>>> me a syntax error). I am using the latest Drools 5.0 M1. Could it be because
>>>>>>> the Eclipse Drools plugin does not support this feature yet and if I ignore
>>>>>>> this error on Eclipse it would still work at runtime?
>>>>>>>
>>>>>>> Thanks!
>>>>>>>
>>>>>>> 2010/3/5 Edson Tirelli <ed.tirelli at gmail.com>
>>>>>>>
>>>>>>>
>>>>>>>>       Although I noticed the other day that this is not documented
>>>>>>>> yet, Drools 5.0.x does support rule inheritance. In your case, it would be
>>>>>>>> written as:
>>>>>>>>
>>>>>>>> rule r1
>>>>>>>> when
>>>>>>>>    A()
>>>>>>>> then
>>>>>>>>    // do something
>>>>>>>> end
>>>>>>>>
>>>>>>>> rule r2 extends r1
>>>>>>>> when
>>>>>>>>    B()
>>>>>>>> then
>>>>>>>>    // do something else
>>>>>>>> end
>>>>>>>>
>>>>>>>>     When using inheritance, the subrule will inherit the whole LHS
>>>>>>>> of the parent rule.
>>>>>>>>
>>>>>>>>     Integration test here:
>>>>>>>>
>>>>>>>>
>>>>>>>> http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/extend_rule_test.drl
>>>>>>>>
>>>>>>>> http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_RuleExtend.drl
>>>>>>>>
>>>>>>>>     In your case, you have an extra requirement that if a child rule
>>>>>>>> fires, you don't want the parent rule to fire. My suggestion is either doing
>>>>>>>> this with a logical condition, or adding drools.halt() on the consequence of
>>>>>>>> rules that should stop subsequent firings, or using activation-groups +
>>>>>>>> salience. Example, in the above case, you could have:
>>>>>>>>
>>>>>>>> rule r1
>>>>>>>>    activation-group "example rules"
>>>>>>>>    salience 10
>>>>>>>> when
>>>>>>>>    A()
>>>>>>>> then
>>>>>>>>    // do something
>>>>>>>> end
>>>>>>>>
>>>>>>>> rule r2 extends r1
>>>>>>>>    activation-group "example rules"
>>>>>>>>    salience 20
>>>>>>>> when
>>>>>>>>    B()
>>>>>>>> then
>>>>>>>>    // do something else
>>>>>>>> end
>>>>>>>>
>>>>>>>>    Since rule 2 has a higher salience, if it activates it will fire
>>>>>>>> first, and due to the activation-group, it will cancel the activation of r1
>>>>>>>> preventing it to fire.
>>>>>>>>
>>>>>>>>    Hope it helps.
>>>>>>>>
>>>>>>>>    Edson
>>>>>>>>
>>>>>>>> 2010/3/5 malkhafaji <moe.alkhafaji at medcpu.com>
>>>>>>>>
>>>>>>>>
>>>>>>>>> Hello,
>>>>>>>>>
>>>>>>>>> I know, from searching this forum and posting before, that the
>>>>>>>>> concept of
>>>>>>>>> inheritance does not exist today in Drools. However, I have a need
>>>>>>>>> for it.
>>>>>>>>> Here is my specific situation:
>>>>>>>>>
>>>>>>>>> I have certain rules that have some generic conditions to be fired:
>>>>>>>>>
>>>>>>>>> Rule 1
>>>>>>>>> If A Then X end
>>>>>>>>>
>>>>>>>>> Rule 2
>>>>>>>>> If A, B Then Y end
>>>>>>>>>
>>>>>>>>> What I would like to do is, if Rule 2 is true, then I don't want
>>>>>>>>> Rule 1 to
>>>>>>>>> execute. I have many and many of those rules, so combining all the
>>>>>>>>> conditions in less number of rules violates our design having rules
>>>>>>>>> being
>>>>>>>>> mutually exclusive. That is why I wanted to include this behavior
>>>>>>>>> as a
>>>>>>>>> natural inheritance behavior rather than forcing the flow with
>>>>>>>>> logic inside
>>>>>>>>> the rule itself (you will make rules aware of others this way).
>>>>>>>>>
>>>>>>>>> So, since there is not built-in feature that allows you to do that,
>>>>>>>>> do
>>>>>>>>> people suggest anything that I can do without having to mix Rule 1
>>>>>>>>> and Rule
>>>>>>>>> 2 into one rule with complex conditional statements? Any ideas?
>>>>>>>>>
>>>>>>>>> The only thing I can think of is taking this logic processing
>>>>>>>>> outside of
>>>>>>>>> drools, which is something that I am not too excited about.
>>>>>>>>>
>>>>>>>>> Thanks.
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> View this message in context:
>>>>>>>>> http://n3.nabble.com/Inheritance-Like-Design-Question-tp430848p430848.html
>>>>>>>>> Sent from the Drools - User mailing list archive at Nabble.com.
>>>>>>>>> _______________________________________________
>>>>>>>>> rules-users mailing list
>>>>>>>>> rules-users at lists.jboss.org
>>>>>>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>>  Edson Tirelli
>>>>>>>>  JBoss Drools Core Development
>>>>>>>>  JBoss by Red Hat @ www.jboss.com
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> rules-users mailing list
>>>>>>>> rules-users at lists.jboss.org
>>>>>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Moe Alkhafaji
>>>>>>> Chief Technology Officer, MedCPU
>>>>>>> Phone: (630) 290-1113
>>>>>>> Email: cto at medcpu.com
>>>>>>>
>>>>>>> This message contains information which may be confidential. Unless
>>>>>>> you are the addressee, you may not use, copy or disclose to anyone the
>>>>>>> message or any information contained in this message. If you have received
>>>>>>> this email in error, please notify cto at medcpu.com and please delete
>>>>>>> the message immediately. In order for the contents of this message to be
>>>>>>> binding on behalf of MedCPU it must be confirmed in writing by an authorized
>>>>>>> signatory of MedCPU. Our company accepts no liability for the content of
>>>>>>> this email unless it is so confirmed. The views or opinions presented herein
>>>>>>> do not necessarily represent those of the company.
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Moe Alkhafaji
>>>>>> Chief Technology Officer, MedCPU
>>>>>> Phone: (630) 290-1113
>>>>>> Email: cto at medcpu.com
>>>>>>
>>>>>> This message contains information which may be confidential. Unless
>>>>>> you are the addressee, you may not use, copy or disclose to anyone the
>>>>>> message or any information contained in this message. If you have received
>>>>>> this email in error, please notify cto at medcpu.com and please delete
>>>>>> the message immediately. In order for the contents of this message to be
>>>>>> binding on behalf of MedCPU it must be confirmed in writing by an authorized
>>>>>> signatory of MedCPU. Our company accepts no liability for the content of
>>>>>> this email unless it is so confirmed. The views or opinions presented herein
>>>>>> do not necessarily represent those of the company.
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Moe Alkhafaji
>>>>> Chief Technology Officer, MedCPU
>>>>> Phone: (630) 290-1113
>>>>> Email: cto at medcpu.com
>>>>>
>>>>> This message contains information which may be confidential. Unless you
>>>>> are the addressee, you may not use, copy or disclose to anyone the message
>>>>> or any information contained in this message. If you have received this
>>>>> email in error, please notify cto at medcpu.com and please delete the
>>>>> message immediately. In order for the contents of this message to be binding
>>>>> on behalf of MedCPU it must be confirmed in writing by an authorized
>>>>> signatory of MedCPU. Our company accepts no liability for the content of
>>>>> this email unless it is so confirmed. The views or opinions presented herein
>>>>> do not necessarily represent those of the company.
>>>>>
>>>>> _______________________________________________
>>>>> rules-users mailing list
>>>>> rules-users at lists.jboss.org
>>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>>  Edson Tirelli
>>>>  JBoss Drools Core Development
>>>>  JBoss by Red Hat @ www.jboss.com
>>>>
>>>> _______________________________________________
>>>> rules-users mailing list
>>>> rules-users at lists.jboss.org
>>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>>
>>>>
>>>
>>>
>>> --
>>> Moe Alkhafaji
>>> Chief Technology Officer, MedCPU
>>> Phone: (630) 290-1113
>>> Email: cto at medcpu.com
>>>
>>> This message contains information which may be confidential. Unless you
>>> are the addressee, you may not use, copy or disclose to anyone the message
>>> or any information contained in this message. If you have received this
>>> email in error, please notify cto at medcpu.com and please delete the
>>> message immediately. In order for the contents of this message to be binding
>>> on behalf of MedCPU it must be confirmed in writing by an authorized
>>> signatory of MedCPU. Our company accepts no liability for the content of
>>> this email unless it is so confirmed. The views or opinions presented herein
>>> do not necessarily represent those of the company.
>>>
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>>
>>
>>
>> --
>>  Edson Tirelli
>>  JBoss Drools Core Development
>>  JBoss by Red Hat @ www.jboss.com
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
>
> --
> Moe Alkhafaji
> Chief Technology Officer, MedCPU
> Phone: (630) 290-1113
> Email: cto at medcpu.com
>
> This message contains information which may be confidential. Unless you are
> the addressee, you may not use, copy or disclose to anyone the message or
> any information contained in this message. If you have received this email
> in error, please notify cto at medcpu.com and please delete the message
> immediately. In order for the contents of this message to be binding on
> behalf of MedCPU it must be confirmed in writing by an authorized signatory
> of MedCPU. Our company accepts no liability for the content of this email
> unless it is so confirmed. The views or opinions presented herein do not
> necessarily represent those of the company.
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>


-- 
 Edson Tirelli
 JBoss Drools Core Development
 JBoss by Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20100305/05b228dd/attachment.html 


More information about the rules-users mailing list