Запрос EPL Esper использует историческое время, хранящееся в свойстве события, вместо времени публикации.

Допустим, у меня есть простой объект:

public class StockTick{
    private String symbol;
    private decimal price;
    private Date date;
    private int unixTimestamp
}

Как мне изменить следующий запрос, чтобы использовать StockTick.date или StockTick.unixTimestamp для агрегирования в окне .win:time()?

select avg(price) from StockTick.win:time(30 sec) where symbol='IBM'

person Vojtech B    schedule 06.03.2015    source источник
comment
Это лучше: выберите avg(price) из StockTick(symbol='IBM').win:time(30 sec)   -  person user650839    schedule 07.03.2015


Ответы (1)


Если события уже упорядочены по отметке времени unix, вам не нужно изменять запрос. Просто сделайте это для каждого события:

runtime.sendEvent(new CurrentTimeEvent(unixTimestamp));
runtime.sendEvent(stockTickEvent);

В приведенном выше коде используется внешнее время, поэтому отключите внутреннее системное время по умолчанию. Для совершенно неупорядоченных или неустановленных событий вообще не используйте временное окно, а вместо этого подумайте о том, как будет выглядеть группировка.

person user650839    schedule 06.03.2015
comment
Есть ли рекомендуемый подход при работе в многопоточной среде? Это не кажется совсем атомарным - person Vojtech B; 07.03.2015
comment
Кроме того, что произойдет, если этот подход будет использоваться для неупорядоченных элементов? - person Vojtech B; 07.03.2015
comment
Время всегда движется вперед. Запрос будет другим и, вероятно, будет использовать группировку для неупорядоченного. Для многопоточности мы использовали один поток, который перемещает время вперед, и несколько потоков для отправки событий, которые не отправляют время. - person user650839; 07.03.2015
comment
Конечно, неупорядоченные события также могут быть инсценированы и переупорядочены. - person user650839; 07.03.2015
comment
Просто быстрое замечание, что CurrentTimeEvent перескакивает вперед (пропуская любое время между ними), в то время как CurrentTimeSpanEvent как бы перематывает время вперед. Оператор с выводом каждые 5 секунд, например, не будет создавать промежуточные события с TimeEvent, но будет делать это с TimeSpanEvent. - person xpa1492; 19.03.2015