pnowojski commented on a change in pull request #6781: [FLINK-10470] Add method
to check if pattern can produce empty matches
URL: https://github.com/apache/flink/pull/6781#discussion_r222623342
##########
File path:
flink-libraries/flink-cep/src/main/java/org/apache/flink/cep/nfa/compiler/NFACompiler.java
##########
@@ -74,6 +77,36 @@
}
}
+ /**
+ * Verifies if the provided pattern can possibly generate empty match.
Example of patterns that can possibly
+ * generate empty matches are: A*, A?, A* B? etc.
+ *
+ * @param pattern pattern to check
+ * @return true if empty match could potentially match the pattern,
false otherwise
+ */
+ public static boolean canProduceEmptyMatches(final Pattern<?, ?>
pattern) {
+ NFAFactoryCompiler<?> compiler = new
NFAFactoryCompiler<>(checkNotNull(pattern));
+ compiler.compileFactory();
+ State<?> startState =
compiler.getStates().stream().filter(State::isStart).findFirst().get();
+
+ final Stack<State<?>> statesToCheck = new Stack<>();
+ statesToCheck.push(startState);
+ while (!statesToCheck.isEmpty()) {
+ final State<?> currentState = statesToCheck.pop();
+ for (StateTransition<?> transition :
currentState.getStateTransitions()) {
+ if (transition.getAction() ==
StateTransitionAction.PROCEED) {
+ if
(transition.getTargetState().isFinal()) {
+ return true;
+ } else {
+
statesToCheck.push(transition.getTargetState());
Review comment:
It would be better to at least throw `IllegalStateException` instead of
looping forever in case of some bug or if someone will refactor/add new feature
to the compiler.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services