private void ExecuteQueryOperation(IndexQueryServerSide query, Func <QueryRunner, QueryOperationOptions, Action <IOperationProgress>, OperationCancelToken, Task <IOperationResult> > operation, DocumentsOperationContext context, IDisposable returnContextToPool, Operations.Operations.OperationType operationType) { var options = GetQueryOperationOptions(); var token = CreateTimeLimitedOperationToken(); var operationId = Database.Operations.GetNextOperationId(); var task = Database.Operations.AddOperation(Database, query.Metadata.IndexName, operationType, onProgress => operation(Database.QueryRunner, options, onProgress, token), operationId, token); using (var writer = new BlittableJsonTextWriter(context, ResponseBodyStream())) { writer.WriteOperationId(context, operationId); } task.ContinueWith(_ => { using (returnContextToPool) token.Dispose(); }); }
private async Task ExecuteQueryOperation(IndexQueryServerSide query, Func <QueryRunner, QueryOperationOptions, Action <IOperationProgress>, OperationCancelToken, Task <IOperationResult> > operation, IDisposable returnContextToPool, Operations.Operations.OperationType operationType) { var options = GetQueryOperationOptions(); var token = CreateTimeLimitedQueryOperationToken(); var operationId = Database.Operations.GetNextOperationId(); var indexName = query.Metadata.IsDynamic ? (query.Metadata.IsCollectionQuery ? "collection/" : "dynamic/") + query.Metadata.CollectionName : query.Metadata.IndexName; var details = new BulkOperationResult.OperationDetails { Query = query.Query }; var task = Database.Operations.AddOperation( Database, indexName, operationType, onProgress => operation(Database.QueryRunner, options, onProgress, token), operationId, details, token); using (ContextPool.AllocateOperationContext(out JsonOperationContext context)) await using (var writer = new AsyncBlittableJsonTextWriter(context, ResponseBodyStream())) { writer.WriteOperationIdAndNodeTag(context, operationId, ServerStore.NodeTag); } _ = task.ContinueWith(_ => { using (returnContextToPool) token.Dispose(); }); }