[rules-users] Smart Templates

Wolfgang Laun wolfgang.laun at gmail.com
Wed Jun 1 06:01:32 EDT 2011


This looks as if you inserted some object ServiceBean extends HashMap as a
fact? Whatever for? Originally, this was class Service.

Make sure to distinguish template expansion from rule execution.

The former should result in a DRL file containing several rules (all with
different names!).

-W



2011/6/1 ChrisMu <christopher.mullard at credit-suisse.com>

> I get this exception:
> Exception in thread "main" org.drools.runtime.rule.ConsequenceException:
> rule: RFI1
>
>  at
> org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
>  at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:927)
>  at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:856)
>  at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1071)
>  at
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:785)
>  at
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:751)
>  at
> org.drools.template.parser.TemplateDataListener.finishSheet(TemplateDataListener.java:121)
>  at
> org.drools.template.DataProviderCompiler.finishData(DataProviderCompiler.java:100)
>  at
> org.drools.template.DataProviderCompiler.processData(DataProviderCompiler.java:95)
>  at
> org.drools.template.DataProviderCompiler.compile(DataProviderCompiler.java:73)
>  at
> org.drools.template.ObjectDataCompiler.compile(ObjectDataCompiler.java:44)
>  at
> org.drools.examples.decisiontable.TemplateParser.<init>(TemplateParser.java:33)
>  at
> org.drools.examples.decisiontable.TemplateParser.main(TemplateParser.java:18)
> Caused by: java.lang.RuntimeException: [Error: unable to resolve method:
> java.util.HashMap.value() [arglength=0]]
> [Near : {... Unknown ....}]
>              ^
> [Line: 1, Column: 0]
>  at
> org.drools.template.parser.DefaultGenerator.generate(DefaultGenerator.java:73)
>  at
> org.drools.template.parser.Rule_RFI1_0.defaultConsequence(Rule_RFI1_0.java:7)
>  at
> org.drools.template.parser.Rule_RFI1_0DefaultConsequenceInvoker.evaluate(Rule_RFI1_0DefaultConsequenceInvoker.java:30)
>  at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:917)
>  ... 11 more
> Caused by: [Error: unable to resolve method: java.util.HashMap.value()
> [arglength=0]]
> [Near : {... Unknown ....}]
>              ^
> [Line: 1, Column: 0]
>  at
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:932)
>  at
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanProperty(ReflectiveAccessorOptimizer.java:592)
>  at
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:311)
>  at
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:137)
>
> My rule template is virtually the same (name is a literal):
> rule "[hidden email]<http://user/SendEmail.jtp?type=node&node=3010031&i=0>
> }"
> when
>  $service:ServiceBean(name == "DiscountCurve", value == "@{value}")
>
>  $riskType:RiskType()
> then
>  $riskType.setName("@{type}");
>  $riskType.setValue("@{value}");
> end template
>  ------------------------------
> *From:* Wolfgang Laun-2 [via Drools] [mailto:[hidden email]<http://user/SendEmail.jtp?type=node&node=3010031&i=1>]
>
> *Sent:* 01 June 2011 10:33
> *To:* Mullard, Christopher
> *Subject:* Re: [rules-users] Smart Templates
>
> There is a way, provided the required information is available at the time
> the rule is created.
>
> There is a detailed section in the Expert manual explaining how to call
> template expansion with either a Collection of Map objects or a Collection
> of JavaBean objects. Taking beans, you would have
>
> ServiceBean( String name, String value )
> String getName
> String getValue
> String getType(){
> Â Â  if( "AAA".equals( value ) ) return "Type1";
> Â Â  if( "XYZ".equals( value ) ) return "Type2";
> Â Â  ...
>
> }
>
> You create a collection of such Objects, and call the expander for a
> template like this:
>
> rule "DC_@{row.rowNumber}"
> when
> Â  Â  $service: Service(name == "@{service}", value == "@{value}")
> Â  Â  $riskType: RiskType()
> then
> Â  Â  $riskType.setName("@{type}");
> Â  Â  $riskType.setAtt(0,"@{value}");
> end
>
> -W
>
>
>
> 2011/6/1 ChrisMu <[hidden email]<http://user/SendEmail.jtp?type=node&node=3009984&i=0>
> >
>
>> So in essence, there's no way to use a function to insert a string literal
>> into a rule from a template?
>>
>>  ------------------------------
>> *From:* FrankVhh [via Drools] [mailto:[hidden email]<http://user/SendEmail.jtp?type=node&node=3009838&i=0>]
>>
>> *Sent:* 31 May 2011 17:20
>> *To:* Mullard, Christopher
>> *Subject:* RE: Smart Templates
>>
>> But then that would call the service.getType() method when the rule is
>> run wouldn't it?
>> -> Yes
>> Â
>> I'm trying create explicit, simple rules to avoid doing extra work when
>> running data through them.
>> -> OK, in essence, I like that :-)
>> Â
>> How would you use a rule to set the value within another rule?
>> -> I am not sure that I follow you here...
>> If you want to avoid to execute the getType()-service at rule execution,
>> then you would need to add an attribute name to your object, and call
>> getType() before creating the rules.
>>
>> Alternatively, you can insert an intermediate value whose value will be
>> set by another rule and then use this intermediate value in your DC rules.
>>
>> When
>> Service(value = "AAA")
>> Then
>> String name = "Type1";
>> insert(name);
>>
>> Something like this... but make sure not to create a loop :-)
>>
>> Regards,
>> Frank
>>
>>  ChrisMu wrote:
>> But then that would call the service.getType() method when the rule is
>> run wouldn't it?
>> Â
>> I'm trying create explicit, simple rules to avoid doing extra work when
>> running data through them.
>> Â
>> How would you use a rule to set the value within another rule?
>> Â
>> Thanks
>> Chris
>>
>> ________________________________
>>
>> From: FrankVhh [via Drools]
>> [mailto:[hidden email]<http://user/SendEmail.jtp?type=node&node=3006773&i=0>]
>>
>> Sent: 31 May 2011 16:48
>> To: Mullard, Christopher
>> Subject: Re: Smart Templates
>>
>>
>> Hi,
>>
>> The way I see it, this is the way your template should look like. I do
>> not see the need to use eval() at all.
>>
>> rule "DC_0"
>> when
>> Â  Â  $service: Service(name == "@{service}", value == "@{value}")
>> Â  Â  $riskType: RiskType()
>> then
>> Â  Â  $riskType.setName($service.getType("@{value}"));
>> Â  Â  $riskType.setAtt(0,"@{value}");
>> end
>>
>> I am assuming that RiskType is already inserted in WM, but you could
>> just as well create a new object in the then-part of the rule.
>>
>> In stead of using the java-function to determine the name, you might
>> actually just as well create an other rule that sets the name according
>> to the value, thus putting the entire decision logic in rules.
>>
>> Hope this helps.
>>
>> Regards,
>> Frank
>>
>>
>>
>> Â  Â  Â  Â  ChrisMu wrote:
>> Â  Â  Â  Â  Hi,
>> Â  Â  Â  Â
>> Â  Â  Â  Â  Â I'm trying to get a template (.drt) to generate 2 rules
>> (.drl)
>> from 2 datasets but by doing a little bit more work than direct
>> substitution.
>> Â  Â  Â  Â
>> Â  Â  Â  Â  Data (service,value):
>> Â  Â  Â  Â  DC, AAA
>> Â  Â  Â  Â  DC, XYZ
>> Â  Â  Â  Â
>> Â  Â  Â  Â  Idea for the template - if value is of type1 then create Type
>> object with 'Type1' as name. If value is of type2, use 'Type2' as name:
>> Â  Â  Â  Â
>> Â  Â  Â  Â  rule "DC_@{row.rowNumber}"
>> Â  Â  Â  Â  when
>> Â  Â  Â  Â  Â  Â  Service(name == "DC") Â  Â
>> Â  Â  Â  Â  then
>> Â  Â  Â  Â  Â  Â  Type.setName(eval(Service.getType(@{value})))
>> Â  Â  Â  Â  Â  Â  Type.setAtt(0,@{value})
>> Â  Â  Â  Â  end template
>> Â  Â  Â  Â
>> Â  Â  Â  Â  eval(Service.getType(@{arg0})) should take 'AAA' or 'XYZ' etc
>> as
>> arg and return a string Type1/Type2 etc.
>> Â  Â  Â  Â
>> Â  Â  Â  Â  This would then generate 2 rules that look like:
>> Â  Â  Â  Â
>> Â  Â  Â  Â  rule "DC_0"
>> Â  Â  Â  Â  when
>> Â  Â  Â  Â  Â  Â  Service(name == "DC", value == "AAA") Â  Â
>> Â  Â  Â  Â  then
>> Â  Â  Â  Â  Â  Â  RiskType.setName("Type1")
>> Â  Â  Â  Â  Â  Â  RiskType.setAtt(0,"AAA")
>> Â  Â  Â  Â
>> Â  Â  Â  Â  rule "DC_1"
>> Â  Â  Â  Â  when
>> Â  Â  Â  Â  Â  Â  Service(name == "DC", value == "XYZ") Â  Â
>> Â  Â  Â  Â  then
>> Â  Â  Â  Â  Â  Â  RiskType.setName("Type2")
>> Â  Â  Â  Â  Â  Â  RiskType.setAtt(0,"XYZ")
>> Â  Â  Â  Â
>> Â  Â  Â  Â  ...is this possible at all? I'm trying to avoid the eval step
>> being done in the actual rule (.drl) .
>> Â  Â  Â  Â
>> Â  Â  Â  Â  Thanks
>> Â  Â  Â  Â
>> Â  Â  Â  Â  Chris
>>
>>
>>
>> ________________________________
>>
>> If you reply to this email, your message will be added to the discussion
>> below:
>> http://drools.46999.n3.nabble.com/Smart-Templates-tp3006479p3006589.html
>>
>> To unsubscribe from Smart Templates, click here
>> <http://drools.46999.n3.nabble.com/template/NamlServlet.jtp?macro=unsubs
>> cribe_by_code&node=3006479&code=Y2hyaXN0b3BoZXIubXVsbGFyZEBjcmVkaXQtc3Vp
>> c3NlLmNvbXwzMDA2NDc5fDE5NzczMDY1MzE=> .
>>
>> ===============================================================================
>>
>> Please access the attached hyperlink for an important electronic
>> communications disclaimer:
>> http://www.credit-suisse.com/legal/en/disclaimer_email_ib.htmlÂ
>> ===============================================================================
>>
>>
>>
>>
>> ------------------------------
>>  If you reply to this email, your message will be added to the discussion
>> below:
>> http://drools.46999.n3.nabble.com/Smart-Templates-tp3006479p3006773.html
>> To unsubscribe from Smart Templates, click here.
>>
>>
>> ==============================================================================
>> Please access the attached hyperlink for an important electronic
>> communications disclaimer:
>> http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
>>
>> ==============================================================================
>>
>>
>> ------------------------------
>> View this message in context: RE: Smart Templates<http://drools.46999.n3.nabble.com/Smart-Templates-tp3006479p3009838.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
>> [hidden email] <http://user/SendEmail.jtp?type=node&node=3009984&i=1>
>>
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
> _______________________________________________
> rules-users mailing list
> [hidden email] <http://user/SendEmail.jtp?type=node&node=3009984&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/Smart-Templates-tp3006479p3009984.html
> To unsubscribe from Smart Templates, click here.
>
>
> ==============================================================================
> Please access the attached hyperlink for an important electronic
> communications disclaimer:
> http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
>
> ==============================================================================
>
>
> ------------------------------
> View this message in context: RE: [rules-users] Smart Templates<http://drools.46999.n3.nabble.com/Smart-Templates-tp3006479p3010031.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/20110601/69bbcef0/attachment.html 


More information about the rules-users mailing list