为什么这个背景不起作用?

时间:2017-04-23 00:24:25

标签: esper nesper

我希望在下面两个上下文中指定的时间之间选择相同的语句。但是我得不到输出。当B处于活动状态且C在单个语句中使用嵌套上下文处于活动状态时,如何获得输出?

create context A
    context B start (0, 12, *, *, *) end (0, 18, *, *, *),
    context C start (0, 20, *, *, *) end (0, 23, *, *, *);

说明:

context A select * from MyEvent;

1 个答案:

答案 0 :(得分:1)

这是因为嵌套上下文不是OR关系。对于OR,使用类似于本示例末尾的模式。

假设事件类型为AStart,AEnd,BStart,BEnd和C.

create context CtxSampleNestedContext
  context SpanA start AStart end AEnd,
  context SpanB start BStart end BEnd;

context CtxSampleNestedContext select count(*) from C;

在创建上述EPL语句后,引擎仅开始查找AStart事件,但尚未查找AEnd,BStart,BEnd或C事件。

假设下一个AStart事件到达:

  • 引擎停止寻找AStart事件。
  • 引擎开始寻找AEnd事件,因为那意味着 当前SpanA生命周期的结束。
  • 引擎开始寻找BStart事件,以便检测到 SpanB生命周期的开始。

在场景中,假设BStart事件到达。从逻辑上讲,这是SpanB生命周期的开始:

  • 引擎停止寻找更多BStart事件。
  • 引擎开始寻找BEnd事件,因为那意味着 当前SpanB生命周期结束。
  • 引擎一直在寻找AEnd事件,因为这意味着 当前SpanA生命周期结束。
  • 引擎开始寻找C事件,现在开始计算每个C 到了。

在场景中,假设BEnd事件到来。从逻辑上讲,这是SpanB生命周期的结束:

  • 引擎停止寻找BEnd事件。
  • 引擎停止寻找C事件并停止对每个事件进行计数。
  • 引擎开始寻找BStart事件,因为那意味着 另一个SpanB生命周期的开始。

在场景中,假设AEnd事件到来。从逻辑上讲,这是SpanA生命周期的结束:

  • 引擎停止寻找AEnd事件。
  • 引擎停止寻找BStart事件。
  • 引擎开始寻找AStart事件,因为那意味着 另一个SpanA生命周期的开始。

在上面描述的场景中,在AEnd到达之后,引擎返回到最初创建语句后引擎所处的状态。

如果您的用例需要逻辑OR关系,例如(不等同于上述):

create context CtxSampleNestedContext 
  start pattern[every a=AStart or every a=BStart] as mypattern 
  end pattern[every AEnd or every BEnd]