[rules-users] simple rule takes long time

Scott Reed sreed at avacoda.com
Mon Jun 30 11:34:54 EDT 2008


I forgot the updates and added a couple of $'s (see below).

Scott Reed wrote:
> 1) Finding all the duplicate pairs is causing combinatorial explosion. 
> With 30000 objects the rule will compare every object against every 
> other object which requires running the run about 450 MILLION times. 
> If you must discover every pair that is a duplicate, then I think you 
> have a hard problem. However, if you can stop considering an object 
> once you see it is a duplicate of at least one other datum, then you 
> can add a field to your object to record that it is already a 
> duplicate and remove it from further consideration, something like the 
> following:
>
> public class Data {
>    private int id =0;
>    private boolean isDuplicated = false;
>    public Data(int id) {
>        this.id = id;
>    }
>    public int getId() {
>        return id;
>    }
>    public boolean getIsDuplicated() {
>       return isDuplicated;
>    }
>    public void setIsDuplicated( boolean isDuplicated ) {
>       this.isDuplicated = isDuplicated;
>    }
> }
>
> rule "Unique data"
>    when
>        data : Data()
>        old : Data( isDuplicated == false, this != data, this.id == 
> data.id)
>    then
>        log.log("Following data are not unique: " + data.getId() + " 
> and " + old.getId());
>       $data.setIsDuplicated( true );
>       $old.setIsDuplicated( true );
The previous two lines should be:
        data.setIsDuplicated( true );
        update(data);
        old.setIsDuplicated( true );
        update(old);
> end
>
> --------------------
> 2) I'm pretty sure the test, this != $data, is redundant since it's 
> understood that the condition is relating two *different* objects of 
> the same class. Tagging the id fields will make rule a little more 
> efficient and easier to read. There's no need to use 'this.id', it's 
> understood that 'id' is the id field of old.
>
> rule "Unique data"
>    when
>        $data1: Data( $id1: id )
>        $data2: Data( isDuplicated == false, id == $id1 )
>    then
>        log.log( "Duplicated id: " + $id1 );
>       $data1.setIsDuplicated( true );
>       $data2.setIsDuplicated( true );
> end
>
> ( I like to use dollar signs at the front of tag names because it 
> makes it easier to distinguish what is what. You don't have to. )
>
>
> ygaurav wrote:
>> Hi All
>> I am new to drools and I am trying to see if we can use it. I have a 
>> simple
>> file
>>
>> public class Data {
>>     private int id =0;
>>     public Data(int id) {
>>         this.id = id;
>>     }
>>     public int getId() {
>>         return id;
>>     }
>> }
>>
>> rule "Unique data"
>>     when
>>         data : Data()
>>         old : Data(this != data, this.id == data.id)
>>     then         log.log("Following data are not unique: " + 
>> data.getId() + " and " +
>> old.getId());
>> end
>>
>>
>> When I try to load 30,000 of data in memory it takes long time ( 
>> around 12
>> hours )  Can anybody suggests a better way of doing it.
>>
>> Thanks
>> Gaurav
>>   
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>




More information about the rules-users mailing list