triggerCustomQuery method
- {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);
}