Dirk,

OK.  However, I still think that what I'm trying to do is reasonable.  Using
the above syntax, I want to write:

[bindingVar :] <fieldName> memberOf <someCollection>

Is there any reason that this would be difficult or foolish to implement?  Not
that I expect it to appear in the next release, I'm just wondering if it's
something that should be available someday.

  Agree. It is syntax sugar but makes things more declarative IMO. May I ask 
you please to open a JIRA feature request for that? It is not really difficult 
to implement, so eventually we may do it for next release.

The docs for predicate constraints (3.17) say
"Functions used in a Predicate Constraint must return time constant results."
And this certainly isn't time constant.  Or does drools pay attention to what
goes into the predicate, and re-evaluate it accordingly?

There is a little trick here... :) as the collection is bound in the LHS of the rule, if it changes, you will call modifyObject for the container causing the rule to be reevaluated. So, you can use the predicate.

1 when
2  Container( $things : things -> ( $things.size() > 0 ) )
3  $count : ArrayList( size > 0 ) from
4       collect( Record( num : number -> ( $things.contains(num) ) ) )
5 then
6  ...


If the Container was a global or something else, not bound in the rule LHS, it would be a problem to use the predicate. :)

   []s
   Edson

Dirk Bergstrom wrote:

Edson Tirelli was heard to exclaim, On 12/05/06 04:14:
    JBRules is working correctly in this case.
    The syntax for any operator is always:
[bindingVar :] <fieldName> <operator> <value>

OK.  However, I still think that what I'm trying to do is reasonable.  Using
the above syntax, I want to write:

[bindingVar :] <fieldName> memberOf <someCollection>

Is there any reason that this would be difficult or foolish to implement?  Not
that I expect it to appear in the next release, I'm just wondering if it's
something that should be available someday.

JBRules will try to find field "$things" in class Record, that obviously does not exists, returning the error saying it can't create the field extractor (on a side note, maybe we can improve the error message... suggestions welcome).

The parser error messages are often extremely confusing, but this is one of
the better ones.

Unfortunatelly, I can't think of another way (based only on the information you provided) to do it, except this:
 collect( Record( num : number -> ( $rlis.contains(num) ) ) )
Please note that if the container is the one changing it's contents, you should need to only modify the container, not each record object.

The docs for predicate constraints (3.17) say

"Functions used in a Predicate Constraint must return time constant results."

And this certainly isn't time constant.  Or does drools pay attention to what
goes into the predicate, and re-evaluate it accordingly?

Dirk Bergstrom wrote:

I have a container class that has a field that exposes a collection of record
numbers.  In the working memory, I have a bunch of record objects, and one
container object.  I want to write a rule that fires when it encounters a
container that has records matching some criteria.  Here's what I thought
would work:

1 when
2  Container( $things : things -> ( $things.size() > 0 ) )
3  $count : ArrayList( size > 0 ) from
4   collect( Record( $things contains number, otherfield == "somevalue" ) )
5 then
6  ...

Unfortunately, that gets me an error:

InvalidRulePackage: Unable to create Field Extractor for '$things'

(I determined that the problem is in line 4)

Seems to me that what I'm doing is reasonable, and ought to work.  Is this a
bug, an oversight in drools, or is it in fact unreasonable?

The following "works":

collect( Record( num : number -> ( $rlis.contains(num) ) ) )

But since the predicate is not time-constant (the list of things in the
Container will change), I'd have to modify() every Record every time I wanted
to re-run the rules.  That would not be very performant...

Note that this is actually unrelated to "collect" -- this doesn't work either:

1 when
2  Container( $things : things )
3  Record( $things contains number )
4 then

(I'm using trunk, revision 8056, updated this morning)







--
Edson Tirelli
Software Engineer - JBoss Rules Core Developer
Office: +55 11 3124-6000
Mobile: +55 11 9218-4151
JBoss, a division of Red Hat @ www.jboss.com



---------------------------------------------------------------------
To unsubscribe from this list please visit:

   http://xircles.codehaus.org/manage_email

Reply via email to