【原创】StreamInsight查询系列(十二)——查询模式之事件对齐

上篇文章介绍了查询模式中窗口对齐部分,这篇博文将介绍事件对齐。

测试数据准备

为了方便测试查询,我们首先准备一个静态的测试数据源:

var sourceIntervalDataType = new []
{
    new { Id = "A", StartTime = DateTime.Parse("10/23/2009 11:59:01 PM"), EndTime = DateTime.Parse("10/23/2009 11:59:59 PM") },
    new { Id = "A", StartTime = DateTime.Parse("10/23/2009 4:12:00 PM"), EndTime = DateTime.Parse("10/24/2009 4:12:01 PM") },
    new { Id = "A", StartTime = DateTime.Parse("10/31/2009 11:59:59 PM"), EndTime = DateTime.Parse("11/1/2009 12:00:00 AM") },
    new { Id = "A", StartTime = DateTime.Parse("11/1/2009 12:00:00 AM"), EndTime = DateTime.Parse("11/1/2009 12:00:00 PM") },
    new { Id = "A", StartTime = DateTime.Parse("11/2/2009 12:00:01 AM"), EndTime = DateTime.Parse("11/2/2009 12:00:02 AM") },
    new { Id = "A", StartTime = DateTime.Parse("11/3/2009 11:59:59 PM"), EndTime = DateTime.Parse("11/4/2009 12:00:01 AM") },
};

 

接下去将sourceIntervalDataType 转变为间隔类型复杂事件流:

var source = sourceIntervalDataType.ToIntervalStream(Application, ev =>
                    IntervalEvent.CreateInsert(ev.StartTime.ToLocalTime(), ev.EndTime.ToLocalTime(), new { ev.Id }),
                    AdvanceTimeSettings.StrictlyIncreasingStartTime);

 

事件对齐

问题1:怎样将事件移动/对齐到凌晨12点(即当天开始)且保持结束时间不变?

改变事件生命期的函数其实大家在前面已经看到过一次,不错,就是AlterEventDuration!只不过它是延伸持续时间,并不能改变事件的起始时间。要解决问题1,需要使用另外一个改变生命期的函数——AlterEventLifeTime

var alignStream = source.AlterEventLifetime(
    e => e.StartTime.Date, e => e.EndTime - e.StartTime.Date);

AlterEventLifeTime,顾名思义,就是更改事件的生命期,它既可以修改事件持续时间,也可以修改事件起始时间。在上面的代码中,前面部分指定开始时间为当天凌晨12点,后面部分指定了持续时间,即保证修改后的结束时间与前面保持一致。变更后的事件流结果如下:

问题2:怎样将事件移动/对齐到凌晨12点(即当天开始)且保持持续时间不变?

类似地,修改AlterEventLifeTime的第二个参数持续时间即可。代码如下:

var alignStream = source.AlterEventLifetime(
    e => e.StartTime.Date, e => e.EndTime - e.StartTime);

输出结果如下:

下一篇将介绍StreamInsight查询模式中的基本模式部分。

posted @ 2011-09-03 10:33  StreamInsight  阅读(1048)  评论(0编辑  收藏  举报