2015-06-08 3 views
1

Я новичок в Drools и попал в проблему.Drools: Правило срабатывает несколько раз

Я упростил правила, чтобы показать проблему:

rule "test" 

    when 
     $ev  : TestEvent() 

     $evList : ArrayList(size >= 3) from collect 
        (
        TestEvent(linkId == $ev.getLinkId()) 
       ) 
    then 
     System.out.println("Rule fired!") 

    end 

В принципе, я хочу считать события, происходящие на определенном Link (Ссылка является участок дороги). Когда в одной и той же ссылке происходит 3 события, я хочу, чтобы правило срабатывало.

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

Что мне не хватает?

Большое спасибо заранее.

ответ

1

Первый образец выбирает любой TestEvent независимо от его linkId. Если есть n фактов TestEvent с определенным linkId, авикация продолжается n раз.

Чтобы это правило не срабатывало, вы можете выбрать один TestEvent из любой такой группы из n. Любой атрибут с уникальным упорядоченным значением может использоваться, и если у вас есть события, также доступна метка времени.

rule "test" 
when 
    $ev: TestEvent($lid: linkId) 
    not TestEvent(linkId == $lid, this before $ev) 
    $evList : ArrayList(size >= 3) from collect 
       (
       TestEvent(linkId == $lid) 
      ) 
then 
    System.out.println("Rule fired!") 
end 
+0

Спасибо за ответ - полезный подход. Я действительно передумал, что я делаю, и изменил способ структурирования моего дизайна. Я опубликовал решение, с которым я пошел, но отметил это как ответ, потому что он, вероятно, полезен для других. –

0

Я получил эту работу, изменив свой подход к проблеме. Я создал объекты Link, а затем привязал события к ссылке.

правило заканчивается

rule "test" 

    when 
     $link : Link() 
     $events : ArrayList(size >= 3) from collect (TestEvent(link == $link)) 
    then 
     System.out.println("Rule fired!") 

end 

This только срабатывает один раз за ссылку, которая является то, что мне нужно.

+0

Это одна из наиболее сложных альтернатив. Другой использует правила для создания, обновления и (необязательно) удаления факта «Собрать» для каждого набора фактов TestEvent с определенным linkId. Таким образом, вам не нужно возиться с самим TestEvent, вам не нужен сбор, а другие возможности могут быть легко реализованы. – laune