2017-02-12 8 views
0

У меня есть набор правил Drools, которые работают правильно, если я добавлю один факт движку слюни, если я добавлю два факта, правила применяются только к первому факту. Как я могу сделать набор правил для нескольких фактов?Как использовать свойства слюни для нескольких объектов

Мой traitable факт:

@Traitable 
public class Policy { 

    private String postalCode; 
    private String houseHold; 
    private BigDecimal grossPremium; 

    public Policy(String postalCode, String houseHold) { 
     this.postalCode = postalCode; 
     this.houseHold = houseHold; 
    } 
} 

Мой набор правил:

import java.math.BigDecimal; 

declare trait PolicyWithFactors 
    policy : Policy 
    postalCodeFactor : Double 
    houseHoldFactor : Double 
end 

rule rule1 
when 
    $f : PolicyWithFactors(policy.postalCode == "1000", postalCodeFactor == null) 
then 
    System.out.println("Running rule1 for " + $f.getPolicy().getHouseHold() + " and " + $f.getPolicy().getPostalCode()); 
    modify($f) { setPostalCodeFactor(20.0); } 
end 

rule rule2 
when 
    $p : Policy() 
    not PolicyWithFactors() 
then 
    System.out.println("Running rule2 for " + $p.getHouseHold() + " and " + $p.getPostalCode()); 
    PolicyWithFactors $pwf = don($p, PolicyWithFactors.class); 
    modify ($pwf) { setPolicy($p); } 
end 

rule rule3 
when 
    $p : Policy(houseHold == "single") 
    $f : PolicyWithFactors(houseHoldFactor == null) 
then 
    System.out.println("Running rule3 for " + $p.getHouseHold() + " and " + $p.getPostalCode()); 
    modify($f) { setHouseHoldFactor(10.0); } 
end 

rule rule4 
when 
    $p : Policy(grossPremium == null) 
    $f : PolicyWithFactors(policy == $p, $pcf : postalCodeFactor != null, $hhf : houseHoldFactor != null) 
then 
    System.out.println("Running rule4 for " + $pcf + " and " + $hhf); 
    BigDecimal $gp = new BigDecimal($pcf * $hhf); 
    modify($p) { setGrossPremium($gp); } 
end 

rule rule5 
when 
    $p : Policy(houseHold == "family") 
    $f : PolicyWithFactors(houseHoldFactor == null) 
then 
    System.out.println("Running rule5 for " + $p.getHouseHold() + " and " + $p.getPostalCode()); 
    modify($f) { setHouseHoldFactor(15.0); } 
end 

TestCase, что не удается:

public class RuleTest { 

    @Test 
    public void test() { 
     KieServices kieServices = KieServices.Factory.get(); 
     KieContainer kieContainer = kieServices.getKieClasspathContainer(); 
     KieSession kieSession = kieContainer.newKieSession(); 
     Policy policy1 = new Policy("1000", "single"); 
     kieSession.insert(policy1); 
     Policy policy2 = new Policy("1000", "family"); 
     kieSession.insert(policy2); 
     kieSession.fireAllRules(50); 
     assertThat(policy1.getGrossPremium(), is(new BigDecimal("200"))); 
     assertThat(policy2.getGrossPremium(), is(new BigDecimal("300"))); 
    } 
} 

ответ

0

Виной rule2. Он не срабатывает, как только в рабочей памяти находится PolicyWithFactors.

rule rule2 
when 
    $p : Policy() 
    not PolicyWithFactors(policy == $p) 
then ... end 

Я не пытался понять все остальное, но, пожалуйста, проверьте, следует ли это ограничение присутствовать во всех последующих правилах, о, чтобы соответствовать одному полису с одним PolicyWithFactors.

+0

Теперь он вычисляет первую премию дважды. Вот результат: Запуск rule2 для одного и 1000 Запуск Правиле1 для одного и 1000 Запуск Rule2 для семьи и 1000 Запуск Правиле1 для семьи и 1000 Запуск Правилу3 для одного и 1000 Запуск Правилу3 для одного и 1000 Запуск rule4 для 20.0 и 10,0 Правило бега4 для 20,0 и 10,0 –

+0

Решено. Нужно читать значения из $ f.policy вместо $ p –

Смежные вопросы