/** * Starts a new pattern sequence. The provided pattern is the initial pattern * of the new sequence. * * * @param group the pattern to begin with * @param afterMatchSkipStrategy the {@link AfterMatchSkipStrategy.SkipStrategy} to use after each match. * @return The first pattern of a pattern sequence */ public static <T, F extends T> GroupPattern<T, F> begin(final Pattern<T, F> group, final AfterMatchSkipStrategy afterMatchSkipStrategy) { return new GroupPattern<>(null, group, ConsumingStrategy.STRICT, afterMatchSkipStrategy); }
consumingStrategy = currentGroupPattern.getQuantifier().getConsumingStrategy(); } else { consumingStrategy = currentGroupPattern.getQuantifier().getInnerConsumingStrategy(); if (currentGroupPattern != null && currentGroupPattern.getUntilCondition() != null) { ignoreCondition = extendWithUntilCondition( ignoreCondition, (IterativeCondition<T>) currentGroupPattern.getUntilCondition(), false);
/** * Check if the given pattern's name is already used or not. If yes, it * throws a {@link MalformedPatternException}. * * @param pattern The pattern to be checked */ private void checkPatternNameUniqueness(final Pattern pattern) { if (pattern instanceof GroupPattern) { Pattern patternToCheck = ((GroupPattern) pattern).getRawPattern(); while (patternToCheck != null) { checkPatternNameUniqueness(patternToCheck); patternToCheck = patternToCheck.getPrevious(); } } else { stateNameHandler.checkNameUniqueness(pattern.getName()); } }
/** * @return An true function extended with stop(until) condition if necessary. */ @SuppressWarnings("unchecked") private IterativeCondition<T> getTrueFunction() { IterativeCondition<T> trueCondition = BooleanConditions.trueFunction(); if (currentGroupPattern != null && currentGroupPattern.getUntilCondition() != null) { trueCondition = extendWithUntilCondition( trueCondition, (IterativeCondition<T>) currentGroupPattern.getUntilCondition(), true); } return trueCondition; }
/** * Checks if the given pattern is optional. If the given pattern is the head of a group pattern, * the optional status depends on the group pattern. */ private boolean isPatternOptional(Pattern<T, ?> pattern) { if (headOfGroup(pattern)) { return isCurrentGroupPatternFirstOfLoop() && currentGroupPattern.getQuantifier().hasProperty(Quantifier.QuantifierProperty.OPTIONAL); } else { return pattern.getQuantifier().hasProperty(Quantifier.QuantifierProperty.OPTIONAL); } }
return value.getName().equals("b"); })).times(1, 2).followedBy("end").where(new SimpleCondition<Event>() { private static final long serialVersionUID = 5726188262756267490L;
return value.getName().equals("b"); })).oneOrMore().followedBy("end").where(new SimpleCondition<Event>() { private static final long serialVersionUID = 5726188262756267490L;
return value.getName().equals("b"); })).notNext("notPattern").where(new SimpleCondition<Event>() { private static final long serialVersionUID = 5726188262756267490L;
return value.getName().equals("b"); })).notFollowedBy("notPattern").where(new SimpleCondition<Event>() { private static final long serialVersionUID = 5726188262756267490L;
return value.getName().equals("b"); })).optional().followedBy("end").where(new SimpleCondition<Event>() { private static final long serialVersionUID = 5726188262756267490L;
/** * @return the {@link IterativeCondition condition} for the {@code TAKE} edge * that corresponds to the specified {@link Pattern} and extended with * stop(until) condition if necessary. */ @SuppressWarnings("unchecked") private IterativeCondition<T> getTakeCondition(Pattern<T, ?> pattern) { IterativeCondition<T> takeCondition = (IterativeCondition<T>) pattern.getCondition(); if (currentGroupPattern != null && currentGroupPattern.getUntilCondition() != null) { takeCondition = extendWithUntilCondition( takeCondition, (IterativeCondition<T>) currentGroupPattern.getUntilCondition(), true); } return takeCondition; }
/** * Checks if the given pattern is optional. If the given pattern is the head of a group pattern, * the optional status depends on the group pattern. */ private boolean isPatternOptional(Pattern<T, ?> pattern) { if (headOfGroup(pattern)) { return isCurrentGroupPatternFirstOfLoop() && currentGroupPattern.getQuantifier().hasProperty(Quantifier.QuantifierProperty.OPTIONAL); } else { return pattern.getQuantifier().hasProperty(Quantifier.QuantifierProperty.OPTIONAL); } }
return value.getName().equals("b"); })).times(2).followedBy("end").where(new SimpleCondition<Event>() { private static final long serialVersionUID = 5726188262756267490L;
return value.getName().equals("b"); })).oneOrMore().followedBy("end").where(new SimpleCondition<Event>() { private static final long serialVersionUID = 5726188262756267490L;
consumingStrategy = currentGroupPattern.getQuantifier().getInnerConsumingStrategy(); if (currentGroupPattern != null && currentGroupPattern.getUntilCondition() != null) { innerIgnoreCondition = extendWithUntilCondition( innerIgnoreCondition, (IterativeCondition<T>) currentGroupPattern.getUntilCondition(), false);
/** * Appends a new group pattern to the existing one. The new pattern enforces non-strict * temporal contiguity. This means that a matching event of this pattern and the * preceding matching event might be interleaved with other events which are ignored. * * @param group the pattern to append * @return A new pattern which is appended to this one */ public GroupPattern<T, F> followedBy(Pattern<T, F> group) { return new GroupPattern<>(this, group, ConsumingStrategy.SKIP_TILL_NEXT, afterMatchSkipStrategy); }
currentPattern = groupPattern.getRawPattern(); lastSink = createMiddleStates(lastSink); lastSink = convertPattern(lastSink);
/** * @return An true function extended with stop(until) condition if necessary. */ @SuppressWarnings("unchecked") private IterativeCondition<T> getTrueFunction() { IterativeCondition<T> trueCondition = BooleanConditions.trueFunction(); if (currentGroupPattern != null && currentGroupPattern.getUntilCondition() != null) { trueCondition = extendWithUntilCondition( trueCondition, (IterativeCondition<T>) currentGroupPattern.getUntilCondition(), true); } return trueCondition; }
/** * Checks if the given pattern is optional. If the given pattern is the head of a group pattern, * the optional status depends on the group pattern. */ private boolean isPatternOptional(Pattern<T, ?> pattern) { if (headOfGroup(pattern)) { return isCurrentGroupPatternFirstOfLoop() && currentGroupPattern.getQuantifier().hasProperty(Quantifier.QuantifierProperty.OPTIONAL); } else { return pattern.getQuantifier().hasProperty(Quantifier.QuantifierProperty.OPTIONAL); } }