Mark,
Sorry for not answering before. I was doing some research.
What you found is a bug. Contains and not contains are supported operations in Drools, but the case you are facing is that you are using these operators with accessors expressions (
e.g. nurseDetails.stateLicensures ). When an accessor expression is used, the engine converts the whole expression in an inline-eval. So what you are doing will be interpreted by the engine as:
$ca:CandidateAssociation( eval (
nurseDetails.stateLicensures not contains patientDetails.state ) )
Problem is that "not contains" is not a valid operator for MVEL. May I ask you please to open a JIRA for that? I will fix it asap.
Meanwhile, to work around the problem you can either avoid the accessor path expression when using "contains/memberOf/matches" and their corresponding negations, or write the inline eval yourself, avoid a mistranslation by the engine. So, if you are using mvel dialect for your rule, you could write:
rule XXX
dialect "mvel"
when
$ca:CandidateAssociation( eval ( ! nurseDetails.stateLicensures.contains( patientDetails.state ) ) )
then
// do something
end
Please not that as you are explicitly declaring the mvel dialect for your rule, your consequence will also be an MVEL block.
Sorry for the inconvenience. I will fix that for 4.0.1.
Thanks,
Edson
2007/8/1, mark.mcnally@comcast.net <
mark.mcnally@comcast.net>:
Actually, it is still broken.
This does not complain but it always executes the consequence, even when the stateLicensures includes the state that in patientDetails.state
$ca:CandidateAssociation(nurseDetails.stateLicensures not contains
patientDetails.state )
I also tried the following but it complains with an Exception
$ca:CandidateAssignment(participantDetails.state not memberof nurseDetails.stateLicensures )
org.drools.rule.InvalidRulePackage
: [13,50]: unknown:13:50 Unexpected token 'not'[13,93]: unknown:13:93 mismatched token: [@98,574:574=')',<13>,13:93]; expecting type LEFT_PAREN
at org.drools.rule.Package.checkValidity(Package.java
:408)
at org.drools.common.AbstractRuleBase.addPackage(AbstractRuleBase.java:288)
Is what I am trying to do supported by Drools?
Thank you,
Mark
-------------- Original message ----------------------
From: mark.mcnally@comcast.net
> My rule now appears to be working after switching from the "excludes" operator
> to the newer "not contains".
>
> This works:
> $ca:CandidateAssociation(nurseDetails.stateLicensures not contains
> patientDetails.state )
>
> This does not:
> $ca:CandidateAssociation(nurseDetails.stateLicensures
excludes
> patientDetails.state )
>
>
> Mark
>
> -------------- Original message ----------------------
> From: mark.mcnally@comcast.net
> > Hello,
> >
> > Please excuse me if I have double posted - my first did not seem to appear.
> >
> > I am wondering if the following is valid rule syntax. I am getting a
> stacktrace
> > when the rules fire that points to a ClassCastException on a HashSet
> >
> > I am using v4.0 GA.
> >
> > Thank you, Mark
> >
> >
> > rule StateMatch
> > when
> > $ca:CandidateAssociation(nurseDetails.stateLicensures excludes
> > patientDetails.state )
> > then
> > retract( $ca );
> > end
> >
> >
> > public class CandidateAssociation {
> > private PatientDetails patientDetails;
> > private NurseDetails nurseDetails;
> > private int overlapHours;
> >
> > public CandidateAssociation( PatientDetails patientDetails, NurseDetails
> > nurseDetails) {
> > super();
> > this.patientDetails = patientDetails;
> > this.nurseDetails = nurseDetails;
> > overlapHours =
> > participantDetails.getNumberOverlapHourCnt(nurseDetails);
> > }
> > [...]
> > }
> >
> > public class NurseDetails {
> > private Set stateLicensures = new HashSet();
> > [...]
> > }
> > public class PatientDetails {
> > private String state;
> > [...]
> > }
> >
> > ------------------------------------------------------
> > Firing Rules
> > **********
> > org.drools.RuntimeDroolsException: Exception executing predicate
> > org.drools.base.mvel.MVELPredicateExpression@27d6bfb
> > at
> > org.drools.rule.PredicateConstraint.isAllowed(PredicateConstraint.java:197)
> > at org.drools.reteoo.AlphaNode.assertObject
(AlphaNode.java:121)
> > at
> >
> org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObje
> > ctSinkAdapter.java:317)
> > at
> > org.drools.reteoo.ObjectTypeNode.assertObject
(ObjectTypeNode.java:159)
> > at org.drools.reteoo.Rete.assertObject(Rete.java:175)
> > at
> > org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:190)
> > at
> > org.drools.reteoo.ReteooWorkingMemory.doInsert(ReteooWorkingMemory.java:70)
> > at
> > org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:772)
> > at
> > org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:64)
> > at
> > org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:58)
> > at
> >
> org.drools.examples.Rule_InitializeCandidateForEachNurse_0.consequence(Rule_Init
> > ializeCandidateForEachNurse_0.java:13)
> > at
> >
> org.drools.examples.Rule_InitializeCandidateForEachNurse_0ConsequenceInvoker.eva
> > luate(Rule_InitializeCandidateForEachNurse_0ConsequenceInvoker.java:25)
> > at
> > org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:503)
> > at org.drools.common.DefaultAgenda.fireNextItem
(DefaultAgenda.java:467)
> > at
> >
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:
> > 403)
> > at
> >
> org.drools.common.AbstractWorkingMemory.fireAllRules
(AbstractWorkingMemory.java:
> > 384)
> > at
> > primarynursePOC.PrimaryNursePOC.selectPrimaryNurse(PrimaryNursePOC.java:136)
> > at primarynursePOC.PrimaryNursePOC.main(PrimaryNursePOC.java
:91)
> > Caused by: java.lang.ClassCastException: java.util.HashSet
> > at
> >
> org.drools.base.mvel.MVELPredicateExpression.evaluate(MVELPredicateExpression.ja
> > va:35)
> > at
> > org.drools.rule.PredicateConstraint.isAllowed(PredicateConstraint.java:191)
> > ... 17 more
> > org.drools.RuntimeDroolsException: Exception executing predicate
> >
org.drools.base.mvel.MVELPredicateExpression@27d6bfb
> > at
> > org.drools.rule.PredicateConstraint.isAllowed(PredicateConstraint.java:197)
> > at org.drools.reteoo.AlphaNode.assertObject
(AlphaNode.java:121)
> > at
> >
> org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObje
> > ctSinkAdapter.java:317)
> > at
> > org.drools.reteoo.ObjectTypeNode.assertObject
(ObjectTypeNode.java:159)
> > at org.drools.reteoo.Rete.assertObject(Rete.java:175)
> > at
> > org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:190)
> > at
> > org.drools.reteoo.ReteooWorkingMemory.doInsert(ReteooWorkingMemory.java:70)
> > at
> > org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:772)
> > at
> > org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:64)
> > at
> > org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:58)
> > at
> >
> org.drools.examples.Rule_InitializeCandidateForEachNurse_0.consequence(Rule_Init
> > ializeCandidateForEachNurse_0.java:13)
> > at
> >
> org.drools.examples.Rule_InitializeCandidateForEachNurse_0ConsequenceInvoker.eva
> > luate(Rule_InitializeCandidateForEachNurse_0ConsequenceInvoker.java:25)
> > at
> > org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:503)
> > at org.drools.common.DefaultAgenda.fireNextItem
(DefaultAgenda.java:467)
> > at
> >
> org.drools.common.AbstractWorkingMemory.doOtherwise(AbstractWorkingMemory.java:4
> > 30)
> > at
> >
> org.drools.common.AbstractWorkingMemory.fireAllRules
(AbstractWorkingMemory.java:
> > 412)
> > at
> >
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:
> > 384)
> > at
> > primarynursePOC.PrimaryNursePOC.selectPrimaryNurse
(PrimaryNursePOC.java:136)
> > at primarynursePOC.PrimaryNursePOC.main(PrimaryNursePOC.java:91)
> > Caused by: java.lang.ClassCastException: java.util.HashSet
> > at
> >
>
org.drools.base.mvel.MVELPredicateExpression.evaluate(MVELPredicateExpression.ja
> > va:35)
> > at
> > org.drools.rule.PredicateConstraint.isAllowed(PredicateConstraint.java:191)
> > ... 18 more
> > Exception in thread "main" org.drools.spi.ConsequenceException:
> > org.drools.RuntimeDroolsException: Exception executing predicate
> > org.drools.base.mvel.MVELPredicateExpression@27d6bfb
> > at
> > org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:507)
> > at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:467)
> > at
> >
> org.drools.common.AbstractWorkingMemory.doOtherwise(AbstractWorkingMemory.java:4
> > 30)
> > at
> >
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java
:
> > 412)
> > at
> >
> org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:
> > 384)
> > at
> > primarynursePOC.PrimaryNursePOC.selectPrimaryNurse
(PrimaryNursePOC.java:136)
> > at primarynursePOC.PrimaryNursePOC.main(PrimaryNursePOC.java:91)
> > Caused by: org.drools.RuntimeDroolsException: Exception executing predicate
> > org.drools.base.mvel.MVELPredicateExpression@27d6bfb
> > at
> > org.drools.rule.PredicateConstraint.isAllowed(PredicateConstraint.java:197)
> > at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:121)
> > at
> >
> org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObje
> > ctSinkAdapter.java:317)
> > at
> > org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java
:159)
> > at org.drools.reteoo.Rete.assertObject(Rete.java:175)
> > at
> > org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:190)
> > at
> > org.drools.reteoo.ReteooWorkingMemory.doInsert
(ReteooWorkingMemory.java:70)
> > at
> > org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:772)
> > at
> > org.drools.base.DefaultKnowledgeHelper.insert(
DefaultKnowledgeHelper.java:64)
> > at
> > org.drools.base.DefaultKnowledgeHelper.insert(DefaultKnowledgeHelper.java:58)
> > at
> >
> org.drools.examples.Rule_InitializeCandidateForEachNurse_0.consequence
(Rule_Init
> > ializeCandidateForEachNurse_0.java:13)
> > at
> >
> org.drools.examples.Rule_InitializeCandidateForEachNurse_0ConsequenceInvoker.eva
> > luate(Rule_InitializeCandidateForEachNurse_0ConsequenceInvoker.java:25)
> > at
> > org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:503)
> > ... 6 more
> > Caused by: java.lang.ClassCastException: java.util.HashSet
> > at
> >
> org.drools.base.mvel.MVELPredicateExpression.evaluate(MVELPredicateExpression.ja
> > va:35)
> > at
> > org.drools.rule.PredicateConstraint.isAllowed(PredicateConstraint.java
:191)
> > ... 18 more
> > _______________________________________________
> > rules-users mailing list
> > rules-users@lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/rules-users
>
> _______________________________________________
> rules-users mailing list
> rules-users@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
--
Edson Tirelli
Software Engineer - JBoss Rules Core Developer
Office: +55 11 3529-6000
Mobile: +55 11 9287-5646
JBoss, a division of Red Hat @ www.jboss.com