Esper:在EPL查询中链接属性访问和方法调用

时间:2011-02-08 14:45:36

标签: method-chaining esper epl

我目前正在努力让Esper EPL查询工作。查询看起来像这样:

select a.center.distance(b.center) as delta
from pattern [
    every-distinct(a.id, b.id) (
        a=org.example.PositionEvent -> b=org.example.PositionEvent
    )
]

当我尝试通过EPLStatement将其编译为EPAdministrator.createEPL()时,会抛出以下异常:

  

com.espertech.esper.client.EPStatementException:启动语句错误:无法按名称'a.center'加载类,请检查导入

如果我修改事件类并且查询要像这样读取

select a.distance(b) as delta
from pattern [
    every-distinct(a.id, b.id) (
        a=org.example.PositionEvent -> b=org.example.PositionEvent
    )
]

它编译得很好。 Esper似乎将a.center.distance(...)解释为类名后跟静态方法调用,而它将a.distance(...)解释为对象a上的方法调用。

如何让Esper按原意解释我的原始查询(即作为属性访问后跟方法调用)?

1 个答案:

答案 0 :(得分:0)

解决方案实际上简单明了(但有点难看):使用括号,就像你在其他任何地方做的那些模糊不清一样。因此,要使第一个查询起作用,请按以下方式编写:

select (a.center).distance(b.center) as delta
from pattern [
    every-distinct(a.id, b.id) (
        a=org.example.PositionEvent -> b=org.example.PositionEvent
    )
]

在这种情况下,添加的括号实际上看起来更具可读性。