Я пытаюсь заставить Siddhi запускать события всякий раз, когда он обнаруживает, что рейс вошел в геозону, но не могу точно определить правильный запрос для этого.
У меня есть следующее определение входного потока:
define stream GeofenceMulticasterConsumerStream ( journeyId string, geofenceId string, withinGeofence bool, timestamp long )
Каждый раз, когда я получаю позиционное обновление для полета, я получаю событие, сгенерированное в этом потоке для каждой геозоны в системе (существует около 10 геозон, поэтому подумал, что Сиддхи сможет обрабатывать 10 * событий позиционного обновления)
Я начал с этого запроса:
define partition geofencePartition by GeofenceMulticasterConsumerStream.geofenceId;
from every a = GeofenceMulticasterConsumerStream[withinGeofence == false] ->
b = GeofenceMulticasterConsumerStream[a.journeyId == b.journeyId and b.withinGeofence == true]
within 300000
select b.journeyId, b.geofenceId, b.timestamp as timeEntered
insert into EnteredGeofenceStream
partition by geofencePartition
Тем не менее, это дает мне повторяющиеся события Geofence Entry, так как он оценивает каждое событие «a» против каждого совпадающего события «b» (если у меня есть 5 событий, которые не находятся в геозоне, за которыми следует одно, то есть я получаю 5 событий Geofence Entry Мероприятия)
Поэтому я попытался добавить обнаружение повторяющихся событий, чтобы избежать этого:
from every a = GeofenceMulticasterConsumerStream[withinGeofence == false] ->
b = GeofenceMulticasterConsumerStream[a.journeyId == b.journeyId and b.withinGeofence == true]
within 300000
select b.journeyId, b.geofenceId, b.timestamp as timeEntered, geofences:hashEntry(b.journeyId, b.geofenceId, b.timestamp) as entryHash
insert into DuplicateEnteredGeofenceStream
partition by geofencePartition
from DuplicateEnteredGeofenceStream#window.firstUnique(entryHash)
select journeyId, geofenceId, timeEntered
insert into EnteredGeofenceStream
geofences: hashEntry - это созданная мной функция, которая генерирует уникальный хэш-код для события входа.
Однако мне не очень нравится это делать, так как вам нужно вести учет всех уникальных хэшей в окне firstUnique, и я беспокоюсь, что это приведет к утечке памяти. Кажется, это немного преувеличено, так как хеш будет применим только к этому моменту времени, и поэтому мне нужно только окно firstUnique, действительное в течение нескольких секунд максимум, для проверки дубликатов.
Я думаю, что одна из самых серьезных проблем, с которыми я сталкиваюсь, заключается в том, что у меня есть один поток, в котором отслеживаются несколько рейсов и несколько геозон, поскольку все примеры, которые я видел, были намного проще. Мне интересно, пытаюсь ли я достичь чего-то невозможного.
Буду очень признателен за любой совет по этому поводу, так как у меня сейчас заканчиваются идеи!
Заранее спасибо!