execute method
Future<TrackerRuleResult>
execute({
- required TrackedEntityInstance trackedEntityInstance,
- required String program,
- TrackedEntityAttributeValue? changedAttributeValue,
Implementation
Future<TrackerRuleResult> execute(
{required TrackedEntityInstance trackedEntityInstance,
required String program,
TrackedEntityAttributeValue? changedAttributeValue}) async {
List<ProgramRule> programRules = await ProgramRuleQuery(database: database)
.withActions()
.where(attribute: 'program', value: program)
.get();
List<ProgramRuleVariable> programRuleVariables =
await ProgramRuleVariableQuery(database: database)
.where(attribute: 'program', value: program)
.get();
List<TrackedEntityAttributeValue> attributes =
await TrackedEntityAttributeValueQuery(database: database)
.where(
attribute: 'trackedEntityInstance',
value: trackedEntityInstance.trackedEntityInstance)
.get();
final dataValueEntities = DataValueEntities.fromAttributeValues(attributes);
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(() => TrackedEntityAttributeValueQuery(database: database)
.setData(TrackedEntityAttributeValue(
dirty: true,
attribute: programRuleAction.trackedEntityAttribute as String,
trackedEntityInstance:
trackedEntityInstance.trackedEntityInstance,
value: programRuleAction.data as String))
.save());
}
});
if (availableItemCount == 0) {
queue.cancel();
} else {
await queue.onComplete;
}
TrackedEntityInstance updatedTrackedEntityInstance =
await TrackedEntityInstanceQuery(database: database)
.withAttributes()
.withEnrollments()
.byId(trackedEntityInstance.id as String)
.getOne();
return TrackerRuleResult(
programRuleActions: programRuleActions,
trackedEntityInstance: updatedTrackedEntityInstance);
}