StreamInsight — проблема с определением правильного окна

Я начал использовать StreamInsight и использую его как службу wcf. Я уже пытался обратиться за помощью в «Руководство автостопом по запросам Microsoft StreamInsight» и пробовал примеры, а также примеры в codeplex.

Моя проблема заключается в следующем:

Мой производитель событий передает адаптеру AlertEvent:

public sealed class AlertEvent
{
    public DateTime Date { get; set; }
    public long IDGroup { get; set; }
    public bool IsToNormalize { get; set; }
    public bool IsError { get; set; }
}

Когда AlertEvent имеет IsError = false, флаг IsToNormalize имеет значение true;

Поведение, которого я пытаюсь добиться, заключается в том, что когда я получаю поток с IsError, я хочу увидеть, прибудет ли в следующие «x» минут какое-либо предупреждениеEvent с IsToNormalize. Затем я отправляю на вывод событие IsError AlarmEvent, которое запустило поиск.

Что я сделал, так это то, что когда я получаю ввод, соответствующий фильтру, я продлеваю его время жизни на «x» минут и создаю TumblingWindow, чтобы увидеть, приходит ли в этот период другое AlertEvent с другим флагом (используя ExtensionMethod для итерации через все полезные нагрузки в окне).

var stream= from item in input
            where item.IsError
            group item by item.IdGroup into eachGroup
            from window in eachDigital.AlterEventDuration(e => TimeSpan.FromMinutes((double)1.5)).TumblingWindow(TimeSpan.FromSeconds(15), HoppingWindowOutputPolicy.ClipToWindowEnd)
            select new
            {
                Id = eachDigital.Key,
                NormEvents = window.HasNormalizationEvents(),
                Count = window.Count()
            };

Затем, чтобы получить событие AlarmEvent, вызвавшее TumblingWindow, я выполнил соединение с исходным вводом.

var resultStream = from e1 in stream
                   join e2 in input
                   on e1.Id equals e2.DigitalTag
                   where e1.NormEvents != 0
                   select e2;

Это вообще не работает...:/Есть идеи, которые помогут решить эту проблему?

Еще одно сомнение, которое у меня есть, заключается в том, будет ли создано новое окно с новой startDate для каждого ввода, который проходит фильтр, или будет создано только одно tumblingWindow.

Спасибо.


person Soulbe    schedule 27.05.2011    source источник
comment
@Mitch Wheat: Зачем вам нужен такой стимул, чтобы помочь другому человеку? Если не хочешь помочь, то не помогай. не вижу проблемы...   -  person Megacan    schedule 27.05.2011
comment
@Megacan: всем нужны стимулы.   -  person Mitch Wheat    schedule 28.05.2011


Ответы (1)


Попробуй это:

// Move all error events
// to the point where the potential timeout would occur.
var timedOut = input
                   .Where(e => e.IsError == true)
                   .ShiftEventTime(e => e.StartTime + TimeSpan.FromMinutes(5));

// Extend all events IsToNormalize by the timeout.
var following = input
                   .Where(e => e. IsToNormalize == true)
                   .AlterEventDuration(e => TimeSpan.FromMinutes(5));

// Mask away the potential timeout events by the extended events.
// - If IsToNormalize did not occur within the timeout, then the shifted error event
// will remain unchanged by the left-anti-semi-join and represent
// the desired output.
var result = from t in timedOut
             where (from c in following
                    where t.IdGroup == c.IdGroup
                    select c).IsEmpty()
             select t; // or some projection on t
person romans    schedule 27.05.2011