shouldAddRequestToWaitList method

bool shouldAddRequestToWaitList(
  1. String controllerId,
  2. bool addToStack,
  3. List<Map>? query
)

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;
}