Последовательность событий Drools с функцией накопления

Я хотел бы построить правило для следующего варианта использования: я ожидаю два события «AddToCart», а затем событие «Search», точно в описанной последовательности. P.S. это не реальный вариант использования в бизнесе.

В настоящее время я пытаюсь найти решение со следующим правилом:

rule "Rule-102"
salience 1000110000
    agenda-group "level0"
    dialect "mvel"
    when
         Number(doubleValue >= 2) from accumulate ($event1: Event(eval($event1.getName().equals('AddToCart'))),count($event1));$event: Event()
         $event2: Event(eval($event2.getName().equals('Search')), this after $event)
    then
        sendEvent($event2, ed, drools);
end

Это правило работает некорректно, так как неправильно определена последовательность событий: Search -> AddToShoppingCart -> AddToShoppingCart = Action

Мне нужна только строгая последовательность: AddToShoppingCart -> AddToShoppingCart -> Search = Action


person Denis Liger    schedule 07.09.2016    source источник


Ответы (1)


Если ваши правила включают небольшой набор шаблонов (в данном случае 2 AddToCart и 1 Search), вы можете попробовать что-то вроде этого:

rule "Rule-102"
when
    $e1: Event(name == "AddToCart")
    $e2: Event(name == "AddToCart", timestamp > $e1.timestamp)
    $s1: Event(name == "Search", timestamp > $e2.timestamp)
then
    sendEvent($s1, ed, drools);
end

Несмотря на элегантность, это решение имеет некоторые потенциальные проблемы:

  • Он не будет хорошо масштабироваться, если вы хотите использовать больше событий AddToCart.
  • Если у вас есть 3 (или более) события AddToCart, это правило будет срабатывать несколько раз (я не уверен, что это желаемое поведение в вашем случае использования)

Если вы хотите использовать более общий подход, вы можете попробовать что-то в этом роде:

rule "Rule-102"
when
    $s1: Event(name == "Search")
    Number(intValue >= 2) from accumulate(
        Event(name == "AddToCart", timestamp < $s1.timestamp),
        count(1)
    )
then
    sendEvent($s1, ed, drools);
end

Надеюсь, поможет,

person Esteban Aliverti    schedule 08.09.2016
comment
$event1: Event(eval($event1.getName().equals('AddToCart'))) $event2: Event(eval($event2.getName().equals('AddToCart')), это после $event1) $ event3: Event(eval($event3.getName().equals('Search')), это после $event2) - person Denis Liger; 08.09.2016