From 542bac2a44cf37ac2dbe59ab0d7a5a1817515d10 Mon Sep 17 00:00:00 2001 From: Russ Cam Date: Fri, 15 Mar 2019 18:21:45 +1000 Subject: [PATCH] Update by query API (#3597) --- .../ApiGenerator/ApiGenerator.cs | 1 - .../RequestParameters.Generated.cs | 7 ++ .../ElasticLowLevelClient.Generated.cs | 10 ++ .../IElasticLowLevelClient.Generated.cs | 8 ++ .../ListTasks/ListTasksResponse.cs | 8 ++ .../ElasticClient-UpdateByQueryRethrottle.cs | 62 ++++++++++ .../UpdateByQueryRethrottleRequest.cs | 17 +++ src/Nest/_Generated/_Descriptors.generated.cs | 14 +++ .../_Generated/_LowLevelDispatch.generated.cs | 22 ++++ src/Nest/_Generated/_Requests.generated.cs | 19 +++ .../CodeStandards/NamingConventions.doc.cs | 3 +- .../UpdateByQueryRethrottleApiTests.cs | 109 ++++++++++++++++++ .../UpdateByQueryRethrottleUrlTests.cs | 19 +++ 13 files changed, 297 insertions(+), 2 deletions(-) create mode 100644 src/Nest/Document/Multiple/UpdateByQueryRethrottle/ElasticClient-UpdateByQueryRethrottle.cs create mode 100644 src/Nest/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleRequest.cs create mode 100644 src/Tests/Tests/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleApiTests.cs create mode 100644 src/Tests/Tests/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleUrlTests.cs diff --git a/src/CodeGeneration/ApiGenerator/ApiGenerator.cs b/src/CodeGeneration/ApiGenerator/ApiGenerator.cs index ceb663c2baa..2ceb6f1ad15 100644 --- a/src/CodeGeneration/ApiGenerator/ApiGenerator.cs +++ b/src/CodeGeneration/ApiGenerator/ApiGenerator.cs @@ -30,7 +30,6 @@ public class ApiGenerator "xpack.ml.delete_forecast.json", "xpack.ml.find_file_structure.json", "delete_by_query_rethrottle.json", - "update_by_query_rethrottle.json", "xpack.ml.update_filter.json", "xpack.security.delete_privileges.json", diff --git a/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs b/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs index 3ae93337d68..585d2a31f21 100644 --- a/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs +++ b/src/Elasticsearch.Net/Domain/RequestParameters/RequestParameters.Generated.cs @@ -2230,6 +2230,13 @@ public partial class UpdateByQueryRequestParameters : RequestParametersThe number of slices this task should be divided into. Defaults to 1 meaning the task isn't sliced into subtasks. public long? Slices { get => Q("slices"); set => Q("slices", value); } } + ///Request options for UpdateByQueryRethrottle
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html
+ public partial class UpdateByQueryRethrottleRequestParameters : RequestParameters + { + public override HttpMethod DefaultHttpMethod => HttpMethod.POST; + ///The throttle to set on this request in floating sub-requests per second. -1 means set no throttle. + public long? RequestsPerSecond { get => Q("requests_per_second"); set => Q("requests_per_second", value); } + } ///Request options for CcrDeleteAutoFollowPattern
https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-delete-auto-follow-pattern.html
public partial class DeleteAutoFollowPatternRequestParameters : RequestParameters { diff --git a/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs b/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs index 7c537f5d7d1..e94bce8a711 100644 --- a/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs +++ b/src/Elasticsearch.Net/ElasticLowLevelClient.Generated.cs @@ -2930,6 +2930,16 @@ public TResponse UpdateByQuery(string index, string type, PostData bo ///A func that allows you to describe the querystring parameters & request specific connection settings. public Task UpdateByQueryAsync(string index, string type, PostData body, UpdateByQueryRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(POST, Url($"{index.NotNull("index")}/{type.NotNull("type")}/_update_by_query"), ctx, body, _params(requestParameters)); + ///POST on /_update_by_query/{task_id}/_rethrottle https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html + ///The task id to rethrottle + ///A func that allows you to describe the querystring parameters & request specific connection settings. + public TResponse UpdateByQueryRethrottle(string task_id, UpdateByQueryRethrottleRequestParameters requestParameters = null) + where TResponse : class, IElasticsearchResponse, new() => this.DoRequest(POST, Url($"_update_by_query/{task_id.NotNull("task_id")}/_rethrottle"), null, _params(requestParameters)); + ///POST on /_update_by_query/{task_id}/_rethrottle https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html + ///The task id to rethrottle + ///A func that allows you to describe the querystring parameters & request specific connection settings. + public Task UpdateByQueryRethrottleAsync(string task_id, UpdateByQueryRethrottleRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) + where TResponse : class, IElasticsearchResponse, new() => this.DoRequestAsync(POST, Url($"_update_by_query/{task_id.NotNull("task_id")}/_rethrottle"), ctx, null, _params(requestParameters)); ///DELETE on /_ccr/auto_follow/{name} https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-delete-auto-follow-pattern.html ///The name of the auto follow pattern. ///A func that allows you to describe the querystring parameters & request specific connection settings. diff --git a/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs b/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs index 82b3b3b0987..fbf88fc0cd5 100644 --- a/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs +++ b/src/Elasticsearch.Net/IElasticLowLevelClient.Generated.cs @@ -2376,6 +2376,14 @@ public partial interface IElasticLowLevelClient ///The search definition using the Query DSL ///A func that allows you to describe the querystring parameters & request specific connection settings. Task UpdateByQueryAsync(string index, string type, PostData body, UpdateByQueryRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); + ///POST on /_update_by_query/{task_id}/_rethrottle https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html + ///The task id to rethrottle + ///A func that allows you to describe the querystring parameters & request specific connection settings. + TResponse UpdateByQueryRethrottle(string task_id, UpdateByQueryRethrottleRequestParameters requestParameters = null) where TResponse : class, IElasticsearchResponse, new(); + ///POST on /_update_by_query/{task_id}/_rethrottle https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html + ///The task id to rethrottle + ///A func that allows you to describe the querystring parameters & request specific connection settings. + Task UpdateByQueryRethrottleAsync(string task_id, UpdateByQueryRethrottleRequestParameters requestParameters = null, CancellationToken ctx = default(CancellationToken)) where TResponse : class, IElasticsearchResponse, new(); ///DELETE on /_ccr/auto_follow/{name} https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-delete-auto-follow-pattern.html ///The name of the auto follow pattern. ///A func that allows you to describe the querystring parameters & request specific connection settings. diff --git a/src/Nest/Cluster/TaskManagement/ListTasks/ListTasksResponse.cs b/src/Nest/Cluster/TaskManagement/ListTasks/ListTasksResponse.cs index 4cfd59c7e94..50673f4f6f6 100644 --- a/src/Nest/Cluster/TaskManagement/ListTasks/ListTasksResponse.cs +++ b/src/Nest/Cluster/TaskManagement/ListTasks/ListTasksResponse.cs @@ -24,6 +24,11 @@ public class ListTasksResponse : ResponseBase, IListTasksResponse public class TaskExecutingNode { + [JsonProperty("attributes")] + [JsonConverter(typeof(VerbatimDictionaryKeysJsonConverter))] + public IReadOnlyDictionary Attributes { get; internal set; } = + EmptyReadOnly.Dictionary; + [JsonProperty("host")] public string Host { get; internal set; } @@ -33,6 +38,9 @@ public class TaskExecutingNode [JsonProperty("name")] public string Name { get; internal set; } + [JsonProperty("roles")] + public IEnumerable Roles { get; internal set; } + [JsonProperty("tasks")] public IReadOnlyDictionary Tasks { get; internal set; } = EmptyReadOnly.Dictionary; diff --git a/src/Nest/Document/Multiple/UpdateByQueryRethrottle/ElasticClient-UpdateByQueryRethrottle.cs b/src/Nest/Document/Multiple/UpdateByQueryRethrottle/ElasticClient-UpdateByQueryRethrottle.cs new file mode 100644 index 00000000000..08e0b2a9462 --- /dev/null +++ b/src/Nest/Document/Multiple/UpdateByQueryRethrottle/ElasticClient-UpdateByQueryRethrottle.cs @@ -0,0 +1,62 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Elasticsearch.Net; + +namespace Nest +{ + public partial interface IElasticClient + { + /// + /// Rethrottles a running update by query. Rethrottling that speeds up the query takes effect immediately + /// but rethrotting that slows down the query will take effect after completing the current batch. This prevents scroll timeouts. + /// + /// https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html#docs-update-by-query-rethrottle + /// + IListTasksResponse UpdateByQueryRethrottle(TaskId taskId, Func selector = null); + + /// + IListTasksResponse UpdateByQueryRethrottle(IUpdateByQueryRethrottleRequest request); + + /// + Task UpdateByQueryRethrottleAsync(TaskId taskId, + Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ); + + /// + Task UpdateByQueryRethrottleAsync(IUpdateByQueryRethrottleRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ); + } + + public partial class ElasticClient + { + /// + public IListTasksResponse UpdateByQueryRethrottle(TaskId taskId, Func selector = null) => + UpdateByQueryRethrottle(selector.InvokeOrDefault(new UpdateByQueryRethrottleDescriptor(taskId))); + + /// + public IListTasksResponse UpdateByQueryRethrottle(IUpdateByQueryRethrottleRequest request) => + Dispatcher.Dispatch( + request, + (p, d) => LowLevelDispatch.UpdateByQueryRethrottleDispatch(p) + ); + + /// + public Task UpdateByQueryRethrottleAsync(TaskId taskId, Func selector = null, + CancellationToken cancellationToken = default(CancellationToken) + ) => + UpdateByQueryRethrottleAsync(selector.InvokeOrDefault(new UpdateByQueryRethrottleDescriptor(taskId)), cancellationToken); + + /// + public Task UpdateByQueryRethrottleAsync(IUpdateByQueryRethrottleRequest request, + CancellationToken cancellationToken = default(CancellationToken) + ) => + Dispatcher.DispatchAsync( + request, + cancellationToken, + (p, d, c) => LowLevelDispatch.UpdateByQueryRethrottleDispatchAsync(p, c) + ); + } +} diff --git a/src/Nest/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleRequest.cs b/src/Nest/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleRequest.cs new file mode 100644 index 00000000000..24017a731d5 --- /dev/null +++ b/src/Nest/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleRequest.cs @@ -0,0 +1,17 @@ +using System; +using Newtonsoft.Json; + +namespace Nest +{ + public partial interface IUpdateByQueryRethrottleRequest + { + } + + public partial class UpdateByQueryRethrottleRequest: IUpdateByQueryRethrottleRequest + { + } + + public partial class UpdateByQueryRethrottleDescriptor : IUpdateByQueryRethrottleRequest + { + } +} diff --git a/src/Nest/_Generated/_Descriptors.generated.cs b/src/Nest/_Generated/_Descriptors.generated.cs index b1728a70850..b47e13b5516 100644 --- a/src/Nest/_Generated/_Descriptors.generated.cs +++ b/src/Nest/_Generated/_Descriptors.generated.cs @@ -3859,6 +3859,20 @@ public UpdateByQueryDescriptor(Indices index) : base(r=>r.Required("index", inde ///The number of slices this task should be divided into. Defaults to 1 meaning the task isn't sliced into subtasks. public UpdateByQueryDescriptor Slices(long? slices) => Qs("slices", slices); } + ///descriptor for UpdateByQueryRethrottle
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html
+ public partial class UpdateByQueryRethrottleDescriptor : RequestDescriptorBase, IUpdateByQueryRethrottleRequest + { + /// /_update_by_query/{task_id}/_rethrottle + /// this parameter is required + public UpdateByQueryRethrottleDescriptor(TaskId task_id) : base(r=>r.Required("task_id", task_id)){} + // values part of the url path + TaskId IUpdateByQueryRethrottleRequest.TaskId => Self.RouteValues.Get("task_id"); + + // Request parameters + + ///The throttle to set on this request in floating sub-requests per second. -1 means set no throttle. + public UpdateByQueryRethrottleDescriptor RequestsPerSecond(long? requestsPerSecond) => Qs("requests_per_second", requestsPerSecond); + } ///descriptor for CcrDeleteAutoFollowPattern
https://www.elastic.co/guide/en/elasticsearch/reference/current/ccr-delete-auto-follow-pattern.html
public partial class DeleteAutoFollowPatternDescriptor : RequestDescriptorBase, IDeleteAutoFollowPatternRequest { diff --git a/src/Nest/_Generated/_LowLevelDispatch.generated.cs b/src/Nest/_Generated/_LowLevelDispatch.generated.cs index ecb4b32ed07..f1ee935d55d 100644 --- a/src/Nest/_Generated/_LowLevelDispatch.generated.cs +++ b/src/Nest/_Generated/_LowLevelDispatch.generated.cs @@ -2924,6 +2924,28 @@ internal partial class LowLevelDispatch throw InvalidDispatch("UpdateByQuery", p, new [] { POST }, "/{index}/_update_by_query", "/{index}/{type}/_update_by_query"); } + internal TResponse UpdateByQueryRethrottleDispatch(IRequest p) where TResponse : class, IElasticsearchResponse, new() + { + switch(p.HttpMethod) + { + case POST: + if (AllSetNoFallback(p.RouteValues.TaskId)) return _lowLevel.UpdateByQueryRethrottle(p.RouteValues.TaskId,p.RequestParameters); + break; + } + throw InvalidDispatch("UpdateByQueryRethrottle", p, new [] { POST }, "/_update_by_query/{task_id}/_rethrottle"); + } + + internal Task UpdateByQueryRethrottleDispatchAsync(IRequest p, CancellationToken ct) where TResponse : class, IElasticsearchResponse, new() + { + switch(p.HttpMethod) + { + case POST: + if (AllSetNoFallback(p.RouteValues.TaskId)) return _lowLevel.UpdateByQueryRethrottleAsync(p.RouteValues.TaskId,p.RequestParameters,ct); + break; + } + throw InvalidDispatch("UpdateByQueryRethrottle", p, new [] { POST }, "/_update_by_query/{task_id}/_rethrottle"); + } + internal TResponse CcrDeleteAutoFollowPatternDispatch(IRequest p) where TResponse : class, IElasticsearchResponse, new() { switch(p.HttpMethod) diff --git a/src/Nest/_Generated/_Requests.generated.cs b/src/Nest/_Generated/_Requests.generated.cs index f599e237461..eecbb4b78f1 100644 --- a/src/Nest/_Generated/_Requests.generated.cs +++ b/src/Nest/_Generated/_Requests.generated.cs @@ -6277,6 +6277,25 @@ public UpdateByQueryRequest(Indices index, Types type) : base(r=>r.Required("ind public long? Slices { get => Q("slices"); set => Q("slices", value); } } [JsonObject(MemberSerialization = MemberSerialization.OptIn)] + public partial interface IUpdateByQueryRethrottleRequest : IRequest + { + TaskId TaskId { get; } + } + ///Request parameters for UpdateByQueryRethrottle
https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update-by-query.html
+ public partial class UpdateByQueryRethrottleRequest : PlainRequestBase, IUpdateByQueryRethrottleRequest + { + protected IUpdateByQueryRethrottleRequest Self => this; + ////_update_by_query/{task_id}/_rethrottle + ///this parameter is required + public UpdateByQueryRethrottleRequest(TaskId task_id) : base(r=>r.Required("task_id", task_id)){} + // values part of the url path + TaskId IUpdateByQueryRethrottleRequest.TaskId => Self.RouteValues.Get("task_id"); + + // Request parameters + ///The throttle to set on this request in floating sub-requests per second. -1 means set no throttle. + public long? RequestsPerSecond { get => Q("requests_per_second"); set => Q("requests_per_second", value); } + } + [JsonObject(MemberSerialization = MemberSerialization.OptIn)] public partial interface IUpdateDatafeedRequest : IRequest { Id DatafeedId { get; } diff --git a/src/Tests/Tests/CodeStandards/NamingConventions.doc.cs b/src/Tests/Tests/CodeStandards/NamingConventions.doc.cs index b55a488282c..e3cd4e64ed4 100644 --- a/src/Tests/Tests/CodeStandards/NamingConventions.doc.cs +++ b/src/Tests/Tests/CodeStandards/NamingConventions.doc.cs @@ -124,7 +124,8 @@ public void ParityBetweenRequestsAndResponses() typeof(IndicesShardStoresRequest), typeof(RenderSearchTemplateRequest), typeof(MultiSearchTemplateRequest), - typeof(CreateRequest<>) + typeof(CreateRequest<>), + typeof(UpdateByQueryRethrottleRequest) // uses ListTasksResponse }; var types = typeof(IRequest).Assembly().GetTypes(); diff --git a/src/Tests/Tests/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleApiTests.cs b/src/Tests/Tests/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleApiTests.cs new file mode 100644 index 00000000000..02fa225cd80 --- /dev/null +++ b/src/Tests/Tests/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleApiTests.cs @@ -0,0 +1,109 @@ +using System; +using System.Linq; +using Elasticsearch.Net; +using FluentAssertions; +using Nest; +using Tests.Document.Multiple.Reindex; +using Tests.Domain; +using Tests.Framework; +using Tests.Framework.Integration; +using Tests.Core.Extensions; + +namespace Tests.Document.Multiple.UpdateByQueryRethrottle +{ + public class UpdateByQueryRethrottleApiTests + : ApiIntegrationTestBase + { + protected const string TaskIdKey = "taskId"; + + public UpdateByQueryRethrottleApiTests(ReindexCluster cluster, EndpointUsage usage) : base(cluster, usage) { } + + protected override bool ExpectIsValid => true; + protected override object ExpectJson => null; + protected override int ExpectStatusCode => 200; + + protected override Func Fluent => d => d + .RequestsPerSecond(-1); + + protected override HttpMethod HttpMethod => HttpMethod.POST; + + protected override UpdateByQueryRethrottleRequest Initializer => new UpdateByQueryRethrottleRequest(TaskId) + { + RequestsPerSecond = -1 + }; + + protected override bool SupportsDeserialization => false; + protected TaskId TaskId => RanIntegrationSetup ? ExtendedValue(TaskIdKey) : "foo:1"; + + protected override string UrlPath => $"/_update_by_query/{TaskId.NodeId}%3A{TaskId.TaskNumber}/_rethrottle?requests_per_second=-1"; + + protected override UpdateByQueryRethrottleDescriptor NewDescriptor() => new UpdateByQueryRethrottleDescriptor(TaskId); + + protected override void IntegrationSetup(IElasticClient client, CallUniqueValues values) + { + foreach (var callUniqueValue in values) + { + client.IndexMany(Project.Projects, callUniqueValue.Value); + client.Refresh(callUniqueValue.Value); + } + } + + protected override LazyResponses ClientUsage() => Calls( + (client, f) => client.UpdateByQueryRethrottle(TaskId, f), + (client, f) => client.UpdateByQueryRethrottleAsync(TaskId, f), + (client, r) => client.UpdateByQueryRethrottle(r), + (client, r) => client.UpdateByQueryRethrottleAsync(r) + ); + + protected override void OnBeforeCall(IElasticClient client) + { + client.IndexMany(Project.Projects, CallIsolatedValue); + client.Refresh(CallIsolatedValue); + + var updateByQuery = client.UpdateByQuery(u => u + .Index(CallIsolatedValue) + .Conflicts(Conflicts.Proceed) + .Query(q => q.MatchAll()) + .Script(s => s.Source("ctx._source.numberOfCommits+=10")) + .Refresh() + .RequestsPerSecond(1) + .WaitForCompletion(false) + ); + + updateByQuery.ShouldBeValid(); + ExtendedValue(TaskIdKey, updateByQuery.Task); + } + + protected override void ExpectResponse(IListTasksResponse response) + { + response.ShouldBeValid(); + + response.Nodes.Should().NotBeEmpty().And.HaveCount(1); + var node = response.Nodes.First().Value; + + node.Name.Should().NotBeNullOrEmpty(); + node.TransportAddress.Should().NotBeNullOrEmpty(); + node.Host.Should().NotBeNullOrEmpty(); + node.Ip.Should().NotBeNullOrEmpty(); + node.Roles.Should().NotBeEmpty(); + node.Attributes.Should().NotBeEmpty(); + + node.Tasks.Should().NotBeEmpty().And.HaveCount(1); + node.Tasks.First().Key.Should().Be(TaskId); + + var task = node.Tasks.First().Value; + + task.Node.Should().NotBeNullOrEmpty().And.Be(TaskId.NodeId); + task.Id.Should().Be(TaskId.TaskNumber); + task.Type.Should().NotBeNullOrEmpty(); + task.Action.Should().NotBeNullOrEmpty(); + + task.Status.RequestsPerSecond.Should().Be(-1); + + task.StartTimeInMilliseconds.Should().BeGreaterThan(0); + task.RunningTimeInNanoSeconds.Should().BeGreaterThan(0); + task.Cancellable.Should().BeTrue(); + } + } +} diff --git a/src/Tests/Tests/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleUrlTests.cs b/src/Tests/Tests/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleUrlTests.cs new file mode 100644 index 00000000000..7673d541c8d --- /dev/null +++ b/src/Tests/Tests/Document/Multiple/UpdateByQueryRethrottle/UpdateByQueryRethrottleUrlTests.cs @@ -0,0 +1,19 @@ +using System.Threading.Tasks; +using Elastic.Xunit.XunitPlumbing; +using Nest; +using Tests.Framework; + +namespace Tests.Document.Multiple.UpdateByQueryRethrottle +{ + public class UpdateByQueryRethrottleUrlTests : UrlTestsBase + { + private readonly TaskId _taskId = "rhtoNesNR4aXVIY2bRR4GQ:13056"; + + [U] public override async Task Urls() => + await UrlTester.POST($"/_update_by_query/{UrlTester.EscapeUriString(_taskId.ToString())}/_rethrottle") + .Fluent(c => c.UpdateByQueryRethrottle(_taskId)) + .Request(c => c.UpdateByQueryRethrottle(new UpdateByQueryRethrottleRequest(_taskId))) + .FluentAsync(c => c.UpdateByQueryRethrottleAsync(_taskId)) + .RequestAsync(c => c.UpdateByQueryRethrottleAsync(new UpdateByQueryRethrottleRequest(_taskId))); + } +}