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(a)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(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users