[ https://issues.apache.org/jira/browse/FLINK-6927?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16069906#comment-16069906 ]
ASF GitHub Bot commented on FLINK-6927: --------------------------------------- Github user dawidwys commented on a diff in the pull request: https://github.com/apache/flink/pull/4153#discussion_r125005984 --- Diff: flink-libraries/flink-cep/src/main/java/org/apache/flink/cep/nfa/compiler/NFACompiler.java --- @@ -455,6 +548,76 @@ private void addStopStateToLooping(final State<T> loopingState) { } /** + * Create all the states for the group pattern. + * + * @param groupPattern the group pattern to create the states for + * @param sinkState the state that the group pattern being converted should point to + * @param proceedState the state that the group pattern being converted should proceed to + * @param isOptional whether the group pattern being converted is optional + * @return the first state of the states of the group pattern + */ + private State<T> createGroupPatternState( + final GroupPattern<T, ?> groupPattern, + final State<T> sinkState, + final State<T> proceedState, + final boolean isOptional) { + final IterativeCondition<T> trueFunction = BooleanConditions.trueFunction(); + + Pattern<T, ?> oldCurrentPattern = currentPattern; + Pattern<T, ?> oldFollowingPattern = followingPattern; + GroupPattern<T, ?> oldGroupPattern = currentGroupPattern; + try { + State<T> lastSink = sinkState; + currentGroupPattern = groupPattern; + currentPattern = groupPattern.getRawPattern(); + lastSink = createMiddleStates(lastSink); + lastSink = convertPattern(lastSink); + if (isOptional) { + // for the first state of a group pattern, its PROCEED edge should point to + // the following state of that group pattern + lastSink.addProceed(proceedState, trueFunction); + } + return lastSink; + } finally { + currentPattern = oldCurrentPattern; + followingPattern = oldFollowingPattern; + currentGroupPattern = oldGroupPattern; + } + } + + /** + * Create the states for the group pattern as a looping one. + * + * @param groupPattern the group pattern to create the states for + * @param sinkState the state that the group pattern being converted should point to + * @return the first state of the states of the group pattern + */ + private State<T> createLoopingGroupPatternState( + final GroupPattern<T, ?> groupPattern, + final State<T> sinkState) { + final IterativeCondition<T> trueFunction = BooleanConditions.trueFunction(); + + Pattern<T, ?> oldCurrentPattern = currentPattern; + Pattern<T, ?> oldFollowingPattern = followingPattern; + GroupPattern<T, ?> oldGroupPattern = currentGroupPattern; + try { --- End diff -- Same as above. Whyt `try`? > Support pattern group in CEP > ---------------------------- > > Key: FLINK-6927 > URL: https://issues.apache.org/jira/browse/FLINK-6927 > Project: Flink > Issue Type: Sub-task > Components: CEP > Reporter: Dian Fu > Assignee: Dian Fu > > We should add support for pattern group. This would enrich the set of > supported patterns. For example, users can write patterns like this with this > feature available: > {code} > A --> (B --> C.times(3)).optional() --> D > {code} > or > {code} > A --> (B --> C).times(3) --> D > {code} -- This message was sent by Atlassian JIRA (v6.4.14#64029)