0

我有一个文本文件,其中包含以下格式的行:

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:或者,我可以将文件输入 Map,然后将 Map 作为变量保存到引擎中?

我也被这里的迭代困住了。我相信我可能错过了这些概念中的关键部分,我想指出正确的方向。更好的是,类似的东西的工作示例会很好。

可能的解决方案:

@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;
4

1 回答 1

0

听起来您想收集数据并在多个查询中使用收集到的数据。您可以为此使用命名的窗口或表格。

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;

当 StockWindow 有一个新事件进入窗口时,引擎调用类“MyLib”提供的“computeSomething”函数并将窗口内容传递给该函数。

于 2018-03-22T10:56:00.917 回答