2016-03-12 4 views
1

Недавно я начал программировать с помощью Drools Fusion, и у меня есть умный носитель, который отправляет данные о шагомерном и сердечном ритме на мой ноутбук. Затем я обрабатываю эти данные с использованием языка правил слюни. Но предположим, что у меня есть несколько умных носителей с каждым уникальным MAC-адресом. Я использую временные окна, и мой вопрос заключается в том, как я могу изменить свой файл правил, чтобы правила срабатывали только для событий с тем же macaddress и принимали соответствующие действия на основе этого MAC-адреса. Мой текущий файл правило заключается в следующем:Правила Drools для разных пользователей

import hellodrools.Steps 
import hellodrools.HeartRate 
import hellodrools.AppInfo 

declare AppInfo 
    @role(event) 
end 

declare Steps 
    @role(event) 
end 

declare HeartRate 
    @role(event)  
end 


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!"); 
    System.out.println($lst + " " + $fst); 

end 

rule "HEARTRATE RULE 1" 
when 
    $heartrate : HeartRate(heartRate >= 150) from entry-point "entryHeartRate" 
then 
    System.out.println("Heartrate is to high!"); 
end 

rule "HEARTRATE RULE 2" 
when 
    $heartrate : HeartRate(heartRate <= 50 && heartRate >= 35) from entry-   point "entryHeartRate" 
then 
    System.out.println("Heartrate is to low!"); 
end 

rule "HEARTRATE RULE 3" 
when 
    $heartrate : HeartRate(heartRate < 35 && heartRate >= 25) from entry-point "entryHeartRate" 
then 
    System.out.println("Heartrate is critical low!"); 
end 

rule "HEARTRATE RULE 4" 
when 
    $max : Double() from accumulate(
     HeartRate($heartrates : heartRate) over window:time(10s) from entry-point "entryHeartRate", 
     max($heartrates))&& 
    $min : Double() from accumulate(
     HeartRate($heartrates : heartRate) over window:time(10s) from entry-point "entryHeartRate", 
     min($heartrates))&& 
    eval(($max - $min) >= 50) 
then 
    System.out.println("Heartrate to much difference in to little time!"); 
end 

Мои HeartRate события имеют следующие поля:

int heartRate; 
Date timeStamp; 
String macAddress; 

Мои шаги события имеют следующие поля:

double steps; 
Date timeStamp; 
String macAddress; 

ответ

1

Это просто: вам нужно определить факт, назовите его Walker с String macAddress, создайте его с MAC-адресом, который должны обрабатывать правила, а затем

rule "ACC STEPS RULE" 
when 
    Walker($mac: macAddress) 
    accumulate(Steps($s : steps, macAddress == $mac) 
       over window:time(1h) from entry-point "entrySteps"; 
     $fst: min($s), $lst: max($s); 
     $lst - $fst < 50) 
    then ... end 

и аналогичным образом с другими правилами. - Вы можете упростить это (немного), определяя основные правила

rule "MAC" 
when 
    Walker($mac: macAddress) 
then end 

и написать другие правила в качестве расширений:

rule "ACC STEPS RULE" extends "MAC" ... 

так что вам не нужно повторять Walker шаблон для каждого правила ,

+0

Благодарим за ответ. Как я уже сказал, я только начинал с слюни, и я не понимаю этого. Я создал новый класс Walker с полем macAddress. Затем он объявил это как факт в моем файле правил: 'declare Walker @role (fact) end' и обновил мои правила. Затем я сделал следующее: 'Walker walker = new Walker (macAddress); entryPointSteps.insert (walker); 'Но ничего не произошло. Не могли бы вы объяснить это немного больше. Спасибо. – Tim

+1

Если вы вставляете с помощью 'entryPointSteps', вам придется использовать' from entrySteps 'в правилах. Не так ли? – laune

+0

Нет, это действительно проблема, спасибо! – Tim