各位好,

我发现 FlinkCEP 中涉及 GroupPattern 的一些查询的匹配结果和直觉不太符合。

以如下查询为例:

    Pattern.<Event>begin("pl").where(
        new SimpleCondition<Event>() {
            @Override
            public boolean filter(Event value) {
                return value.getName() == 2;
            }
        }
    ).times(1,3).optional().consecutive()

当输入数据流(格式为 e(id,name,price))为

e(1,1,0), e(2,2,5), e(3,1,0), e(4,2,2), e(5,1,0), e(6,3,2), e(7,1,0), e(8,2,5), 
e(9,1,8)

时,其输出的匹配有三个,分别为:

pl: e(2,2,5)
pl: e(4,2,2)
p: e(8,2,5)

但是如果在查询外面加一个 GroupPattern,即查询为

    Pattern.begin(
        Pattern.<Event>begin("pl").where(
            new SimpleCondition<Event>() {
                @Override
                public boolean filter(Event value) {
                    return value.getName() == 2;
                }
            }
        ).times(1,3).optional().consecutive()
    )

时,输出的匹配结果却是一个匹配,具体为:

pl: e(2,2,5), e(4,2,2), e(8,2,5)

我们认为这样的结果不太符合直觉。

直觉上来说,一个 pattern sequence 外面套一层 group,匹配结果应该是一样的,为何会出现这样的结果?
而且后者的结果看起来和文档里说明的也不太正确,明明加了 `consecutive()` 却返回了不连续的事件。

请问这样的情况是有 bug 还是有意为之?如果是后者是有什么考量吗?

谢谢!

Flink version: 1.14.5
Java version: 11.0.15
flink-cep_2.11: 1.14.2



傅宣登,
中国科学院软件研究所
f...@ios.ac.cn

回复