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(a)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(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
_______________________________________________
rules-users mailing list
rules-users(a)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)