Search in sources :

Example 1 with QueryBuilder

use of com.github.fhuss.kafka.streams.cep.pattern.QueryBuilder in project kafkastreams-cep by fhussonnois.

the class NFATest method testComplexPatternWithState.

/**
 * PATTERN SEQ(Stock+ a[ ], Stock b)
 *  WHERE skip_till_next_match(a[ ], b) {
 *      [symbol]
 *  and
 *      a[1].volume > 1000
 *  and
 *      a[i].price > avg(a[..i-1].price)
 *  and
 *      b.volume < 80%*a[a.LEN].volume }
 *  WITHIN 1 hour
 */
@Test
public void testComplexPatternWithState() {
    StockEvent e1 = new StockEvent("e1", 100, 1010);
    StockEvent e2 = new StockEvent("e2", 120, 990);
    StockEvent e3 = new StockEvent("e3", 120, 1005);
    StockEvent e4 = new StockEvent("e4", 121, 999);
    StockEvent e5 = new StockEvent("e5", 120, 999);
    StockEvent e6 = new StockEvent("e6", 125, 750);
    StockEvent e7 = new StockEvent("e7", 120, 950);
    StockEvent e8 = new StockEvent("e8", 120, 700);
    Pattern<String, StockEvent> pattern = new QueryBuilder<String, StockEvent>().select().where((k, v, ts, store) -> v.volume > 1000).<Long>fold("avg", (k, v, curr) -> v.price).then().select().zeroOrMore().skipTillNextMatch().where((k, v, ts, state) -> v.price > (long) state.get("avg")).<Long>fold("avg", (k, v, curr) -> (curr + v.price) / 2).<Long>fold("volume", (k, v, curr) -> v.volume).then().select().skipTillNextMatch().where((k, v, ts, state) -> v.volume < 0.8 * (long) state.getOrElse("volume", 0L)).within(1, TimeUnit.HOURS).build();
    final NFA<String, StockEvent> nfa = newNFA(pattern, Serdes.String(), new StockEventSerde());
    AtomicLong offset = new AtomicLong(0);
    List<Event<Object, StockEvent>> collect = Arrays.asList(new StockEvent[] { e1, e2, e3, e4, e5, e6, e7, e8 }).stream().map(e -> new Event<>(null, e, System.currentTimeMillis(), "test", 0, offset.getAndIncrement())).collect(Collectors.toList());
    List<Sequence<String, StockEvent>> s = simulate(nfa, collect.toArray(new Event[collect.size()]));
    assertEquals(4, s.size());
}
Also used : Sequence(com.github.fhuss.kafka.streams.cep.Sequence) Arrays(java.util.Arrays) StockEventSerde(com.github.fhuss.kafka.streams.cep.demo.StockEventSerde) StagesFactory(com.github.fhuss.kafka.streams.cep.pattern.StagesFactory) Test(org.junit.Test) AggregatesStoreImpl(com.github.fhuss.kafka.streams.cep.state.internal.AggregatesStoreImpl) Collectors(java.util.stream.Collectors) StockEvent(com.github.fhuss.kafka.streams.cep.demo.StockEvent) SharedVersionedBufferStore(com.github.fhuss.kafka.streams.cep.state.SharedVersionedBufferStore) TimeUnit(java.util.concurrent.TimeUnit) AtomicLong(java.util.concurrent.atomic.AtomicLong) SharedVersionedBufferStoreImpl(com.github.fhuss.kafka.streams.cep.state.internal.SharedVersionedBufferStoreImpl) List(java.util.List) Event(com.github.fhuss.kafka.streams.cep.Event) QueryBuilder(com.github.fhuss.kafka.streams.cep.pattern.QueryBuilder) Serde(org.apache.kafka.common.serialization.Serde) InMemoryKeyValueStore(org.apache.kafka.streams.state.internals.InMemoryKeyValueStore) Serdes(org.apache.kafka.common.serialization.Serdes) AggregatesStore(com.github.fhuss.kafka.streams.cep.state.AggregatesStore) LinkedList(java.util.LinkedList) Assert(org.junit.Assert) Pattern(com.github.fhuss.kafka.streams.cep.pattern.Pattern) NoOpProcessorContext(org.apache.kafka.test.NoOpProcessorContext) QueryBuilder(com.github.fhuss.kafka.streams.cep.pattern.QueryBuilder) Sequence(com.github.fhuss.kafka.streams.cep.Sequence) AtomicLong(java.util.concurrent.atomic.AtomicLong) StockEvent(com.github.fhuss.kafka.streams.cep.demo.StockEvent) StockEventSerde(com.github.fhuss.kafka.streams.cep.demo.StockEventSerde) AtomicLong(java.util.concurrent.atomic.AtomicLong) StockEvent(com.github.fhuss.kafka.streams.cep.demo.StockEvent) Event(com.github.fhuss.kafka.streams.cep.Event) Test(org.junit.Test)

Aggregations

Event (com.github.fhuss.kafka.streams.cep.Event)1 Sequence (com.github.fhuss.kafka.streams.cep.Sequence)1 StockEvent (com.github.fhuss.kafka.streams.cep.demo.StockEvent)1 StockEventSerde (com.github.fhuss.kafka.streams.cep.demo.StockEventSerde)1 Pattern (com.github.fhuss.kafka.streams.cep.pattern.Pattern)1 QueryBuilder (com.github.fhuss.kafka.streams.cep.pattern.QueryBuilder)1 StagesFactory (com.github.fhuss.kafka.streams.cep.pattern.StagesFactory)1 AggregatesStore (com.github.fhuss.kafka.streams.cep.state.AggregatesStore)1 SharedVersionedBufferStore (com.github.fhuss.kafka.streams.cep.state.SharedVersionedBufferStore)1 AggregatesStoreImpl (com.github.fhuss.kafka.streams.cep.state.internal.AggregatesStoreImpl)1 SharedVersionedBufferStoreImpl (com.github.fhuss.kafka.streams.cep.state.internal.SharedVersionedBufferStoreImpl)1 Arrays (java.util.Arrays)1 LinkedList (java.util.LinkedList)1 List (java.util.List)1 TimeUnit (java.util.concurrent.TimeUnit)1 AtomicLong (java.util.concurrent.atomic.AtomicLong)1 Collectors (java.util.stream.Collectors)1 Serde (org.apache.kafka.common.serialization.Serde)1 Serdes (org.apache.kafka.common.serialization.Serdes)1 InMemoryKeyValueStore (org.apache.kafka.streams.state.internals.InMemoryKeyValueStore)1