我想在Esper中编写一条规则,当最后15分钟内步数为0并且心率超过120时触发。我已经提出以下规则:
EPStatement cepStatementRule8 = cepRule.createEPL("context PartitionByMacSteps select * from "
+ "Steps.win:time(15 min) S, HeartRate.win:time(1 min) H "
+ "having (max(S.steps)-min(S.steps) = 0) and (H.heartrate > 120)");
cepStatementRule8.addListener(new rule8Listener());
我的HeartRate类包含以下字段:
int heartrate;
String heartratesTimestamp;
String macAddress;
我的Steps类有以下字段:
int steps;
String stepsTimestamp;
String macAddress;
我面临的问题是,如果在最后15分钟内没有采取任何措施,我只希望触发规则。现在,当两个步骤事件具有相同数量的步骤时,它将触发。我知道我可能不得不使用timer.interval但我无法弄清楚如何编写这个规则。有人可以帮帮我吗?
答案 0 :(得分:0)
要求定义不明确。什么"心率超过120"意思是,它只是一次或15分钟或1分钟,另外心率如何超过120"重叠或与步骤条件重合。
我建议将问题分解为两个独立的状态检测,然后是一个联接来检测两个条件是否在某个时间发生。这也使测试变得容易,因为您可以看到每个条件都单独指出。例如,大致相同的东西:
// detect the steps condition
insert into StepConditionDetected
select *, current_timestamp as detectedTime select * from pattern[...];
// detect the heartrate condition
insert into HeartrateConditionDetected
select *, current_timestamp as detectedTime from pattern[...];
// join step and heartrate condition to see if they co-occur in some way
select * from StepConditionDetected.std:unique(macAddress).win:time(15 min) as a,
HeartrateConditionDetected.std:unique(macAddress).win:time(15 min) as b
where a.macAddress = b.macAddress
你可以添加到where子句加入这两个条件并使用" overlap"实现一些艾伦间隔代数,即"和a.detecttime.overlaps(b.detectedTime,x,y)"