[rules-users] Problem with nested properties

Olivier THIERRY olivier.thierry at gmail.com
Thu Dec 11 09:29:17 EST 2008


Thanks Michael.
Actually we could make it work using "mvel" dialect instead of "java" one.
We find "mvel" dialect makes it easier to write rules (no more
getters, and getters are not very natural for non developers) so it
could be a nice idea to use it. But are there things that can be done
with Java dialect and not with mvel one ?

2008/12/11 Michael Neale <michael.neale at gmail.com>:
> I don't recall drools 4 being able to do nested fields like that. Drools 5
> can if you want to check it out.
>
> Sent from my iPhone
>
> On 11/12/2008, at 19:52, "Olivier THIERRY" <olivier.thierry at gmail.com>
> wrote:
>
>> Hi,
>>
>> We plan to use rules engine on a project because business rules will
>> often change and need to be written by business experts. We are
>> testing Drools 4.0.7 and are very interested with it, in particular
>> because of the ability to write DSL.
>>
>> In our tests we wrote a rule that needs nested properties to compare
>> year part of two dates. But it doesn't work, it can't resolve nested
>> properties while we created the needed getter methods.
>>
>> The rule is as following :
>>
>> rule "CALCUL_RELICAT_CP"
>>   salience 8
>>   dialect "java"
>>   no-loop
>>   when
>>           not VOCounter( code == "RELICAT_CP" )
>>       $beginDate : RuleDate( name == "startDate")
>>       $relicat : VOCounter (code == "SOLDE_CP_CUM", startDate.year ==
>> ($beginDate.year + 1))
>>   then
>>              ....
>> end
>>
>> And the stack trace is as following :
>>
>> org.drools.RuntimeDroolsException: Exception executing predicate eval(
>> startDate.year == ( $beginDate.year + 1 ) )
>>   at
>> org.drools.rule.PredicateConstraint.isAllowedCachedLeft(PredicateConstraint.java:239)
>>   at
>> org.drools.common.SingleBetaConstraints.isAllowedCachedLeft(SingleBetaConstraints.java:122)
>>   at org.drools.reteoo.JoinNode.assertTuple(JoinNode.java:108)
>>   at
>> org.drools.reteoo.SingleTupleSinkAdapter.propagateAssertTuple(SingleTupleSinkAdapter.java:20)
>>   at org.drools.reteoo.JoinNode.assertObject(JoinNode.java:156)
>>   at
>> org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:22)
>>   at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:145)
>>   at
>> org.drools.reteoo.SingleObjectSinkAdapter.propagateAssertObject(SingleObjectSinkAdapter.java:22)
>>   at
>> org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:162)
>>   at org.drools.reteoo.Rete.assertObject(Rete.java:175)
>>   at
>> org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:192)
>>   at
>> org.drools.reteoo.ReteooWorkingMemory.doInsert(ReteooWorkingMemory.java:71)
>>   at
>> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:911)
>>   at
>> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:883)
>>   at
>> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:684)
>>   at t4.test.drools.TestRuleBase.loadLines(TestRuleBase.java:89)
>>   at t4.test.drools.TestRuleBase.executeRuleWithDsl(TestRuleBase.java:116)
>>   at t4.test.drools.Test1.testDsl(Test1.java:39)
>> Caused by: org.mvel.CompileException: unable to resolve property: year
>>   at
>> org.mvel.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:289)
>>   at
>> org.mvel.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:110)
>>   at
>> org.mvel.ast.VariableDeepPropertyNode.getReducedValueAccelerated(VariableDeepPropertyNode.java:26)
>>   at
>> org.mvel.ast.PropertyASTNode.initializePropertyNode(PropertyASTNode.java:70)
>>   at
>> org.mvel.ast.PropertyASTNode.getReducedValueAccelerated(PropertyASTNode.java:24)
>>   at
>> org.mvel.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:21)
>>   at org.mvel.MVELRuntime.execute(MVELRuntime.java:90)
>>   at org.mvel.CompiledExpression.getValue(CompiledExpression.java:111)
>>   at org.mvel.MVEL.executeExpression(MVEL.java:235)
>>   at
>> org.drools.base.mvel.MVELPredicateExpression.evaluate(MVELPredicateExpression.java:45)
>>   at
>> org.drools.rule.PredicateConstraint.isAllowedCachedLeft(PredicateConstraint.java:232)
>>   ... 46 more
>> Caused by: org.mvel.PropertyAccessException: unable to resolve property:
>> year
>>   at
>> org.mvel.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanProperty(ReflectiveAccessorOptimizer.java:383)
>>   at
>> org.mvel.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:258)
>>   ... 56 more
>>
>> We could make it work this way :
>>
>>       $relicat : VOCounter (code == "SOLDE_CP_CUM", $debut : startDate )
>>       $startDate : RuleDate( name == "startDate" )
>>       eval ($startDate.getYear() == $debut.getYear() + 1)
>>
>> But we find this very complex for non business experts that are not
>> developers. And we find it too complex to write DSL for this.
>> It would be great if we could make it work using nested properties.
>>
>> Are nested properties supported (I found in mailing list archives that
>> it was planned for 3.1 :
>> http://www.mail-archive.com/user@drools.codehaus.org/msg01331.html ) ?
>> Note I am a newbie with Drools and rules engine, so maybe there is a
>> better way to write it ?
>>
>> Thanks in advance ;)
>>
>> Olivier
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>



-- 
Seules 2 choses sont infinies : l'univers et la bêtise humaine ; et
encore pour l'univers, je ne suis pas sûr … (Einstein)




More information about the rules-users mailing list