使用 EPSStatementObjectModel (Esper) 在事件过滤器中引用命名的全局表达式

Referring to named global expressions inside an event filter using EPStatementObjectModel (Esper)

我知道您可以使用 CreateExpressionClauseExpressionDeclaration 通过 Esper 的语句对象模型创建全局表达式,但我不确定您在构建时如何引用它们的别名一个 EPStatementObjectModel 表示一个模式。例如,假设我有这样的模式:

every (a=Event(fizz = 3 and buzz = 5) -> b=Event(fizz = 3 and buzz = 5 and foo = 1 and bar = 2))

我想将 fizz = 3 and buzz = 5 声明为这样的全局表达式:

create expression fizzbuzz alias for {fizz = 3 and buzz = 5}

因此,借助 EPL,我可以成功地将模式简化为以下内容:

every (a=Event(fizzbuzz) -> b=Event(fizzbuzz and foo = 1 and bar = 2))

我似乎无法在 com.espertech.esper.client.soda 中的任何 类 中找到可以在构建语句对象时引用全局表达式别名的方法。当将语句对象转换为 EPL 涉及 Expressions.property(alias) 时,我能想到的最好的事情是给我一个有效的模式,但是当我将完整的语句对象添加到 Esper 引擎时,我得到以下错误:

Failed to validate filter expression 'fizzbuzz': Property named 'fizzbuzz' is not valid in any stream [every (a=Event(fizzbuzz) -> b=Event(fizzbuzz and foo = 1 and bar = 2))]

请注意,a) 此时已经声明了全局表达式,b) 如果我将包含 EPL 形式的全局表达式别名的模式添加到 Esper 引擎,它就可以工作。

有什么想法吗?虽然这是一个选项,但我不想每次向引擎添加新模式时都从 EPStatementObjectModel 转换为 EPL 字符串。

您可以在调试器中检查生成的对象模型以找出答案。因此,为了生成一个,您可以调用 "epadmin.compile("some epl with the expression") 并查看返回的结果。

根据 user650839 的建议,我通过调试发现将别名包含到命名全局表达式的方法是将 DotExpression 合并到您的语句对象树中:

DotExpression globalExpression = new DotExpression();
globalExpression.add("fizzbuzz", new ArrayList<Expression>(), true);