use of org.apache.flink.cep.Event in project flink by apache.
the class NFATest method testNFASerialization.
@Test
public void testNFASerialization() throws IOException, ClassNotFoundException {
NFA<Event> nfa = new NFA<>(Event.createTypeSerializer(), 0, false);
State<Event> startingState = new State<>("", State.StateType.Start);
State<Event> startState = new State<>("start", State.StateType.Normal);
State<Event> endState = new State<>("end", State.StateType.Final);
StateTransition<Event> starting2Start = new StateTransition<>(StateTransitionAction.TAKE, startState, new NameFilter("start"));
StateTransition<Event> start2End = new StateTransition<>(StateTransitionAction.TAKE, endState, new NameFilter("end"));
StateTransition<Event> start2Start = new StateTransition<>(StateTransitionAction.IGNORE, startState, null);
startingState.addStateTransition(starting2Start);
startState.addStateTransition(start2End);
startState.addStateTransition(start2Start);
nfa.addState(startingState);
nfa.addState(startState);
nfa.addState(endState);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(nfa);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
@SuppressWarnings("unchecked") NFA<Event> copy = (NFA<Event>) ois.readObject();
assertEquals(nfa, copy);
}
use of org.apache.flink.cep.Event in project flink by apache.
the class NFATest method testTimeoutWindowPruning.
@Test
public void testTimeoutWindowPruning() {
NFA<Event> nfa = createStartEndNFA(2);
List<StreamRecord<Event>> streamEvents = new ArrayList<>();
streamEvents.add(new StreamRecord<>(new Event(1, "start", 1.0), 1L));
streamEvents.add(new StreamRecord<>(new Event(2, "bar", 2.0), 2L));
streamEvents.add(new StreamRecord<>(new Event(3, "start", 3.0), 3L));
streamEvents.add(new StreamRecord<>(new Event(4, "end", 4.0), 4L));
Set<Map<String, Event>> expectedPatterns = new HashSet<>();
Map<String, Event> secondPattern = new HashMap<>();
secondPattern.put("start", new Event(3, "start", 3.0));
secondPattern.put("end", new Event(4, "end", 4.0));
expectedPatterns.add(secondPattern);
Collection<Map<String, Event>> actualPatterns = runNFA(nfa, streamEvents);
assertEquals(expectedPatterns, actualPatterns);
}
use of org.apache.flink.cep.Event in project flink by apache.
the class NFATest method testSimpleNFA.
@Test
public void testSimpleNFA() {
NFA<Event> nfa = new NFA<>(Event.createTypeSerializer(), 0, false);
List<StreamRecord<Event>> streamEvents = new ArrayList<>();
streamEvents.add(new StreamRecord<>(new Event(1, "start", 1.0), 1L));
streamEvents.add(new StreamRecord<>(new Event(2, "bar", 2.0), 2L));
streamEvents.add(new StreamRecord<>(new Event(3, "start", 3.0), 3L));
streamEvents.add(new StreamRecord<>(new Event(4, "end", 4.0), 4L));
State<Event> startingState = new State<>("", State.StateType.Start);
State<Event> startState = new State<>("start", State.StateType.Normal);
State<Event> endState = new State<>("end", State.StateType.Final);
StateTransition<Event> starting2Start = new StateTransition<>(StateTransitionAction.TAKE, startState, new FilterFunction<Event>() {
private static final long serialVersionUID = -4869589195918650396L;
@Override
public boolean filter(Event value) throws Exception {
return value.getName().equals("start");
}
});
StateTransition<Event> start2End = new StateTransition<>(StateTransitionAction.TAKE, endState, new FilterFunction<Event>() {
private static final long serialVersionUID = 2979804163709590673L;
@Override
public boolean filter(Event value) throws Exception {
return value.getName().equals("end");
}
});
StateTransition<Event> start2Start = new StateTransition<>(StateTransitionAction.IGNORE, startState, null);
startingState.addStateTransition(starting2Start);
startState.addStateTransition(start2End);
startState.addStateTransition(start2Start);
nfa.addState(startingState);
nfa.addState(startState);
nfa.addState(endState);
Set<Map<String, Event>> expectedPatterns = new HashSet<>();
Map<String, Event> firstPattern = new HashMap<>();
firstPattern.put("start", new Event(1, "start", 1.0));
firstPattern.put("end", new Event(4, "end", 4.0));
Map<String, Event> secondPattern = new HashMap<>();
secondPattern.put("start", new Event(3, "start", 3.0));
secondPattern.put("end", new Event(4, "end", 4.0));
expectedPatterns.add(firstPattern);
expectedPatterns.add(secondPattern);
Collection<Map<String, Event>> actualPatterns = runNFA(nfa, streamEvents);
assertEquals(expectedPatterns, actualPatterns);
}
use of org.apache.flink.cep.Event in project flink by apache.
the class NFATest method testTimeoutWindowPruningWindowBorders.
/**
* Tests that pruning shared buffer elements and computations state use the same window border
* semantics (left side inclusive and right side exclusive)
*/
@Test
public void testTimeoutWindowPruningWindowBorders() {
NFA<Event> nfa = createStartEndNFA(2);
List<StreamRecord<Event>> streamEvents = new ArrayList<>();
streamEvents.add(new StreamRecord<>(new Event(1, "start", 1.0), 1L));
streamEvents.add(new StreamRecord<>(new Event(2, "start", 2.0), 2L));
streamEvents.add(new StreamRecord<>(new Event(3, "foobar", 3.0), 3L));
streamEvents.add(new StreamRecord<>(new Event(4, "end", 4.0), 3L));
Set<Map<String, Event>> expectedPatterns = new HashSet<>();
Map<String, Event> secondPattern = new HashMap<>();
secondPattern.put("start", new Event(2, "start", 2.0));
secondPattern.put("end", new Event(4, "end", 4.0));
expectedPatterns.add(secondPattern);
Collection<Map<String, Event>> actualPatterns = runNFA(nfa, streamEvents);
assertEquals(expectedPatterns, actualPatterns);
}
use of org.apache.flink.cep.Event in project flink by apache.
the class CEPOperatorTest method testCEPOperatorCleanupProcessingTime.
@Test
public void testCEPOperatorCleanupProcessingTime() throws Exception {
Event startEvent1 = new Event(42, "start", 1.0);
Event startEvent2 = new Event(42, "start", 2.0);
SubEvent middleEvent1 = new SubEvent(42, "foo1", 1.0, 10.0);
SubEvent middleEvent2 = new SubEvent(42, "foo2", 1.0, 10.0);
SubEvent middleEvent3 = new SubEvent(42, "foo3", 1.0, 10.0);
Event endEvent1 = new Event(42, "end", 1.0);
Event endEvent2 = new Event(42, "end", 2.0);
Event startEventK2 = new Event(43, "start", 1.0);
TestKeySelector keySelector = new TestKeySelector();
KeyedCEPPatternOperator<Event, Integer> operator = getKeyedCepOpearator(true, keySelector);
OneInputStreamOperatorTestHarness<Event, Map<String, Event>> harness = getCepTestHarness(operator);
harness.open();
harness.setProcessingTime(0L);
harness.processElement(new StreamRecord<>(startEvent1, 1L));
harness.processElement(new StreamRecord<>(startEventK2, 1L));
harness.processElement(new StreamRecord<>(new Event(42, "foobar", 1.0), 2L));
harness.processElement(new StreamRecord<Event>(middleEvent1, 2L));
harness.processElement(new StreamRecord<Event>(new SubEvent(42, "barfoo", 1.0, 5.0), 3L));
assertTrue(!operator.hasNonEmptyPQ(42));
assertTrue(!operator.hasNonEmptyPQ(43));
assertTrue(operator.hasNonEmptyNFA(42));
assertTrue(operator.hasNonEmptyNFA(43));
harness.setProcessingTime(3L);
harness.processElement(new StreamRecord<>(startEvent2, 3L));
harness.processElement(new StreamRecord<Event>(middleEvent2, 4L));
harness.processElement(new StreamRecord<>(endEvent1, 5L));
verifyPattern(harness.getOutput().poll(), startEvent1, middleEvent1, endEvent1);
verifyPattern(harness.getOutput().poll(), startEvent1, middleEvent2, endEvent1);
verifyPattern(harness.getOutput().poll(), startEvent2, middleEvent2, endEvent1);
harness.setProcessingTime(11L);
harness.processElement(new StreamRecord<Event>(middleEvent3, 11L));
harness.processElement(new StreamRecord<>(endEvent2, 12L));
verifyPattern(harness.getOutput().poll(), startEvent2, middleEvent2, endEvent2);
verifyPattern(harness.getOutput().poll(), startEvent2, middleEvent3, endEvent2);
harness.setProcessingTime(21L);
assertTrue(operator.hasNonEmptyNFA(42));
harness.processElement(new StreamRecord<>(startEvent1, 21L));
assertTrue(operator.hasNonEmptyNFA(42));
harness.setProcessingTime(49L);
// TODO: 3/13/17 we have to have another event in order to clean up
harness.processElement(new StreamRecord<>(new Event(42, "foobar", 1.0), 2L));
// the pattern expired
assertTrue(!operator.hasNonEmptyNFA(42));
assertEquals(0L, harness.numKeysForWatermarkCallback());
assertTrue(!operator.hasNonEmptyPQ(42));
assertTrue(!operator.hasNonEmptyPQ(43));
harness.close();
}
Aggregations