Состояние массива в рамках EPA CEP PROTON
Используя CEP Proton, я хочу проверить, содержится ли в атрибуте массива типов, поступающем в первом событии, для событий, полученных за определенный промежуток времени, идентификатор второго и последующих событий. Допустим, первое событие происходит с атрибутом group, который представляет собой массив целых чисел (10, 20, 30). Следующие события будут идти с идентификатором, например, 20, 25 и так далее. Я хочу проверить, включен ли идентификатор этих событий в группу атрибутов, включенную в первое событие. Для этого я создал условие в EPA
ArrayContains(ArrayGet(myevent.group,0),ArrayGet(myevent.id,ArraySize(myevent.id)-1))
Однако я получаю сообщение об ошибке, когда нажимаю на кнопку "Подтвердить".
Error Error in EPA: expression error of undefined myepa
Я делаю что-то не так? Не могу получить доступ к массиву атрибутов, используя ArrayGet
? Или, может быть ArrayContains
не может работать с результатом ArrayGet
?
JSON
{"epn":{"events":[{"name":"GupsyContextUpdate","createdDate":"Thu Sep 29 2016","attributes":[{"name":"entityId","type":"String","dimension":0},{"name":"entityType","type":"String","dimension":0,"description":"The cost of this event occurrence. Negative if this is an opportunity"},{"name":"SF","type":"Integer","dimension":0,"description":"Used in case the this event occur within an interval"},{"name":"occupied","type":"Integer","dimension":"0"},{"name":"framecounter","type":"Integer","dimension":"0"},{"name":"RSSI","type":"String","dimension":"0"},{"name":"hwversion","type":"String","dimension":"0"},{"name":"swversion","type":"String","dimension":"0"},{"name":"compassz","type":"String","dimension":"0"},{"name":"MACBS","type":"String","dimension":"0"},{"name":"SNR","type":"String","dimension":"0"},{"name":"devEUI","type":"String","dimension":"0"},{"name":"battery","type":"String","dimension":"0"},{"name":"devicetype","type":"String","dimension":"0"},{"name":"compassx","type":"String","dimension":"0"},{"name":"compassy","type":"String","dimension":"0"},{"name":"compasst","type":"String","dimension":"0"},{"name":"neighbours","type":"String","dimension":"1"},{"name":"timestamp","type":"String","dimension":"0"}]},{"name":"gupsyoutput","createdDate":"Thu Sep 29 2016","attributes":[{"name":"Certainty","type":"Double","defaultValue":"1","dimension":0,"description":"The certainty that this event happen (value between 0 to 1)"},{"name":"OccurrenceTime","type":"Date","dimension":0,"description":"No value means it equals the event detection time, other option is to use one of the defined distribution functions with parameters"},{"name":"ExpirationTime","type":"Date","dimension":0},{"name":"Cost","type":"Double","dimension":0,"description":"The cost of this event occurrence. Negative if this is an opportunity"},{"name":"Duration","type":"Double","defaultValue":"0","dimension":0,"description":"Used in case the this event occur within an interval"},{"name":"test","type":"String","dimension":"1"}]}],"epas":[{"name":"gupsyepa","createdDate":"Thu Sep 29 2016","epaType":"Aggregate","context":"gupsyct","inputEvents":[{"name":"GupsyContextUpdate","alias":"gupsyupdate","consumptionPolicy":"Consume","instanceSelectionPolicy":"First"}],"computedVariables":[{"name":"count","aggregationType":"Count","gupsyupdate":"ArrayContains(ArrayGet(gupsyupdate.neighbours,0),ArrayGet(gupsyupdate.id,ArraySize(gupsyupdate.id)-1))"}],"assertion":"count == true","evaluationPolicy":"Immediate","cardinalityPolicy":"Single","internalSegmentation":[],"derivedEvents":[{"name":"gupsyoutput","reportParticipants":false,"expressions":{"Duration":"0","test":"ArrayContains(ArrayGet(gupsyupdate.neighbours,0),ArrayGet(gupsyupdate.devEUI,ArraySize(gupsyupdate.devEUI)-1))"}}]}],"contexts":{"temporal":[{"name":"gupsyct","createdDate":"Thu Sep 29 2016","type":"TemporalInterval","atStartup":false,"neverEnding":false,"initiators":[{"initiatorType":"Event","initiatorPolicy":"Ignore","name":"GupsyContextUpdate"}],"terminators":[{"terminatorType":"RelativeTime","terminationType":"Terminate","relativeTime":"15000"}]}],"segmentation":[],"composite":[]},"consumers":[{"name":"gupsyconsumer","createdDate":"Thu Sep 29 2016","type":"Rest","properties":[{"name":"URL","value":"http://127.0.0.1/ProtonParser/TestEvent2Log.php"},{"name":"contentType","value":"application/xml"},{"name":"formatter","value":"xml"},{"name":"delimiter","value":";"},{"name":"tagDataSeparator","value":"="},{"name":"dateFormat","value":"dd/MM/yyyy-HH:mm:ss"}],"events":[{"name":"gupsyoutput"}]}],"producers":[],"name":"gupsy"}}
2 ответа
Пожалуйста, поделитесь полным JSON-определением вашего приложения.
Из предоставленной вами информации неясно, какой это тип EPA (для доступа к ряду событий вам нужен полноценный EPA, и вы должны убедиться, что вы пишете приложение таким образом, чтобы можно было различить первые и последующие события).
Кроме того, неясно, почему вы пытаетесь получить доступ к одному и тому же событию-событию в обеих частях выражения.
ArrayContains получает значения (массив, значение) в качестве операндов. Вы передаете его (значение, значение), и это при условии, что myevent.id также является массивом, который, как я понял из вашего описания, не является?
В любом случае, я вижу много потенциальных проблем с вашим выражением, поэтому я хотел бы видеть весь JSON или, по крайней мере, часть, относящуюся к EPA "myepa".
Я рассмотрел приложение JSON, есть несколько проблем: 1) Вы используете EPA типа агрегат, чтобы рассчитать COUNT. Счет для подсчета событий. Это целочисленная переменная. Никакие логические значения не могут быть назначены ему. Поэтому выражения сравнения, такие как "count == true" или присвоение логических значений, таких как: "count: ArrayContains(ArrayGet(gupsyupdate.neighbours,0),ArrayGet(gupsyupdate.id,ArraySize(gupsyupdate.id)-1))" не являются действительный.
2) Кроме того, предполагая, что вы используете это выражение где-то, а не в переменной count: - событие gupsyupdate не имеет атрибута "id", поэтому вы не можете использовать его в выражении. -ArrayGet(gupsyupdate.neighbours,0) - вернет один объект в массиве... Поэтому вы не можете использовать его в выражении ArrayContains, которое должно принимать массив
3) Политики EPA не имеют смысла... Это EPA агрегации, но вы используете его с оценкой политики "Немедленно" и политикой кардинальности "Единый". Это означает, что этот EPA будет оцениваться только один раз, сразу же после получения первого события gupsyupdate. Так что он не будет действовать как агрегатор....
Пожалуйста, пересмотрите вашу заявку в соответствии с этим входом.