Я использую StreamInsight для CEP в течение нескольких месяцев и заинтересован в переходе на ASA. У меня есть вопрос, на который я не могу ответить из документации ASA. В StreamInsight я могу изменить продолжительность события, чтобы создать потоки сигналов из дискретных событий в определенный момент времени. Например.
var mySignal = from s in myEventStream
.AlterEventDuration(s => TimeSpan.MaxValue)
.ClipEventDuration(myEventStream, (s, e) => s.DeviceId == e.DeviceId && s.EventCode == e.EventCode && s.Value != e.Value)
.ShiftEventTime(e => TimeSpan.FromTicks(1))
where s.EventCode == "512"
join e in myEventStream on s.DeviceId equals e.DeviceId
select new
{
DeviceId = s.DeviceId,
EventCode = s.EventCode,
Start = s.Timestamp,
End = e.Timestamp,
Duration = e.Timestamp - s.Timestamp,
Value = s.Value
};
Что я пытаюсь сделать, так это обнаружить перекрытие между этим сигналом высокого/низкого типа и другим потоком событий на определенный момент времени. Как я могу добиться того же в ASA?
Справочная информация. У меня есть устройства, которые отправляют события из нескольких источников в концентратор событий Azure. Некоторые из этих событий являются событиями включения/выключения контактов. Каждый тип контакта представлен «Кодом события», а поле «Значение» указывает, является ли контакт открытым или закрытым. Я ищу запрос ASA, который сообщит мне, когда EventCode 512 находится в состоянии «Включено» в то же время, когда EventCode X также находится в состоянии «Включено».
Решение
Ниже приведен модифицированный код от @Andrew, который обнаруживает, что контакт закрыт, а переключатель открыт. 'inStream' определяется в операторе WITH с отметкой времени в поле Timestamp:
SELECT
SwitchOpen.DeviceId,
SwitchOpen.Timestamp,
'511' AS [EventCode],
'Switch is Open' AS [EventDescription],
SwitchOpen.Value,
SwitchOpen.LocationCode
INTO [outStream]
FROM
[inStream] AS SwitchOpen
INNER JOIN [inStream] AS ContactClosed
ON SwitchOpen.DeviceId = ContactClosed.DeviceId
AND DateDiff(second, SwitchOpen, ContactClosed) BETWEEN 1 AND 3600
LEFT JOIN [inStream] AS SwitchClosed
ON SwitchOpen.DeviceId = SwitchClosed.DeviceId
AND SwitchClosed.EventCode = SwitchOpen.EventCode
AND SwitchClosed.Value != SwitchOpen.Value
AND DateDiff(second, SwitchOpen, SwitchClosed) BETWEEN 1 AND 3600
AND DateDiff(second, SwitchClosed, ContactClosed) BETWEEN 1 AND 3600
WHERE
SwitchOpen.Value = 0.0
AND SwitchOpen.EventCode = '256'
AND ContactClosed.Value = 1.0
AND ContactClosed.EventCode = '512'
AND SwitchClosed.Timestamp IS NULL