[rules-users] Is there a better way?

Dirk Bergstrom dirk at juniper.net
Fri Jan 25 15:01:19 EST 2008


I collect objects of type RLI that are related to instances of type NPI, and
"attach" them to their NPIs, and (in a later agenda group) collect subsets of
RLIs based on attributes of RLIs, NPIs, and other objects.  In the first agenda
group, I need to update() the NPI object after the new list of RLIs is attached,
but I only want to do this when a *new* list is attached.

The only way I can find to do this requires an eval.  Is there a better way?

Here's the rule that I have now.  This works:

rule "RLIs for NPI"
 agenda-group "010"
 lock-on-active true
 salience 50
when
 $npi : NPIRecord( )
 $rli_list : RecordSet( eval( ! $rli_list.equals($npi.getRelatedRLIs())) ) from
  collect( RLIRecord( npi_program == $npi.synopsis ) )
then
 $npi.setRelatedRecords($rli_list, DataSource.RLI);
 update($npi);
end

I'd like to write something like this:

...
 $rli_list : RecordSet( $rli_list != $npi.relatedRLIs ) from
...

But that doesn't compile.  To get around that, I added a method called
getContents to RecordSet that just returns "this", so I could write:

...
 $rli_list : RecordSet( contents != $npi.relatedRLIs ) from
...

But that always returns true.  Best I can tell, it gets compiled into an
inequality test, as opposed to a call to equals(), and the new list is never the
same object as the old list, even though they may have the same contents.

I also tried this (setRelatedRecords returns true if the list is different):

...
then
 $npi.setRelatedRecords($rli_list, DataSource.RLI) && update($npi);
end

But that won't compile at all.

-- 
Dirk Bergstrom               dirk at juniper.net
_____________________________________________
Juniper Networks Inc.,          Computer Geek
Tel: 408.745.3182           Fax: 408.745.8905



More information about the rules-users mailing list