使用EPStatementObjectModel(Esper)引用事件过滤器内的命名全局表达式

时间:2015-09-24 00:24:35

标签: java esper complex-event-processing

我知道您可以使用CreateExpressionClauseExpressionDeclaration使用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字符串。

2 个答案:

答案 0 :(得分:1)

您可以在调试器中检查生成的对象模型以查找。因此,为了生成一个,你可以调用“epadmin.compile”(带有表达式的某个epl)并查看返回的内容。

答案 1 :(得分:0)

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

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