[rules-users] Inheritance-Like Design Question

Edson Tirelli ed.tirelli at gmail.com
Fri Mar 5 17:50:49 EST 2010


https://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/

   Eclipse 3.5.2.

   Drools runtime 5.0.1.

   Edson

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

> Edson,
>
> Just to make sure, can you please send me the link of where you downloaded
> your Eclipse plugin from? Also, what version of Eclipse are you using?
> Thanks.
>
>
> 2010/3/5 Edson Tirelli <ed.tirelli at gmail.com>
>
>>
>>    :) 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
>>
>> _______________________________________________
>> 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/5b6ebbaf/attachment.html 


More information about the rules-users mailing list