У меня есть текстовый файл со строками в этом формате:
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;




Похоже, вы хотите собирать данные и использовать собранные данные в нескольких запросах. Вы можете использовать для этого именованное окно или таблицу.
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 получает новое событие, входящее в окно.
Я заставил его работать так, как я хочу, с помощью таблицы. Я обновил вопрос, чтобы показать это. Не могли бы вы сообщить мне, хорошее ли это решение или оно излишне сложно?