[rules-users] function problem

Dan Seaver dan.seaver at ge.com
Mon Dec 1 13:48:15 EST 2008


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.




More information about the rules-users mailing list