May be I have not put the question right. We have a drool rule that is running 
extremely slow for large sets of data. The rule is something like:

For every object A, perform action if there does not exist an object B such 
that A.id = B.id.
And the corresponding drool rule is as follows:

when
    A()
    not(exists B(A.id = id))
then
    action......

The performance is bad because of not exists clause here. We have got OOM 
exceptions with relatively large amounts of data for this rule. To improve 
performance, we basically hacked the rule/code into something like this:

Create a global variable x that is a HashSet of all ids of object A, and the 
drool rule now is:

 global java.util.HashSet x;
when
        B()
        eval
        ( 
                ! (x.contains(b.id) ) 
        ) 
then
        action.....

This obviously is performing much better with hashes involved. But, I don't 
like the fact that we have to write the logic of this rule at two places. I 
would rather create this variable x (don't care whether it is global or 
temporarily bound) in the rule itself and use it in the condition to help 
performance and have all logic for the rule at one place. 

Is there a way to generate this hashset x in the condition part of the rule 
itself? Yes, I understand that I am trying to mix up the procedural part of 
code with drool code. But, I was just wondering if this is possible to keep the 
java code clean and have the intelligence of information that the rule needs to 
be evaluated in the rule itself.

Hope this clears some doubts.

Thanks

Malay Shah

-----Original Message-----
From: rules-users-boun...@lists.jboss.org 
[mailto:rules-users-boun...@lists.jboss.org] On Behalf Of Greg Barton
Sent: Friday, August 21, 2009 4:44 PM
To: Rules Users List
Subject: Re: [rules-users] populating global variable in Condition Section?

This is a galactically bad idea.  Using a global in this way is inherently 
unsafe as there's no guarantee that ebtween the time you set the var and when 
it's used later in the condition that the value is the same.  What is your 
reason for wanting to use a global in this way?  You should use a temporary 
bound variable instead.

--- On Fri, 8/21/09, Shah, Malay <malay.s...@morganstanley.com> wrote:

> From: Shah, Malay <malay.s...@morganstanley.com>
> Subject: [rules-users] populating global variable in Condition Section?
> To: rules-users@lists.jboss.org
> Date: Friday, August 21, 2009, 3:19 PM
> 
> 
>  
>  
> 
> 
> Hi,
>  
> Is it possible
> to populate a global variable in
> the condition section of the
> drool rule, and use it later in the condition itself?
> I currently have a
> global HashSet variable that I construct before firing the rule, but I 
> would like this code of constructing this global variable to be with 
> the drool rule itself. Any help on this would be much appreciated.
>  
> Thanks
>  
> Malay
> 
> 
> 
> NOTICE: If received in error, please
> destroy, and notify sender. Sender does not intend to waive
> confidentiality or privilege. Use of this email is
> prohibited when received in error. We may monitor and store emails to the 
> extent
> permitted by applicable law.
>  
> 
> -----Inline Attachment Follows-----
> 
> _______________________________________________
> 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

--------------------------------------------------------------------------
NOTICE: If received in error, please destroy, and notify sender. Sender does 
not intend to waive confidentiality or privilege. Use of this email is 
prohibited when received in error. We may monitor and store emails to the 
extent permitted by applicable law.

_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to