2016-02-29 3 views
0

Я новичок в Drools (версия 6.3), и у меня есть проблемы с конкретным правилом. У меня есть класс под названием «Шаги» с простым полем double steps;. Каждый шаг события представляют собой шаги, предпринятые после предыдущего события и У меня есть рабочее правило, которое говорит, что вы должны двигаться, когда вы не делаете 50 шагов в последний час:Язык правил Drools Fusion: правило шагомера

declare Steps 
    @role(event) 
end 

rule "STEPS RULE" 
when 
    $totalSteps : Number(doubleValue < 50) from accumulate(
     Steps(stepsCount : steps) over window:time(1h) from entry-point  
    "entrySteps", sum(stepsCount)) 

then 
    System.out.println("STEPS RULE: get moving!"); 
end 

Теперь вместо того, чтобы каждый событие - это шаги, предпринятые после предыдущего события, я хочу, чтобы они представляли собой кумулятивные шаги. Поэтому, если событие имеет 50 шагов, и вы делаете 20 шагов, я хочу, чтобы следующее событие состояло из 70 шагов. Вопрос в том, как я могу изменить свое правило, чтобы оно все равно работало?

+0

Необходимо уточнить условия. Если «Шаги» - это входящее событие, его данные фиксированы, поэтому, если он содержит 50 шагов, то это все. Вы можете * вывести * что-то из двух событий в последовательности, так что один шаг с 50 и следующий с 20 вырабатывает сумму 70, но это не кажется вашей проблемой. – laune

ответ

1

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

rule "create pedometer" 
when 
    Steps($s: steps) 
    not Pedometer() 
then 
    insert(new Pedometer($s)); 
end 

rule "update pedometer" 
no-loop 
when 
    Steps($s: steps) 
    $p: Pedometer($r: readout) 
then 
    modify($p){ 
     setReadout($r + $s) 
    } 
end 

Edit Если Steps уже содержит накопленные значения, это немного сложнее, так как вам нужно вычислить разницу между первым и последними показаниями шагомера в окне.

rule "ACC STEPS RULE" 
when 
    accumulate(Steps($s : steps) 
       over window:time(1h) from entry-point "entrySteps"; 
     $fst: min($s), $lst: max($s); 
     $lst - $fst < 50) 
then 
    System.out.println("STEPS RULE: get moving!"); 
end 

Должно быть не менее одного чтения в час или другого правила, определяющего эту ситуацию.

+0

Я думаю, что мы неправильно поняли друг друга. Я хочу того же правила, что и раньше. Новые события, которые у меня есть, - это просто кумулятивные шаги. Я просто изменяю поле интерпретации моих «шагов» поля в шагах класса. Итак, теперь у event1 есть, например, 50 шагов, а event2 имеет 70 шагов. Это означает, что с момента последнего события (event1) было выполнено 20 шагов. Я хочу одно и то же правило, поэтому, если вы делаете менее 50 шагов за один час, правило срабатывает. Пример: event1: 20 шагов -> 30 минут - - событие2: 40 шагов -> 35 минут - - событие3: 45 шагов -> огонь правил. – Tim

+1

Обычно лучше сразу описывать реальную ситуацию, а не сначала разрабатывать другую, а затем приближать реальность. Я обновил свой ответ. – laune