我目前有一个订单对象。我们可以假设它有三个字段叫做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
答案 0 :(得分:1)
您可以创建一个包含唯一事件的命名窗口(旧的重复项被驱逐)
类似的东西:
"create window OrderWin.std:unique(orderId) as Order"
"insert into "OrderWin select * from Order"
"select * from OrderWin where ..."
答案 1 :(得分:0)
另一个答案是改变窗口。保持所有事件可能不是你想要的。尝试使用其他窗口,例如......
假设您只想要每个符号的最后一笔交易。您可以执行以下操作:
从tradeEvent.std中选择*:唯一(符号)
这只保留与给定符号匹配的每个事件的最后一个事件。