Re: [rules-users] How to check for a variable number of "conditions" ina rule?
Ron, if your global is set before ***asserting facts to the working memory and not changed anymore, you can use it. Also, make sure your array or whatever is an attribute of a class, and so has some semantic to it. You can do things like this: when MyArrayContainer( $flags : flags ) Number( intValue >= SOME_GLOBAL_THRESHOLD ) from accumulate( $f : Flag( value == SOME_GLOBAL_VALUE ) from $flags, count( $f ) ) then // threshold met end Another options is just create a holder class for your globals and assert it as a fact instead of using globals: when MyParameters( $threshold : threshold, $value : value ) MyArrayContainer( $flags : flags ) Number( intValue >= $threshold ) from accumulate( $f : Flag( value == $flags ) from $flags, count( $f ) ) then // threshold met end Hope it helps, Edson 2008/7/23 Ron Kneusel <[EMAIL PROTECTED]>: > > Mike, > > I think the collect will work, I'll have to look at it more closely because > the ordering of elements in the array is significant so I'm not sure I can > just break the elements up into facts and let collect group them however it > will. > > As a follow up, while my solution of using a global in the LHS works, is > the problem with changing the global simply that the engine will not see the > changes? For my case, the global is set before the rules engine is called > and it will not change while the engine runs. > > Ron > > Mike wrote: > > >Have a look at the "Alarms" example for "Collect" in the (4.0.5) manual. > > > >This should give you a good starting point. > > > >Cheers, > > > >Mike > > _ > With Windows Live for mobile, your contacts travel with you. > > http://www.windowslive.com/mobile/overview.html?ocid=TXT_TAGLM_WL_mobile_072008 > ___ > rules-users mailing list > rules-users@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 ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
RE: [rules-users] How to check for a variable number of "conditions" ina rule?
Mike, I think the collect will work, I'll have to look at it more closely because the ordering of elements in the array is significant so I'm not sure I can just break the elements up into facts and let collect group them however it will. As a follow up, while my solution of using a global in the LHS works, is the problem with changing the global simply that the engine will not see the changes? For my case, the global is set before the rules engine is called and it will not change while the engine runs. Ron Mike wrote: >Have a look at the "Alarms" example for "Collect" in the (4.0.5) manual. > >This should give you a good starting point. > >Cheers, > >Mike _ With Windows Live for mobile, your contacts travel with you. http://www.windowslive.com/mobile/overview.html?ocid=TXT_TAGLM_WL_mobile_072008 ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
RE: [rules-users] How to check for a variable number of "conditions" ina rule?
Hi Ron, Have a look at the "Alarms" example for "Collect" in the (4.0.5) manual. This should give you a good starting point. Cheers, Mike -Original Message- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Ron Kneusel Sent: 22 July 2008 23:01 To: rules-users@lists.jboss.org Subject: [rules-users] How to check for a variable number of "conditions" ina rule? Greetings! I want to create a rule that checks a fact which contains an array to see if n or more of the elements of that array have a specific value. The number of elements to check will vary from invocation to invocation of the rules engine and will likely be added as a global. I can do this by using a helper function. Say, for example, I have: rule "fire_when_testFlags_true" when eval(testFlags(flags, limit.intValue())); then System.out.println("Yup, " + limit + " or more flags are true!"); end Where flags and limit are both globals. Then I can define testFlags as: function boolean testFlags(Flags flags, int threshold) { int count = 0; for(int i=0; i < flags.getSize(); i++) { if (flags.getValue(i)) { count++; if (count>= threshold) { return true; } } } return false; } This works but violates the warning not to use a global that isn't immutable in the LHS of a rule. Does anyone have an idea about how to implement a rule that in effect has an arbitrary number of conditions to be tested? Ron _ Keep your kids safer online with Windows Live Family Safety. http://www.windowslive.com/family_safety/overview.html?ocid=TXT_TAGLM_WL _family_safety_072008 ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users