2011-10-20 66 views
0

我有2個相同類型的集合,集合中的每個對象都由一個id關鍵。我的目標是在兩個集合中找到相同的對象,然後比較一個字段和另一個字段。如果他們不是同一個領域,那麼存儲差異。Drools集合效率

我的問題是性能,對於每一個規則,我重新掃描同一個對象的集合。有沒有辦法,如果對象匹配,然後運行所有字段驗證,而不是多次找到集合中的項目?

事實代碼:

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的代碼:

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 

回答

0

而不是使用從條件元素,你可以只需要插入所有的安全對象,並用組現場標記它們。所以,你最終將不得不: $ S1:安全(組== 「組別」) $ S2:安全(組== 「組2」,sSecId == $ security1.sSecId)

這將會把每一個安全作爲一個事實,如果您修改了一個單一實例,那麼只會重新評估該實例。

乾杯