flink-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kostas Kloudas <k.klou...@data-artisans.com>
Subject Re: CEP join across events
Date Thu, 27 Apr 2017 08:21:44 GMT
Hi Elias,

Glad that this is not a blocker for you and 
you are right that we should clarify it better in the documentation.

Thanks,
Kostas

> On Apr 27, 2017, at 3:28 AM, Elias Levy <fearsome.lucidity@gmail.com> wrote:
> 
> You are correct.  Apologies for the confusion.  Given that ctx.getEventsForPattern returns
an iterator instead of a value and that the example in the documentation deals with summing
multiple matches, I got the impression that the call would return all previous matches instead
of one at a time for each branch. 
> 
> I suppose it returns an iterator to support patterns where the event has some associated
enumerator, like times(), zeroOrMore(), or oneOrMore(), yes?
> 
> Might be helpful to clarify this and point out that the iterator will contain a single
value for the common case of match with a enumerator of one, which is the default.
> 
> 
> On Wed, Apr 26, 2017 at 2:15 AM, Kostas Kloudas <k.kloudas@data-artisans.com <mailto:k.kloudas@data-artisans.com>>
wrote:
> Hi Elias,
> 
> If I understand correctly your use case, you want for an input:
> 
> event_1 = (type=1, value_a=K, value_b=X)
> event_2 = (type=2, value_a=K, value_b=X)
> event_3 = (type=1, value_a=K, value_b=Y)
> 
> to get a match:
> 
> event_1, event_2
> 
> and discard event_3, right?
> 
> In this case, Dawid is correct and from a first look at your code, it should work.
> If not, what is the output that you get?
> 
> Kostas
> 
> 
>> On Apr 26, 2017, at 8:39 AM, Dawid Wysakowicz <wysakowicz.dawid@gmail.com <mailto:wysakowicz.dawid@gmail.com>>
wrote:
>> 
>> Hi Elias,
>> 
>> You can do it with 1.3 and IterativeConditions. Method ctx.getEventsForPattern("foo")
returns only those events that were matched in "foo" pattern in that particular branch.
>> I mean that for a sequence like (type =1, value_b = X); (type=1, value_b=Y); (type=2,
value_b=X) both events of type = 1 create a seperate pattern branch and the event with type
= 2 will be checked for a match twice for both of those branches.
>> 
>> Regards,
>> Dawid
>> 
>> 2017-04-26 7:48 GMT+02:00 Elias Levy <fearsome.lucidity@gmail.com <mailto:fearsome.lucidity@gmail.com>>:
>> There doesn't appear to be a way to join events across conditions using the CEP library.
>> 
>> Consider events of the form (type, value_a, value_b) on a stream keyed by the value_a
field.  
>> 
>> Under 1.2 you can create a pattern that for a given value_a, as specified by the
stream key, there is a match if an event of type 1 is followed by an event of type 2 (e.g.
begin("foo").where(_.type==1).followedBy("bar").where(_.type==2).  But this will return a
match regardless of whether value_b in the first event matches value_b in the second event.
>> 
>> 1.3 snapshot introduces iterative conditions, but this is insufficient.  In 1.3 you
can do:
>> 
>> begin("foo").where(_.type==1).followedBy("bar").where(
>>     (v, ctx) => {
>>        v.type == 2 &&
>>        ctx.getEventsForPattern("foo").asScala.exists(prev => prev.value_b == v.value_b)
>>     })
>> 
>> This will accept the current event if any if any previously had a value_b that matches
the current event. But the matches will include all previous events, even those that did not
match the current event at value_b, instead of only matching the previous event where value_b
equals the current event.
>> 
>> Is there a way to only output the match there previous event matches the current
event value_b (e.g. foo == (type=1, value_a=K, value_b=X) and bar == (type=2, value_a=K, value_b=X)?
>> 
>> 
>> 
> 
> 


Mime
View raw message