2017-06-30 31 views
0

我試圖在EPL中表達規則「至少兩個foo」,接下來是兩秒內的兩個bar「。我試過使用這兩種模式和match_recognize,我不能得到我想要的語義。我修改了在線EPL工具中的StockTick示例來說明我在做什麼。單個規則中的多次重複

我已經試過以下兩種模式:

select g[0].seq, g[1].seq, g[2].seq, g[3].seq, y[0].seq, y[1].seq from pattern [ 
    every ([2:] g=StockTick(symbol = 'GE') until timer:interval(2 sec)) -> not timer:interval(2 sec) and every [2] y=StockTick(symbol = 'YHOO') 
]; 

select * from StockTick match_recognize (
    measures g[0].seq as g0_seq, g[1].seq as g1_seq, g[2].seq as g2_seq, g[3].seq as g3_seq, y[0].seq as y0_seq, y[1].seq as y1_seq 
    pattern (g{2,} y{2}) 
    interval 2 sec 
    define 
     g as g.symbol = 'GE', 
     y as y.symbol = 'YHOO' 
); 

下列事件的定義:

create schema StockTick(seq int, symbol string); 

以下輸入:

StockTick={seq=1, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=2, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=3, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=4, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=5, symbol='YHOO'} 
t=t.plus(200 msec) 
StockTick={seq=6, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=7, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=8, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=9, symbol='YHOO'} 
t=t.plus(200 msec) 
StockTick={seq=10, symbol='YHOO'} 
t=t.plus(200 msec) 
StockTick={seq=11, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=12, symbol='YHOO'} 
t=t.plus(200 msec) 
StockTick={seq=13, symbol='YHOO'} 
t=t.plus(200 msec) 
StockTick={seq=14, symbol='YHOO'} 
t=t.plus(200 msec) 
StockTick={seq=15, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=16, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=17, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=18, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=19, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=20, symbol='YHOO'} 
t=t.plus(200 msec) 
StockTick={seq=21, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=22, symbol='YHOO'} 
t=t.plus(200 msec) 
StockTick={seq=23, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=24, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=25, symbol='GE'} 
t=t.plus(200 msec) 
StockTick={seq=26, symbol='GE'} 

,並得到了以下的輸出:

At: 2001-01-01 08:00:02.400 
Statement: Stmt-2 
Insert 
Stmt-2-output={g[0].seq=1, g[1].seq=2, g[2].seq=3, g[3].seq=4, y[0].seq=12, y[1].seq=13} 
At: 2001-01-01 08:00:03.000 
Statement: Stmt-3 
Insert 
Stmt-3-output={g0_sec=6, g1_sec=7, g2_sec=8, g3_seq=(null), y0_seq=9, y1_seq=10} 
At: 2001-01-01 08:00:03.800 
Statement: Stmt-2 
Insert 
Stmt-2-output={g[0].seq=1, g[1].seq=2, g[2].seq=3, g[3].seq=4, y[0].seq=14, y[1].seq=20} 

我與第一EPL語句明白了,until timer:interval(2 sec)不符其實我想要的邏輯,但我不知道怎麼回事表達出來。

我已經嘗試將窗口(#time(2 sec))附加到沒有輸出更改的模式。

我希望得到匹配具有下列序列號:

(1, 2, 3, 4, 5, 9) 
(1, 2, 3, 4, 9, 10) 
(2, 3, 4, 6, 9, 10) 
etc. 

使得規則,每次2第二個窗口評價,我得到了這些窗口的g最大長序列。

回答

0

匹配識別中的「間隔」具有不同的含義。你想要的是這樣的:

select * from StockTick#time(2 sec) match_recognize... 

的文檔鏈接http://espertech.com/esper/release-6.1.0/esper-reference/html_single/index.html#match-recognize-datawindow

+0

感謝您的答覆!我意識到'match_recognize'的一個方面阻止它做我所需要的是'g {2,}'只會匹配_consecutive_事件,而我不想這個限制。我猜想我會留下模式。你有模式的解決方案嗎? – Ray