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