execute static method
Future<EventRuleResult>
execute({
- required Event event,
- required String program,
- EventDataValue? changedEventDataValue,
Implementation
static Future<EventRuleResult> execute(
{required Event event,
required String program,
EventDataValue? changedEventDataValue}) async {
List<ProgramRule> programRules = await ProgramRuleQuery()
.withActions()
.where(attribute: 'program', value: program)
.get();
List<ProgramRuleVariable> programRuleVariables =
await ProgramRuleVariableQuery()
.where(attribute: 'program', value: program)
.get();
List<EventDataValue> eventDataValues = await EventDataValueQuery()
.where(attribute: 'event', value: event.id)
.get();
final dataValueEntities =
DataValueEntities.fromEventDataValues(eventDataValues);
List<ProgramRuleAction> programRuleActions = ProgramRuleEngine.execute(
dataValueEntities: dataValueEntities,
programRules: programRules,
programRuleVariables: programRuleVariables);
final queue = Queue(parallel: 50);
num availableItemCount = 0;
programRuleActions.forEach((programRuleAction) {
if (programRuleAction.programRuleActionType == 'ASSIGN') {
availableItemCount++;
queue.add(() => EventDataValueQuery()
.setData(EventDataValue(
dirty: true,
dataElement: programRuleAction.dataElement as String,
event: event.id,
value: programRuleAction.data as String))
.save());
}
});
if (availableItemCount == 0) {
queue.cancel();
} else {
await queue.onComplete;
}
Event updatedEvent =
await EventQuery().withDataValues().byId(event.id as String).getOne();
return EventRuleResult(
event: updatedEvent, programRuleActions: programRuleActions);
}