如何从流中删除元素

时间:2013-11-27 19:43:42

标签: esper nesper

我目前有一个订单对象。我们可以假设它有三个字段叫做orderId,state和price。

class Order
{
    public int orderId;
    public String state;
    public int filled;
}

在整个订单的生命周期中,状态和填充数量将发生变化。每次有字段更改时,我们都会通过以下方式将其推送到esper运行时:

Order o .....;
epService.EPRuntime.SendEvent(o);

现在每次通过SendEvent添加订单时,它的订单对象不同于前一个订单对象(即不是参考)。这意味着旧订单对象不再应该在流中以便查看

我希望下面的语句只对流中Order的最新版本进行操作,即概念上,流中每个物理订单只应该有一个订单对象。

 "select filled from OrderStream.win:keepall() where orderId= 1234"

有没有办法删除旧的Order对象? 我可以使用引用,所以我只更新旧的订单对象,然后再次推送它? 还有另外一种方法吗?

我目前正在使用Nesper

2 个答案:

答案 0 :(得分:1)

您可以创建一个包含唯一事件的命名窗口(旧的重复项被驱逐)

类似的东西:

"create window OrderWin.std:unique(orderId) as Order"
"insert into "OrderWin select * from Order"
"select * from OrderWin where ..."

答案 1 :(得分:0)

另一个答案是改变窗口。保持所有事件可能不是你想要的。尝试使用其他窗口,例如......

假设您只想要每个符号的最后一笔交易。您可以执行以下操作:

从tradeEvent.std中选择*:唯一(符号)

这只保留与给定符号匹配的每个事件的最后一个事件。