我知道您可以使用CreateExpressionClause
和ExpressionDeclaration
使用Esper的语句对象模型创建全局表达式,但我不确定在构建{时如何引用它们的别名{1}}用于模式。例如,假设我有这样的模式:
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
因此,使用EPL我可以成功地将模式简化为以下内容:
create expression fizzbuzz alias for {fizz = 3 and buzz = 5}
我似乎无法在every (a=Event(fizzbuzz) -> b=Event(fizzbuzz and foo = 1 and bar = 2))
中的任何类中找到一个方法,在构建语句对象时,我可以在其中引用全局表达式别名。我能想到的最好的事情就是在将语句对象转换为EPL时给我一个有效的模式将涉及com.espertech.esper.client.soda
,但是当我将完整的语句对象添加到Esper引擎时,我得到以下错误:
Expressions.property(alias)
注意a)此时已经声明了全局表达式,b)如果我将包含EPL形式的全局表达式别名的模式添加到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))]
转换为EPL字符串。
答案 0 :(得分:1)
您可以在调试器中检查生成的对象模型以查找。因此,为了生成一个,你可以调用“epadmin.compile”(带有表达式的某个epl)并查看返回的内容。
答案 1 :(得分:0)
根据user650839的建议,我通过调试发现,将命名全局表达式的别名包含在内的方法是将DotExpression
合并到语句对象树中:
DotExpression globalExpression = new DotExpression();
globalExpression.add("fizzbuzz", new ArrayList<Expression>(), true);