2015-09-24 48 views
0

我知道您可以使用Esper的語句對象模型使用CreateExpressionClauseExpressionDeclaration創建全局表達式,但我不完全確定您如何能夠引用他們的別名在爲模式構建EPStatementObjectModel時。例如,假設我有這樣一個規律:使用EPStatementObjectModel(Esper)引用事件過濾器中的命名全局表達式

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的方法中,我可以參照全球表達式別名爲我打造語句對象。轉換Statement對象EPL時會涉及Expressions.property(alias)我能想到的最好的事情會給我一個有效的模式,但我得到以下錯誤,當我完整的語句對象添加到艾斯波引擎:

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字符串,每次我在引擎中添加一個新模式。

回答

1

您可以在調試器中檢查生成的對象模型以找出結果。所以爲了生成一個,你可以調用「epadmin.compile(」一些epl的表達式「),看看返回的內容。

0

遵循user650839的建議,我發現通過調試,包括別名命名的全局表達式是將DotExpression合併到您的語句對象樹中,例如:

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