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