triggerCustomQuery method

Future triggerCustomQuery (
  1. {Option options}
)

can be used to execute queries for the dependent/watcher components.

Implementation

Future triggerCustomQuery({Option options}) async {
  // Generate query again after resetting changes
  final generatedQuery = this._generateQuery();
  if (generatedQuery.requestBody.length != 0) {
    if (isEqual(this._query, generatedQuery.requestBody)) {
      return Future.value(true);
    }
    // set the request loading to true for all the requests
    generatedQuery.orderOfQueries.forEach((id) {
      final componentInstance = this._parent.getSearchWidget(id);
      if (componentInstance != null) {
        // Reset `from` and `after` values
        componentInstance.setFrom(0,
            options: new Options(
                triggerDefaultQuery: false,
                triggerCustomQuery: false,
                stateChanges: true));
        componentInstance.setAfter(null,
            options: new Options(
                triggerDefaultQuery: false,
                triggerCustomQuery: false,
                stateChanges: true));
        componentInstance._setRequestStatus(RequestStatus.PENDING);
        // Update the query
        componentInstance._updateQuery();
      }
    });
    try {
      // Re-generate query after changes
      final finalGeneratedQuery = this._generateQuery();
      final results = await this._fetchRequest({
        'query': finalGeneratedQuery.requestBody,
        'settings': this.appbaseSettings?.toJSON()
      }, false);
      // Update the state for components
      finalGeneratedQuery.orderOfQueries.forEach((id) {
        final componentInstance = this._parent.getSearchWidget(id);
        if (componentInstance != null) {
          componentInstance._setRequestStatus(RequestStatus.INACTIVE);
          // Reset value for dependent components
          componentInstance.setValue(null,
              options: new Options(
                  triggerDefaultQuery: false,
                  triggerCustomQuery: false,
                  stateChanges: true));
          // Update the results
          final prev = componentInstance.results;
          // Collect results from the response for a particular component
          Map rawResults =
              results != null && results[id] != null ? results[id] : {};
          // Set results
          if (rawResults['hits'] != null) {
            componentInstance.results.setRaw(rawResults);
            componentInstance._applyOptions(
                new Options(stateChanges: options?.stateChanges),
                'results',
                prev,
                componentInstance.results);
          }

          if (rawResults['aggregations'] != null) {
            componentInstance._handleAggregationResponse(
                rawResults['aggregations'],
                options: new Options(stateChanges: options?.stateChanges));
          }
        }
      });
      return Future.value(results);
    } catch (e) {
      return _handleError(e);
    }
  }
  return Future.value(true);
}