[rules-users] 'distinct' keyword?.... or an alternative... here is an example

Olenin, Vladimir (MOH) Vladimir.Olenin at moh.gov.on.ca
Wed Mar 7 13:43:12 EST 2007


Hi,

 

I ran into the situation when I need the functionality similar to 'distinct'
keyword from SQL, ie I have a set of facts:

 

Record (f1 = 1, f2 = 1, value = 4)

Record (f1 = 1, f2 = 2, value = 1)

Record (f1 = 1, f2 = 13, value = 2)

Record (f1 = 1, f2 = 14, value = 5)

Record (f1 = 2, f2 = 5, value = 7)

Record (f1 = 2, f2 = 6, value = 3)

Record (f1 = 2, f2 = 15, value = 8)

Record (f1 = 2, f2 = 16, value = 9)

.. etc

 

And I need to calculate two sums _within the same 'f1' field_ for each
unique 'f1' field and compare them:

-          $sum1: f2 <   10

-          $sum2: f2 >= 10

-          If $sum1 > sum2 then do something

 

One of the ways to do that is to iterate through all unique f1 fields and
calculate two sums. Here is where I thought 'distinct' keyword might have
helped. Otherwise I need to assert another set of 'unique f1 fields' facts
to iterate through:

 

Rule XXX

            When

                        Distinct Record ( $f1 : f1 )

                        Integer ( intValue > 0) from accumulate (

                                    Record ( f1 == $f1, f2 < 10, $value1 :
value )

                                    Record ( f1 == $f1, f2 >= 10, $value2 :
value )

                                    Init ( int sum = 0; ),

                                    Action ( sum += $value1 - $value2 ),

                                    Result ( new Integer (sum) )

                        )

            Then

                        System.out.println("HURRAH!");

End

 

I realize that one would not be able to bind any other variable from
'distincted' record other than those in the constraint fields, but this is
not really required..... The only other solution for the problem above I
managed to come up with is to accumulate the sums in a helper object, which
has the buckets for each unique f1 value and do the eval after 'accumulate
on testing if any of the buckets is a positive number. In other words, not
to iterate through each unique 'f1', but iterate through all records and put
the sum to the correct bucket: Helper.getBucket($f1).addValues($value1,
value2).

 

The other thing is what Edson mentioned some time ago: DROOLS does not allow
internally for the same fact to be selected twice in a tuple. Surprisingly
one of the recent tests I ran against 3.1M did actually select the same fact
in the tuple (see the post from last Friday, March 02: "confused again.... -
why it selects all possible combinations"). Not sure if it's a bug or an
extended functionality... but this kind of thing should be helpful in
here....

 

Are there any other approaches I missed?... What's the best one in terms of
performance? Thanks,

 

Vlad

 

 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20070307/c5e9952b/attachment.html 


More information about the rules-users mailing list