Сохранение данных из текстового файла в движке Esper для использования в EPL

У меня есть текстовый файл со строками в этом формате:

XYZ 120 
ABC 200 
...

По сути, это одна строка из 3 символов и целое число. Их формат не изменится, но значение целого числа может зависеть от событий.

Я хотел бы сохранить информацию из этого файла в движке, чтобы я мог использовать ее в операторах EPL. Я хочу иметь возможность сравнивать входящие события с моим списком и действовать при наступлении определенных условий.

То есть каждый раз, когда происходит событие, я проверяю свои данные, чтобы увидеть, есть ли они в моем списке. Скажем, у события есть код XYZ, я проверяю и вижу, что он у меня есть, я выполняю операции, а затем меняю значение целого числа XYZ. Обновлять файл не нужно, это просто средство для загрузки данных в движок.

Я считаю, что есть несколько возможных способов сделать это, но я не уверен, как их реализация должна быть завершена и что является наилучшей практикой.

Опция 1: Использование вызова метода, как описано в

5.14. Accessing Non-Relational Data via Method, Script or UDF Invocation

Я выполнил инструкции по предоставлению метода и метаданных, но меня очень смущает, как выполнить итерацию возвращаемых данных в операторе EPL? Возврат моего метода:

Collection<MyStock> stocks 

где MyStock - пара [String, Integer].

where event.code = stocks.code 

очевидно не работает, потому что акции - это коллекция

Итак, как перебирать коллекцию в EPL?

Вариант 2: В качестве альтернативы я, вероятно, могу передать файл в карту, а затем сохранить карту в движке как переменную?

Здесь я тоже застреваю на итерации. Я считаю, что, возможно, упустил важную часть этих концепций, и хотел бы, чтобы меня указали в правильном направлении. А еще лучше был бы рабочий пример чего-то подобного.

Возможное решение:

@Name('createTable')
create table HolderTable(code string primary key, amount int);

@Name('insertTable')
insert into HolderTable select code, amount from MyStock; 

@Name('compareEventsWithTable')
@Subscriber(className='subscribers.MySubscriber')
on TickEvent as tick
select code, amount from HolderTable
where tick.stockCode = code;
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
102
1

Ответы 1

Похоже, вы хотите собирать данные и использовать собранные данные в нескольких запросах. Вы можете использовать для этого именованное окно или таблицу.

create window StockWindow#unique(stock) (stock string, value double);

insert into StockWindow select stock, value from IncomingEvent;

select MyLib.computeSomething(select window(*) from StockWindow) from StockWindow;

Движок вызывает функцию computeSomething, предоставленную классом MyLib, и передает ей содержимое окна, когда StockWindow получает новое событие, входящее в окно.

Я заставил его работать так, как я хочу, с помощью таблицы. Я обновил вопрос, чтобы показать это. Не могли бы вы сообщить мне, хорошее ли это решение или оно излишне сложно?

jocund 23.03.2018 10:24

Другие вопросы по теме