0

同じタイプのコレクションが 2 つあり、コレクション内の各オブジェクトは ID によってキーになっています。私の目標は、両方のコレクションで同じオブジェクトを見つけて、フィールドを互いに比較することです。それらが同じフィールドでない場合は、違いを保存します。

私の問題はパフォーマンスです。ルールごとに、同じオブジェクトのコレクションを再スキャンします。オブジェクトが一致した場合、コレクション内のアイテムを複数回見つける代わりに、すべてのフィールド検証を実行する方法はありますか?

ファクトコード:

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;
    }
}

よだれコード:

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
4

1 に答える 1

0

from Conditional Elementを使用する代わりに、すべてのセキュリティオブジェクトを挿入し、それらにGroupフィールドのタグを付けることができます。したがって、次のようになります。$ s1:Security(group == "Group1")$ s2:Security(group == "Group2"、sSecId == $ security1.sSecId)

これにより、各セキュリティがファクトとして扱われ、1つのインスタンスを変更すると、そのインスタンスのみが再評価されます。

乾杯

于 2011-10-21T10:33:23.033 に答える