shouldAddRequestToWaitList method
Implementation
bool shouldAddRequestToWaitList(
String controllerId,
bool addToStack,
List<Map>? query,
) {
var currentTime = new DateTime.now().millisecondsSinceEpoch;
var shouldWait =
currentTime - this._initialTimeStamp < this.initialQueriesSyncTime;
if (addToStack && shouldWait) {
// Add future delay to execute request stack
if (!this.isLocked()) {
List executableControllers = [];
new Future.delayed(Duration(milliseconds: this.initialQueriesSyncTime),
() {
Map<String, Map> requestsToIdMap = {};
this._requestStack.forEach((request) {
var controllerId = request["id"] as String;
if (requestsToIdMap[controllerId] != null) {
requestsToIdMap[controllerId] = request;
} else {
var shouldExecute = request["execute"] != null
? request["execute"] as bool
: false;
// check if `execute` was set to `true` in older requests
if (shouldExecute) {
request["execute"] = true;
}
requestsToIdMap[controllerId] = request;
}
});
requestsToIdMap.values.forEach((request) {
var controllerId = request["id"] as String;
var shouldExecute =
request["execute"] != null ? request["execute"] as bool : null;
// check if `execute` was set to `true` in older requests
if (shouldExecute != null) {
if (shouldExecute) {
executableControllers.add(controllerId);
}
} else {
executableControllers.add(controllerId);
}
});
executableControllers.forEach((id) {
final componentInstance = this.getSearchWidget(id);
if (componentInstance != null) {
// set request status to pending
componentInstance.setRequestStatus(RequestStatus.PENDING,
options: new Option());
// Update the query
componentInstance.updateQuery();
}
});
List query = [];
requestsToIdMap.values.forEach((element) {
query.add(element);
});
// Execute combined queries in a single request
this._fetchRequest({
'query': query,
'settings': this.appbaseConfig?.toJSON()
}).then((results) {
requestsToIdMap.keys.forEach((id) {
final componentInstance = this.getSearchWidget(id);
if (componentInstance != null) {
componentInstance.setRequestStatus(RequestStatus.INACTIVE,
options: Option());
// Update the results
final prev = componentInstance.results.clone();
// Collect results from the response for a particular component
Map rawResults = results[id] != null ? results[id] : {};
// Set results
if (rawResults['hits'] != null) {
componentInstance.results.setRaw(rawResults);
componentInstance.applyOptions(Options(),
KeysToSubscribe.Results, prev, componentInstance.results);
}
if (rawResults['aggregations'] != null) {
componentInstance.handleAggregationResponse(
rawResults['aggregations'],
options: new Options(),
append: false);
}
}
});
}).catchError((error) {
executableControllers.forEach((id) {
final componentInstance = this.getSearchWidget(id);
if (componentInstance != null) {
componentInstance.setRequestStatus(RequestStatus.INACTIVE,
options: Option());
componentInstance.setError(error);
}
});
});
this._requestStack.clear();
this.unlock();
});
}
// Lock request execution
this.lock();
// Add component Id to request stack
query?.forEach((q) {
this._requestStack.add(q);
});
}
return shouldWait;
}