[rules-users] nested accessors with Sets

mark.mcnally at comcast.net mark.mcnally at comcast.net
Thu Aug 2 14:53:01 EDT 2007


Edson,

Thank you for the response. I tried writing the in-line eval as suggested but get this Exception:

org.drools.rule.InvalidRulePackage: Unable to determine the used declarations : [Rule name=State, agendaGroup=MAIN, salience=0, no-loop=false]
	at org.drools.rule.Package.checkValidity(Package.java:408)
	at org.drools.common.AbstractRuleBase.addPackage(AbstractRuleBase.java:288)
	at [...]

This is my rule:

rule State
    dialect "mvel"
	when
            $ca:CandidateAssociation( eval ( ! nurseDetails.stateLicensures.contains( patientDetails.state ) ) )
	then 	
  	    retract( $ca );
end

I haven't yet but, plan to open an issue in JIRA as requested

Thanks for your help.
Mark

 -------------- Original message ----------------------
From: "Edson Tirelli" <tirelli at post.com>
>    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 embedded message was scrubbed...
From: "Edson Tirelli" <tirelli at post.com>
Subject: Re: [rules-users] nested accessors with Sets
Date: Thu, 2 Aug 2007 13:20:54 +0000
Size: 30961
Url: http://lists.jboss.org/pipermail/rules-users/attachments/20070802/fd8a1e29/attachment.mht 


More information about the rules-users mailing list