Подсчитайте количество фактов в скользящем окне с помощью Drools Fusion

Мне нужно написать правило, которое подсчитывает количество фактов, которые я получил в своем потоке за последние 10 секунд, если они соответствуют определенному критерию.

Так, например, если 2 черные машины проезжают перекресток за последние 10 секунд, я хочу предупредить кого-нибудь.

У меня есть следующее правило:

rule "check black cars in 10 seconds" dialect "java"
when

    $car : Car(color == Color.BLACK) over window:time(10s);
then

    System.out.println("got something");

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

Спасибо.


person El Guapo    schedule 15.02.2014    source источник


Ответы (1)


when
accumulate( Car(color == Color.BLACK) over window:time(10s);
            $cnt: count(1); $cnt == 2 )
then

Это сработает, когда вторая машина прибудет в течение 10 секунд после первой машины, и еще раз, когда третья машина прибудет в течение 10 секунд после второй машины, но позже, чем через 10 секунд после первой машины, но это то, что можно получить из вашего (расплывчатого ) спец.

person laune    schedule 15.02.2014
comment
Спасибо... это ИМЕННО то, что я искал! - person El Guapo; 16.02.2014
comment
Итак... пытаясь понять это... что именно делает $cnt: count(1)??? И что мне делать, если я не хотел ждать 10 секунд после 1-й машины, чтобы получить уведомление о 3-й? - person El Guapo; 18.02.2014
comment
Вопрос: предположим, я не знаю значения возможных цветов и хочу, чтобы правило срабатывало, если две машины одного цвета (независимо от того, какой именно цвет) встречаются в окне 10 с. я придумал, когда $c : Car( $color : color ) аккумулировать( Car(color == $color) over window:time(10s); $cnt: count(1); $cnt == 2 ), то .. .. это решение срабатывает в мае... - person Scholle; 16.06.2018
comment
@Scholle Я предлагаю вам задать это как новый вопрос. - person laune; 04.07.2018