Github user aljoscha commented on a diff in the pull request: https://github.com/apache/flink/pull/4320#discussion_r132446221 --- Diff: flink-libraries/flink-cep/src/main/java/org/apache/flink/cep/PatternStream.java --- @@ -213,14 +321,97 @@ * @return {@link DataStream} which contains the resulting elements from the pattern flat select * function. */ - public <R> SingleOutputStreamOperator<R> flatSelect(final PatternFlatSelectFunction<T, R> patternFlatSelectFunction, TypeInformation<R> outTypeInfo) { - SingleOutputStreamOperator<Map<String, List<T>>> patternStream = - CEPOperatorUtils.createPatternStream(inputStream, pattern); - - return patternStream.flatMap( - new PatternFlatSelectMapper<>( - patternStream.getExecutionEnvironment().clean(patternFlatSelectFunction) - )).returns(outTypeInfo); + public <R> SingleOutputStreamOperator<R> flatSelect( + final PatternFlatSelectFunction<T, R> patternFlatSelectFunction, + final TypeInformation<R> outTypeInfo) { + return CEPOperatorUtils.createPatternStream( + inputStream, + pattern, + clean(patternFlatSelectFunction), + outTypeInfo); + } + + /** + * Applies a flat select function to the detected pattern sequence. For each pattern sequence the + * provided {@link PatternFlatSelectFunction} is called. The pattern select function can produce + * exactly one resulting element. + * + * <p>Applies a timeout function to a partial pattern sequence which has timed out. For each + * partial pattern sequence the provided {@link PatternFlatTimeoutFunction} is called. The pattern + * timeout function can produce exactly one resulting element. + * + * <p>You can get the stream of late data using + * {@link SingleOutputStreamOperator#getSideOutput(OutputTag)} on the + * {@link SingleOutputStreamOperator} resulting from the select operation + * with the same {@link OutputTag}. + * + * @param timeoutOutputTag {@link OutputTag} that identifies side output with timeouted patterns + * @param patternFlatTimeoutFunction The pattern timeout function which is called for each partial + * pattern sequence which has timed out. + * @param patternFlatSelectFunction The pattern select function which is called for each detected + * pattern sequence. + * @param <L> Type of the resulting timeout elements + * @param <R> Type of the resulting elements + * @return {@link DataStream} which contains the resulting elements with the resulting timeout + * elements in a side output. + */ + public <L, R> SingleOutputStreamOperator<R> flatSelect( + final OutputTag<L> timeoutOutputTag, + final PatternFlatTimeoutFunction<T, L> patternFlatTimeoutFunction, + final PatternFlatSelectFunction<T, R> patternFlatSelectFunction) { + + TypeInformation<R> rightTypeInfo = TypeExtractor.getUnaryOperatorReturnType( + patternFlatSelectFunction, + PatternFlatSelectFunction.class, + 0, + 1, + new int[]{0, 1, 0}, + new int[]{1, 0}, + inputStream.getType(), + null, + false); + + return flatSelect(timeoutOutputTag, patternFlatTimeoutFunction, rightTypeInfo, patternFlatSelectFunction); + } + + /** + * Applies a flat select function to the detected pattern sequence. For each pattern sequence the + * provided {@link PatternFlatSelectFunction} is called. The pattern select function can produce + * exactly one resulting element. + * + * <p>Applies a timeout function to a partial pattern sequence which has timed out. For each + * partial pattern sequence the provided {@link PatternFlatTimeoutFunction} is called. The pattern + * timeout function can produce exactly one resulting element. + * + * <p>You can get the stream of late data using --- End diff -- Same as above.
--- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. ---