2015-09-17 2 views
0

У меня есть иерархия классов, как показано ниже:Итерация над списком в Drools', когда состояние

class Order{ 
    List<Item> items; 
    boolean eligibility; 
    //geters and setters 
} 

class Item{ 
    boolean eligibility; 
    //getters and setters 
} 

Теперь, что я хочу сделать, это установить статус приемлемости порядка, основанного на статусе правомочности своих позиций. Если все элементы в заказе имеют право на участие в качестве ложных, то право на участие в ордере должно быть установлено на false. Основываясь на другой должности, я написал правило так:

rule "Check order eligibility based on item eligibility" 
dialect "java" 
    when 
     $order : Order($items : items) 
      Boolean(booleanValue)  
      from accumulate(
       init(int eligibleItems = 0;), 
       action(for(Object item:$items) 
         if(((Item)item).getEligibility()) eligibleItems++; 
        ), 
       result(eligibleItems == 0) 
      ) 
    then 
     $order.setEligibility(false); 
end 

Однако, когда я запускаю это я получаю mismatched input 'eligibleItems' in rule. Как еще я могу перебирать список внутри условия when? Я использую Drools 6.2.0.

ответ

0

Чтобы объяснить ошибку, посмотрите на эту часть правила:

 Boolean(booleanValue)  
     from accumulate(
      init(int eligibleItems = 0;), 

Синтаксис в аккумулировать с помощью Init-действие-результат требует шаблон сразу после открывающей скобки после ключевого слова аккумулировать. Отсюда и синтаксическая ошибка. (Вы можете увидеть причину, почему он говорит, когда он говорит, что, когда вы подходите init с именем типа рисунка:. Синтаксический анализатор не может продолжаться eligibleItems)

Вместо того, чтобы попытаться исправить это, правило может быть записано в гораздо более простой способ:

rule "Check order eligibility based on item eligibility" 
when 
    $order : Order($items : items, eligibility) 
    not Item(eligibility) from $items 
then 
    modify($order){ setEligibility(false) } 
end 

это удостоверяется, что нет товара с правомочности значение ИСТИНА среди них в порядке. На всякий случай, если вы хотите сделать изменения видимыми для IE, я использовал модификацию и добавил ограничение, чтобы избежать цикла.

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