Эффективность коллекции Drools - PullRequest
0 голосов
/ 20 октября 2011

У меня есть 2 коллекции одного типа, и каждый объект в коллекции является ключом по идентификатору. Моя цель - найти один и тот же объект в обеих коллекциях, а затем сравнить поля друг с другом. Если они не совпадают, сохраните различия.

Моя проблема связана с производительностью, для каждого правила я повторно сканирую коллекцию на предмет того же объекта. Есть ли способ, если объект соответствует, затем выполнить все проверки полей вместо того, чтобы найти элемент в коллекции несколько раз?

Код факта:

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

1 Ответ

0 голосов
/ 21 октября 2011

Вместо использования условного элемента from вы можете просто вставить все объекты безопасности и пометить их полем Group.Таким образом, в конечном итоге вы получите: $ s1: Security (group == "Group1") $ s2: Security (group == "Group2", sSecId == $ security1.sSecId)

, который будет обрабатывать каждую защитукак факт, и если вы измените один единственный экземпляр, только этот экземпляр будет переоценен.

Cheers

...