[rules-users] function problem

Edson Tirelli tirelli at post.com
Mon Dec 1 16:51:05 EST 2008


   If I understood the problem, one way would be (assuming $tags is a global
list):

when
    Person( ageInYears >= 18, $tagList : tagList )
    exists( String( this memberof $tags ) from $tagList )
then
   ...
end

   If $tags is a fact, just bind it before the "exists".

   []s
   Edson


2008/12/1 Dan Seaver <dan.seaver at ge.com>

>
> Charlie,
> I'm not sure why your function doesn't compile as it looks fine to me. Do
> you have any other details about the message you're getting from the
> compiler?
>
> In any case, you may want to consider solving the problem a different way.
> In general, you should try to avoid "eval" statements whenever possible as
> they can severely hamper performance. Edson wrote up some helpful hints -
> see "Eval is Evil" at -
> http://blog.athico.com/2007/03/writing-better-rules.html
>
> As an alternative, try populating working memory with each of the Person's
> tagList items and then use "memberOf" to determine if it's one of the
> engineering TagCodes. (You may be able to use the "from" statement with the
> Person's tagList instead of populating working memory) This allows Drools
> to
> do all of the work for you and may very well be faster than using loops.
>
> Let me know if you need further clarification.
>
>
> Charlie Holland wrote:
> >
> > I'm fairly new to Drools so there may be an easier way to do this. I need
> > to
> > check to see if any one of a list of tags on an object are in another
> list
> > of tags and am trying to do that with a function. the compiler tells me
> it
> > can't compile my eval function:
> >
> > #list any import classes here.
> > **
> >
> > *import* com.cp.services.rules.sources.Person;
> > **
> >
> > *import* com.cp.services.rules.actions.PersonActions;
> > **
> >
> > *import* com.cp.rules.TagCodes;
> > **
> >
> > *import* java.util.List;
> >
> >
> >
> > #declare any global variables here
> > **
> >
> > *global* com.cp.services.rules.actions.PersonActions personActions;
> >
> > **
> >
> > *function* *boolean* hasOneOf(List list1, String[] list2){
> >
> > *for* (Object obj : list1) {
> >
> > String string = (String)obj;
> >
> > *for* (*int* j = 0; j < list2.length; j++) {
> >
> > *if* (string != *null* && string.equals(list2[j])) {
> >
> > *return* *true*;
> >
> > }
> >
> > }
> >
> > }
> >
> > *return* *false*;
> >
> > }
> >
> > **
> >
> > *rule* "Engineering"
> >
> > *dialect* "mvel"
> >
> > *when*
> > **
> >
> > #conditions
> >
> > Person( ageInYears >= 18 ) *and*
> >
> > *eval* ( hasOneOf(Person(tagList), TagCodes(engrTags)) )
> >
> > *then*
> >
> > #actions
> >
> > personActions.addAction("EngineeringGroup");
> >
> > *
> >
> > end
> > *
> >
> > _______________________________________________
> > rules-users mailing list
> > rules-users at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/rules-users
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/function-problem-tp20633662p20774756.html
> Sent from the drools - user mailing list archive at Nabble.com.
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>



-- 
 Edson Tirelli
 JBoss Drools Core Development
 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/20081201/abb24f92/attachment.html 


More information about the rules-users mailing list