in src/main/java/org/opensearch/search/asynchronous/service/AsynchronousSearchPersistenceService.java [162:216]
public void deleteResponse(String id, User user, ActionListener<Boolean> listener) {
if (indexExists() == false) {
logger.debug("Async search index [{}] doesn't exists", ASYNC_SEARCH_RESPONSE_INDEX);
listener.onFailure(new ResourceNotFoundException(id));
return;
}
Consumer<Exception> onFailure = e -> {
final Throwable cause = ExceptionsHelper.unwrapCause(e);
if (cause instanceof DocumentMissingException) {
logger.debug(() -> new ParameterizedMessage("Async search response doc already deleted {}", id), e);
listener.onFailure(new ResourceNotFoundException(id));
} else {
logger.debug(() -> new ParameterizedMessage("Failed to delete asynchronous search for id {}", id), e);
listener.onFailure(cause instanceof Exception ? (Exception) cause : new NotSerializableExceptionWrapper(cause));
}
};
if (user == null) {
client.delete(new DeleteRequest(ASYNC_SEARCH_RESPONSE_INDEX, id), ActionListener.wrap(deleteResponse -> {
if (deleteResponse.getResult() == DocWriteResponse.Result.DELETED) {
logger.debug("Delete asynchronous search {} successful. Returned result {}", id, deleteResponse.getResult());
listener.onResponse(true);
} else {
logger.debug("Delete asynchronous search {} unsuccessful. Returned result {}", id, deleteResponse.getResult());
listener.onFailure(new ResourceNotFoundException(id));
}
}, onFailure));
} else {
UpdateRequest updateRequest = new UpdateRequest(ASYNC_SEARCH_RESPONSE_INDEX, id);
String scriptCode = "if (ctx._source.user == null || ctx._source.user.backend_roles == null || " +
"( params.backend_roles!=null && params.backend_roles.containsAll(ctx._source.user.backend_roles))) " +
"{ ctx.op = 'delete' } else { ctx.op = 'none' }";
Map<String, Object> params = new HashMap<>();
params.put("backend_roles", user.getBackendRoles());
Script deleteConditionallyScript = new Script(ScriptType.INLINE, "painless", scriptCode, params);
updateRequest.script(deleteConditionallyScript);
client.update(updateRequest, ActionListener.wrap(deleteResponse -> {
switch (deleteResponse.getResult()) {
case UPDATED:
listener.onFailure(new IllegalStateException("Document updated when requesting delete for asynchronous search id "
+ id));
break;
case NOOP:
listener.onFailure(new OpenSearchSecurityException(
"User doesn't have necessary roles to access the asynchronous search with id " + id, RestStatus.FORBIDDEN));
break;
case NOT_FOUND:
listener.onFailure(new ResourceNotFoundException(id));
break;
case DELETED:
listener.onResponse(true);
break;
}
}, onFailure));
}
}