Слюни JBOSS управляют вложенными IF - PullRequest
1 голос
/ 19 марта 2012

Я новичок в Jboss Rule.Я просмотрел документацию, но не смог найти подход, чтобы начать писать правило для следующего примера кода.

For each User code in the list 
{
    If User code = ‘11’ 
    {
        If User code ‘17’ present in the group 
        {
            Add letter id 1
        }
        Else If User code ‘18’ present in the group 
        {
            Add letter id 2
        }
    }
    Else 
    {
        Add letter id 3 which is the letter need to be sent for code 11
    }
}

Я был бы очень признателен, если бы кто-нибудь дал мне подсказку / идею, как это сделать?

РЕДАКТИРОВАТЬ:

Привет,

Пока это то, что я могу разработать для случая пользователя, описанного выше.

  1. Я вставляю (Список UserDetailVo) в сеанс drools.
  2. Объект (UserDetailVo) содержит (Список UserInfoVo).Каждый UserInfoVo содержит код.

Теперь я хочу перебрать (Список UserInfoVo) и обновить (letterId) до каждого (UserDetailVo), так как я пытаюсьсделать ниже.

Case1: когда codeList имеет 110,121

rule "USER LETTER GROUPING 110,121" 
salience 300
no-loop true

    when
        userDetailVo : UserDetailVo ()
        UserInfoVo(code=="110") from userDetailVo.codeList
        UserInfoVo(code=="121") from userDetailVo.codeList
    then
        userDetailVo.addLetterId(1);
        //modify(trrDetailRequestVo)
end

Case2: когда codeList имеет 110,127

rule "USER LETTER GROUPING 110,127" 
        salience 300
        no-loop true

            when
                userDetailVo : UserDetailVo ()
                UserInfoVo(code=="110") from userDetailVo.codeList
                UserInfoVo(code=="127") from userDetailVo.codeList
            then
                userDetailVo.addLetterId(2);
                //modify(trrDetailRequestVo)
        end

Case3: когда в codeList есть только 110

rule "USER LETTER GROUPING 110" 
    salience 300
    no-loop true

        when
            userDetailVo : UserDetailVo (this.letterID.size() == 0) // Checking size of the list
            UserInfoVo(code=="110") from userDetailVo.codeList
        then
            userDetailVo.addLetterId(3);
            //modify(trrDetailRequestVo)
    end

Проблемы, с которыми я сталкиваюсь, - это если я изменю / обновляю пользователя в конце правила.Это входит в бесконечный цикл.Если я удаляю изменение / обновление, в случае 3, хотя размер списка, если больше 0, правило все еще запускается.

1 Ответ

6 голосов
/ 20 марта 2012

Понятие «еще» на самом деле не переводится напрямую на декларативный язык. Вместо этого вы должны явно определить, что на самом деле означает «другое» в терминах ваших данных, и написать правило (или правила) на основе этого условия. В качестве примера рассмотрим следующие условия:

If Order Total >= 1000
  Discount = 15%
Else If Order Total >= 500
  Discount = 10%
Else If Order Total >= 250
  Discount = 5%
Else
  Discount = 0%

Естественной первой попыткой применения правил для этих условий может быть:

rule "15% discount"
  when
    $o : Order( total >= 1000 )
  then
    modify($o) { setDiscount(.15); }
end

rule "10% discount"
  when
    $o : Order( total >= 500 )
  then
    modify($o) { setDiscount(.10); }
end

etc...

Проблема с этим подходом состоит в том, что правила 10% и 15% будут соответствовать для Ордера, общее количество которого составляет 1200. Это связано с тем, что часть "else" в "else if" по своей сути включает условие, что сумма ордера равна не больше 1000. Поэтому вместо этого мы пишем наши правила:

rule "15% discount"
  when
    $o : Order( total >= 1000, discount == null )
  then
    modify($o) { setDiscount(.15); }
end

rule "10% discount"
  when
    $o : Order( total >= 500, total < 1000, discount == null )
  then
    modify($o) { setDiscount(.10); }
end

rule "5% discount"
  when
    $o : Order( total >= 250, total < 500, discount == null )
  then
    modify($o) { setDiscount(.05); }
end

rule "no discount"
  when
    $o : Order( total < 250, discount == null )
  then
    modify($o) { setDiscount(0); }
end

(Вы заметите, что я также добавил условие discount == null. Это необходимо для предотвращения повторной активации правила при обновлении факта заказа.)

Я сосредоточился на простом примере, а не на конкретном сценарии использования, чтобы продемонстрировать концепцию написания условия, имитирующего «другое». Я все еще не уверен, что полностью понимаю ваш вариант использования, но, надеюсь, я ответил на ключевую концептуальную часть вашего вопроса.

...