Если бы я выздоровел. Вы пытаетесь создать или обновить событие в зависимости от того, существует ли событие с тем же «ключом» .
Один из подходов заключается в создании вашего собственного «ключа» следующим образом:
insert into
CreateEvent
select
"testtype" as type,
part.event.source as source,
"testext" as text,
{
"mycustomkey" , "customValue",
} as fragments
from EventCreated;
Здесь мы создаем событие с пользовательским key => «mycustomkey» с помощьюcustom value => "customValue".
Затем, когда создается новое событие, вы можете использовать предложение "where" , чтобы узнать:вам нужно создать новое событие или обновить другое событие.
// create a new event if the firstEvent function return an event which
// the "mycustomkey" key if different to "customValue"
insert into
CreateEvent
select
"testtype" as type,
part.event.source as source,
"testext" as text,
{
"mycustomkey" , "customValue",
} as fragments
from EventCreated e
where getString(cast(
findFirstEventByFragmentTypeAndType("mycustomkey", "testtype"),
com.cumulocity.model.event),
"mycustomkey") != "customValue";
Здесь просто обновляется событие, если функция if firstEvent возвращает событие, которое "mycustomkey" если равно "customValue"
insert into
EventUpdated
select
"testtype" as type,
part.event.source as source,
"testext" as text,
{
"mycustomkey" , "customValue",
} as fragments,
cast(findFirstEventByFragmentTypeAndType("mycustomkey",
"testtype"), com.cumulocity.model.event), "mycustomkey").getId() as
id
from EventCreated e
where getString(cast(
findFirstEventByFragmentTypeAndType("mycustomkey", "testtype"),
com.cumulocity.model.event),
"mycustomkey") = "customValue";
Для этого решения необходимо, чтобы "customValue" знали об этом, а также функция findFirstEventByFragmentTypeAndType предполагает, что она возвратит нужное вам событие. Мы можем улучшить это решение, купив вызов другой функции, такой как findOneEventByFragmentType , findEventByFragmentTypeAndSourceAndTimeBetweenAndType и т. Д. (Вы можете найти дополнительную информацию здесь ) и найти нужное событие, используяФункция javascript, такая как:
insert into
CreateEvent
select
"testtype" as type,
part.event.source as source,
"testext" as text,
{
"mycustomkey" , "customValue",
} as fragments
from EventCreated e
where findTheCorrectEvent(
findEventByFragmentTypeAndSourceAndTimeBetweenAndType(
"mycusto mkey", "source", datefrom, dateTo).toJSON(),
"customValue") = true;
insert into
EventUpdated
select
"testtype" as type,
part.event.source as source,
"testext" as text,
{
"mycustomkey" , "customValue",
} as fragments
from EventCreated e
where findTheCorrectEvent(
findEventByFragmentTypeAndSourceAndTimeBetweenAndType(
"mycusto mkey", "source", datefrom, dateTo).toJSON(),
"customValue") = false;
create expression Boolean findTheCorrectEvent(evens, "customValue") [
var result = _findTheCorrectEvent(events, "customValue")
function _findTheCorrectEvent(events, referenceKey){
var _events = JSON.parse(events)
var result = false
_events.forEach(function(event){
if(event.mycustomkey === referenceKey) result = true
})
return result
}
result
];
Другой подход, который в долгосрочной перспективе проще, заключается в создании микросервиса, который делает это. Один микросервис может проверить последние созданные события и убедиться, что ключи уже существуют, а затем обновить то же событие, в противном случае создать новое событие.
В обоих решениях нам нужно создать «настраиваемый ключ» с «настраиваемым значением» в другом, чтобы узнать, существует ли уже событие. Этот «пользовательский ключ» может быть создан с использованием уникального ключа, такого как currenttime, который представляет собой число.
Надеюсь, это поможет вам.
Удачи!