Сохранение данных из текстового файла в движок 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;

person jocund    schedule 22.03.2018    source источник


Ответы (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 получает новое событие, входящее в окно.

person user650839    schedule 22.03.2018
comment
У меня это работает так, как я хочу, используя таблицу. Я обновил вопрос, чтобы показать его. Не могли бы вы сообщить мне, хорошее ли это решение или это излишне сложно? - person jocund; 23.03.2018