使用 EPSStatementObjectModel (Esper) 在事件过滤器中引用命名的全局表达式
Referring to named global expressions inside an event filter using EPStatementObjectModel (Esper)
我知道您可以使用 CreateExpressionClause
和 ExpressionDeclaration
通过 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);
我知道您可以使用 CreateExpressionClause
和 ExpressionDeclaration
通过 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);