Я хочу найти шаблон событий, которые следуют
Внутренний шаблон:
- Имеют то же значение для клавиши "sensorArea".
- Имеют другое значениедля ключа "customerId".
- Находятся в пределах 5 секунд друг от друга.
И для этого шаблона необходимо
- Извещать "только", если предыдущийслучается 3 или более раз.
Я написал что-то, но я точно знаю, что это не завершено.
Два вопроса
Мне нужно получить доступ к полям предыдущих событий, когда я нахожусь в "следующем" шаблоне, как я могу это сделатьбез использования команды ctx, потому что она тяжелая ..
Мой код дает странный результат - это мой ввод
, и мой выходной сигнал равен
3> {first=[Customer[timestamp=50,customerId=111,toAdd=2,sensorData=33]], second=[Customer[timestamp=100,customerId=222,toAdd=2,sensorData=33], Customer[timestamp=600,customerId=333,toAdd=2,sensorData=33]]}
, хотя желаемым выходным сигналом должны быть все первые шесть событий (пользователи 111/222 и датчик 33, а затем 44, а затем 55
Pattern<Customer, ?> sameUserDifferentSensor = Pattern.<Customer>begin("first", skipStrategy)
.followedBy("second").where(new IterativeCondition<Customer>() {
@Override
public boolean filter(Customer currCustomerEvent, Context<Customer> ctx) throws Exception {
List<Customer> firstPatternEvents = Lists.newArrayList(ctx.getEventsForPattern("first"));
int i = firstPatternEvents.size();
int currSensorData = currCustomerEvent.getSensorData();
int prevSensorData = firstPatternEvents.get(i-1).getSensorData();
int currCustomerId = currCustomerEvent.getCustomerId();
int prevCustomerId = firstPatternEvents.get(i-1).getCustomerId();
return currSensorData==prevSensorData && currCustomerId!=prevCustomerId;
}
})
.within(Time.seconds(5))
.timesOrMore(3);
PatternStream<Customer> sameUserDifferentSensorPatternStream = CEP.pattern(customerStream, sameUserDifferentSensor);
DataStream<String> alerts1 = sameUserDifferentSensorPatternStream.select((PatternSelectFunction<Customer, String>) Object::toString);