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(a)comcast.net <mark.mcnally(a)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(a)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(a)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(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
_______________________________________________
rules-users mailing list
rules-users(a)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