[rules-users] nested accessors with Sets

Edson Tirelli tirelli at post.com
Thu Aug 2 09:17:42 EDT 2007


   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 at comcast.net <mark.mcnally at 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 at 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 at 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 at 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 at 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 at 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 at 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 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
>
> _______________________________________________
> rules-users mailing list
> rules-users at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20070802/d5f1ea6e/attachment.html 


More information about the rules-users mailing list