2011-10-20 3 views
0

J'ai 2 collections du même type et chaque objet de la collection est clé par un identifiant. Mon but est de trouver le même objet dans les deux collections, puis de comparer un champ les uns par rapport aux autres. Si ce n'est pas le même champ, stockez les différences.Drools Collection Effiency

Mon problème est la performance, pour chaque règle, je revérifie la collection pour le même objet. Existe-t-il un moyen si l'objet correspond à exécuter toutes les validations de champ au lieu de trouver l'élément dans la collection plusieurs fois?

Code Fait:

public class ReconcilerFact 
{ 
    private List<Security> securitySystem1; 
    private List<Security> securitySystem2; 

    public ReconcilerFact(List<Security> securities1, List<Security> securities2) 
    { 
     this.securitySystem1 = securities1; 
     this.securitySystem2 = securities2; 
    } 

    public List<Security> getSecuritySystem1() 
    { 
     return securitySystem1; 
    } 

    public List<Security> getSecuritySystem2() 
    { 
     return securitySystem2; 
    } 
} 

Drools code:

rule "ISIN Rule"   
    no-loop 
    when 
     ## conditions   
     ##       
     $recon : ReconcilerFact() 
     $security1 : Security() from $recon.securitySystem1 
     $security2 : Security(sSecId == $security1.sSecId, sISIN != $security1.sISIN) from $recon.securitySystem2  
    then 
     ## For the valid condition 
     ##  
     result.add($security1, SecurityFields.ISIN, $security1.getsISIN(), $security2.getsISIN());   
end 

rule "Cusip Rule"  
    no-loop 
    when 
     ## conditions   
     ##       
     $recon : ReconcilerFact() 
     $security1 : Security() from $recon.securitySystem1 
     $security2 : Security(sSecId == $security1.sSecId, sCusip != $security1.sCusip) from $recon.securitySystem2  
    then 
     ## For the valid condition 
     ##  
     result.add($security1, SecurityFields.CUSIP, $security1.getsCusip(), $security2.getsCusip());   
end 

rule "Sedol Rule"  
    no-loop 
    when 
     ## conditions   
     ##       
     $recon : ReconcilerFact() 
     $security1 : Security() from $recon.securitySystem1 
     $security2 : Security(sSecId == $security1.sSecId, sSedol != $security1.sSedol) from $recon.securitySystem2  
    then 
     ## For the valid condition 
     ##  
     result.add($security1, SecurityFields.SEDOL, $security1.getsSedol(), $security2.getsSedol());   
end 

Répondre

0

Au lieu d'utiliser la condition de l'élément que vous pouvez insérer simplement tous les objets de sécurité et de les étiqueter avec un champ Groupe. Donc, vous finirez par avoir: $ s1: Sécurité (groupe == "Groupe1") $ s2: Sécurité (groupe == "Group2", sSecId == $ security1.sSecId)

qui traitera chaque titre En fait, si vous modifiez une seule instance, seule cette instance sera réévaluée.

Cheers