[
https://issues.apache.org/jira/browse/FLINK-3414?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15404852#comment-15404852
]
Ivan Mushketyk commented on FLINK-3414:
---------------------------------------
I would like to describe my proposal on the case-by-case basis. Feel free to
point on any gaps and inconsistencies in this design.
Also, I am not sure what is the best medium for this kind of discussion. I will
start it here, but if you find it inconvenient or sub-optimal, I can move it to
some other place.
Let's start with a simplest pattern that expects a single event:
{code:java}
Pattern.begin("start").where(evt -> evt.getId() == 42)
{code}
This can be replaced with a much shorter Scala version
{code:java}
pattern "start" _.getId() == 42
{code}
A single function call *pattern* can replace *Pattern.begin* call and *where*
condition can be added as an argument to this function call.
A pattern that is expecting a specific type like this one:
{code:java}
Pattern.begin("start").where(evt -> evt.getId() == 42)
.subtype(SubEvent.class)
{code}
Can be replaced with the following Scala code:
{code:java}
pattern[SubEvent] "start" _.id == 42
{code}
The type of an object that is expected can be added as a type parameter to the
"pattern" function.
The *next* function can be replaced with the *->* operator:
{code:java}
Pattern.begin("start").where(evt -> evt.getId() == 42)
.subtype(SubEvent.class)
.next("next").where(evt -> evt.getId() > 42)
.subtype(SubEvent.class)
{code}
as in this code snippet:
{code:java}
pattern[SubEvent] "start" _.id == 42 ->[SubEvent] _.getId() > 42
{code}
or with a function call:
{code:java}
pattern[SubEvent] "start" _.id == 42 next[SubEvent] _.getId() > 42
{code}
A followedBy can be replaced with a *->>* operator:
{code:java}
Pattern.begin("start").where(evt -> evt.getId() == 42)
.next("middle").subtype(SubEvent.class).where(subEvt -> subEvt.getVolume()
>= 10.0)
.followedBy("end").where(evt -> evt.getName().equals("end"));
{code}
as in the following example:
{code:java}
pattern "start" _.getId() == 42
->[SubEvent] "middle" _.getVolume() >= 10.0
->> "end" _.getName() == "end"
{code}
A *within* function call can be replaced with *in* function that expects an
instance of a FinateDuration class that can provide a more readable code:
{code:java}
pattern "start" -> "middle" _.getName() == "error" ->> "end" _.getName() ==
"critical" in 10 seconds
{code}
h3. Additional operators
As far as I understand *or* and *not* operators are not yet implemented, but
here are few examples for these operators
{code:java}
// Pattern that has an event that is not SubEvent
pattern "start" ! is[SubEvent]
{code}
This example also shows an alternative way of specifying a type of element with
the *is* function.
{code:java}
// Pattern that has type SubEvent or has id 42
pattern "start" is[SubEvent] || is _.getId() == 42
{code}
> Add Scala API for CEP's pattern definition
> ------------------------------------------
>
> Key: FLINK-3414
> URL: https://issues.apache.org/jira/browse/FLINK-3414
> Project: Flink
> Issue Type: Improvement
> Components: CEP
> Affects Versions: 1.0.0
> Reporter: Till Rohrmann
> Assignee: Ivan Mushketyk
> Priority: Minor
>
> Currently, the CEP library only supports a Java API to specify complex event
> patterns. In order to make it a bit less verbose for Scala users, it would be
> nice to also add a Scala API for the CEP library.
> A Scala API would also allow to pass Scala's anonymous functions as filter
> conditions or as a select function, for example, or to use partial functions
> to distinguish between different events.
> Furthermore, the Scala API could be designed to feel a bit more like a DSL:
> {code}
> begin "start" where _.id >= 42 -> "middle_1" as classOf[Subclass] ||
> "middle_2" where _.name equals "foobar" -> "end" where x => x.id <= x.volume
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)