Правило записи в Drools - условная сумма

Я застрял в написании правила для конкретной постановки задачи. У меня есть файл excel с идентификатором столбца, специальностью, зарплатой. Специальность может принимать такие значения, как «онкология», «урология» и т. д. Мне нужно рассчитать общую зарплату, соответствующую каждой специальности. Есть два способа сделать это.

Первый:

rule "Total salary of Oncology" 

no-loop
lock-on-active
salience 100
    when

    $m : Masterclass( $id : phyid , $p : p,spec=="Oncology")
     not Masterclass( spec=="Oncology", phyid < $id)
    $total : Number() from accumulate ( Masterclass(  $salary : salary ,spec=="Oncology") ,
                init( double total =0;), 
                action(total+=$salary;),
                result(  new Double (total)))
    then
    System.out.println($m.getSpec());
    System.out.println("Total target pay is : " + $total + " of specialty : "+ $m.getSpec());
    retract($m);
end 

И так же по другим специальностям. Это правило работает нормально.

Второе: Напишите только одно правило, которое считывает значение специальности, а затем суммирует соответствующие ей зарплаты. Я пытался реализовать это, но не удалось. Любая помощь будет оценена.


person Parul Singh    schedule 08.02.2016    source источник
comment
Читать откуда? Ваша клавиатура? Файл? Белая доска ;-) ?   -  person laune    schedule 08.02.2016


Ответы (1)


Это далеко не идеально. Но обратите внимание, что вам не нужно вставлять какую-то конкретную строку. Запуск правила без соответствующей строки все равно приведет к получению накопленных сумм для всех специальностей.

И вы должны обернуть String в класс Java - мне было просто лень изобретать правильный класс Java с одним полем.

rule "trigger read"
when
  not String()
then
  String s = read_any_way_you_want();
  insert( s );
end;

rule "Total salary of something" 
when
  $spec: String()
  $m : Masterclass( $id: phyid , spec == $spec)
  not Masterclass( spec == $spec, phyid < $id)
  $total : Number() from
     accumulate ( Masterclass($salary: salary, spec == $spec) ,
            init( double total =0;), 
            action(total+=$salary;),
            result( new Double (total)))
then
  System.out.println($m.getSpec());
  System.out.println("Total target pay is : " + $total + 
                     " o specialty : "+ $m.getSpec());
  retract($spec);
end 
person laune    schedule 08.02.2016