Правила дроола для разных пользователей

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

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;

person Tim    schedule 12.03.2016    source источник


Ответы (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 для каждого правила.

person laune    schedule 12.03.2016
comment
Спасибо за ответ. Как я уже сказал, я только начал со слюней, и я не понимаю этого полностью. Я создал новый класс Walker с полем macAddress. Затем объявил это как факт в моем файле правил: declare Walker @role(fact) end и обновил мои правила. Затем я сделал следующее: Walker walker = new Walker(macAddress); entryPointSteps.insert(walker); Но ничего не произошло. Не могли бы вы объяснить это немного больше. Спасибо. - person Tim; 13.03.2016
comment
Если вы вставляете с помощью entryPointSteps, вам придется использовать `from entrySteps' в правилах. Вы? - person laune; 13.03.2016
comment
У меня есть последний вопрос. Теперь, если я вставлю новое stepevent с определенным macAddress, правило будет запущено для всех macAddress в системе. Но я бы хотел, чтобы он срабатывал только для macAddress вставленного события. Как я могу это изменить? - person Tim; 14.03.2016
comment
Затем какое-то ограничение (например, в шаблоне Steps), сравнивающее macAddress некоторого Walker с macAddress в событии Steps, отсутствует. - person laune; 15.03.2016
comment
Не могли бы вы уточнить это подробнее? - person Tim; 15.03.2016
comment
Возможно, вы уточните свою ситуацию. Дальнейшие слепые догадки вряд ли помогут. - Задайте другой вопрос, указав правила, которые у вас есть, и факты, которые вы вставили. - person laune; 15.03.2016
comment
Я сделал новый вопрос. stackoverflow.com/questions/36008719 / - person Tim; 15.03.2016