From 183fcfe0fe22bdfa937ae1f0ecdb8b04b09af1d2 Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Wed, 8 Jun 2022 11:35:15 +0100 Subject: [PATCH 1/8] Generate types for msearch --- .../_Generated/Api/ApiUrlsLookup.g.cs | 1 + .../_Generated/Api/MultiSearchRequest.g.cs | 182 ++++++++++++++++++ .../_Generated/Api/MultiSearchResponse.g.cs | 35 ++++ .../Client/ElasticsearchClient.g.cs | 42 ++++ .../_Generated/Types/ErrorResponseBase.g.cs | 38 ++++ .../Types/Migration/MigrationFeature.g.cs | 12 ++ .../_Generated/Types/MultiSearchItem.g.cs | 33 ++++ .../_Generated/Types/ResponseBody.g.cs | 81 ++++++++ .../_Generated/Types/SearchResponseItem.g.cs | 38 ++++ 9 files changed, 462 insertions(+) create mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs create mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchResponse.g.cs create mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/ErrorResponseBase.g.cs create mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/MultiSearchItem.g.cs create mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/ResponseBody.g.cs create mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchResponseItem.g.cs diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Api/ApiUrlsLookup.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Api/ApiUrlsLookup.g.cs index 8c1150269e5..6972c88dfbb 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Api/ApiUrlsLookup.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Api/ApiUrlsLookup.g.cs @@ -216,6 +216,7 @@ internal static class ApiUrlsLookups internal static ApiUrls MachineLearningValidateDetector = new ApiUrls(new[] { "/_ml/anomaly_detectors/_validate/detector" }); internal static ApiUrls MachineLearningValidate = new ApiUrls(new[] { "/_ml/anomaly_detectors/_validate" }); internal static ApiUrls NoNamespaceMget = new ApiUrls(new[] { "/_mget", "/{index}/_mget" }); + internal static ApiUrls NoNamespaceMsearch = new ApiUrls(new[] { "/_msearch", "/{index}/_msearch" }); internal static ApiUrls NodesHotThreads = new ApiUrls(new[] { "/_nodes/hot_threads", "/_nodes/{node_id}/hot_threads" }); internal static ApiUrls NodesInfo = new ApiUrls(new[] { "/_nodes", "/_nodes/{node_id}", "/_nodes/{metric}", "/_nodes/{node_id}/{metric}" }); internal static ApiUrls NodesReloadSecureSettings = new ApiUrls(new[] { "/_nodes/reload_secure_settings", "/_nodes/{node_id}/reload_secure_settings" }); diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs new file mode 100644 index 00000000000..d4d4ec9e351 --- /dev/null +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs @@ -0,0 +1,182 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. +// +// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ +// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ +// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ +// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ +// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ +// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ +// ------------------------------------------------ +// +// This file is automatically generated. +// Please do not edit these files manually. +// +// ------------------------------------------------ + +using Elastic.Transport; +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Text.Json; +using System.Text.Json.Serialization; + +#nullable restore +namespace Elastic.Clients.Elasticsearch +{ + public sealed class MultiSearchRequestParameters : RequestParameters + { + [JsonIgnore] + public bool? AllowNoIndices { get => Q("allow_no_indices"); set => Q("allow_no_indices", value); } + + [JsonIgnore] + public bool? CcsMinimizeRoundtrips { get => Q("ccs_minimize_roundtrips"); set => Q("ccs_minimize_roundtrips", value); } + + [JsonIgnore] + public Elastic.Clients.Elasticsearch.ExpandWildcards? ExpandWildcards { get => Q("expand_wildcards"); set => Q("expand_wildcards", value); } + + [JsonIgnore] + public bool? IgnoreThrottled { get => Q("ignore_throttled"); set => Q("ignore_throttled", value); } + + [JsonIgnore] + public bool? IgnoreUnavailable { get => Q("ignore_unavailable"); set => Q("ignore_unavailable", value); } + + [JsonIgnore] + public long? MaxConcurrentSearches { get => Q("max_concurrent_searches"); set => Q("max_concurrent_searches", value); } + + [JsonIgnore] + public long? MaxConcurrentShardRequests { get => Q("max_concurrent_shard_requests"); set => Q("max_concurrent_shard_requests", value); } + + [JsonIgnore] + public long? PreFilterShardSize { get => Q("pre_filter_shard_size"); set => Q("pre_filter_shard_size", value); } + + [JsonIgnore] + public bool? RestTotalHitsAsInt { get => Q("rest_total_hits_as_int"); set => Q("rest_total_hits_as_int", value); } + + [JsonIgnore] + public Elastic.Clients.Elasticsearch.Routing? Routing { get => Q("routing"); set => Q("routing", value); } + + [JsonIgnore] + public Elastic.Clients.Elasticsearch.SearchType? SearchType { get => Q("search_type"); set => Q("search_type", value); } + + [JsonIgnore] + public bool? TypedKeys { get => Q("typed_keys"); set => Q("typed_keys", value); } + } + + public partial class MultiSearchRequest : PlainRequestBase + { + public MultiSearchRequest() + { + } + + public MultiSearchRequest(Elastic.Clients.Elasticsearch.Indices? indices) : base(r => r.Optional("index", indices)) + { + } + + internal override ApiUrls ApiUrls => ApiUrlsLookups.NoNamespaceMsearch; + protected override HttpMethod HttpMethod => HttpMethod.POST; + protected override bool SupportsBody => false; + [JsonIgnore] + public bool? AllowNoIndices { get => Q("allow_no_indices"); set => Q("allow_no_indices", value); } + + [JsonIgnore] + public bool? CcsMinimizeRoundtrips { get => Q("ccs_minimize_roundtrips"); set => Q("ccs_minimize_roundtrips", value); } + + [JsonIgnore] + public Elastic.Clients.Elasticsearch.ExpandWildcards? ExpandWildcards { get => Q("expand_wildcards"); set => Q("expand_wildcards", value); } + + [JsonIgnore] + public bool? IgnoreThrottled { get => Q("ignore_throttled"); set => Q("ignore_throttled", value); } + + [JsonIgnore] + public bool? IgnoreUnavailable { get => Q("ignore_unavailable"); set => Q("ignore_unavailable", value); } + + [JsonIgnore] + public long? MaxConcurrentSearches { get => Q("max_concurrent_searches"); set => Q("max_concurrent_searches", value); } + + [JsonIgnore] + public long? MaxConcurrentShardRequests { get => Q("max_concurrent_shard_requests"); set => Q("max_concurrent_shard_requests", value); } + + [JsonIgnore] + public long? PreFilterShardSize { get => Q("pre_filter_shard_size"); set => Q("pre_filter_shard_size", value); } + + [JsonIgnore] + public bool? RestTotalHitsAsInt { get => Q("rest_total_hits_as_int"); set => Q("rest_total_hits_as_int", value); } + + [JsonIgnore] + public Elastic.Clients.Elasticsearch.Routing? Routing { get => Q("routing"); set => Q("routing", value); } + + [JsonIgnore] + public Elastic.Clients.Elasticsearch.SearchType? SearchType { get => Q("search_type"); set => Q("search_type", value); } + + [JsonIgnore] + public bool? TypedKeys { get => Q("typed_keys"); set => Q("typed_keys", value); } + } + + public sealed partial class MultiSearchRequestDescriptor : RequestDescriptorBase, MultiSearchRequestParameters> + { + internal MultiSearchRequestDescriptor(Action> configure) => configure.Invoke(this); + public MultiSearchRequestDescriptor() + { + } + + internal override ApiUrls ApiUrls => ApiUrlsLookups.NoNamespaceMsearch; + protected override HttpMethod HttpMethod => HttpMethod.POST; + protected override bool SupportsBody => false; + public MultiSearchRequestDescriptor AllowNoIndices(bool? allowNoIndices = true) => Qs("allow_no_indices", allowNoIndices); + public MultiSearchRequestDescriptor CcsMinimizeRoundtrips(bool? ccsMinimizeRoundtrips = true) => Qs("ccs_minimize_roundtrips", ccsMinimizeRoundtrips); + public MultiSearchRequestDescriptor ExpandWildcards(Elastic.Clients.Elasticsearch.ExpandWildcards? expandWildcards) => Qs("expand_wildcards", expandWildcards); + public MultiSearchRequestDescriptor IgnoreThrottled(bool? ignoreThrottled = true) => Qs("ignore_throttled", ignoreThrottled); + public MultiSearchRequestDescriptor IgnoreUnavailable(bool? ignoreUnavailable = true) => Qs("ignore_unavailable", ignoreUnavailable); + public MultiSearchRequestDescriptor MaxConcurrentSearches(long? maxConcurrentSearches) => Qs("max_concurrent_searches", maxConcurrentSearches); + public MultiSearchRequestDescriptor MaxConcurrentShardRequests(long? maxConcurrentShardRequests) => Qs("max_concurrent_shard_requests", maxConcurrentShardRequests); + public MultiSearchRequestDescriptor PreFilterShardSize(long? preFilterShardSize) => Qs("pre_filter_shard_size", preFilterShardSize); + public MultiSearchRequestDescriptor RestTotalHitsAsInt(bool? restTotalHitsAsInt = true) => Qs("rest_total_hits_as_int", restTotalHitsAsInt); + public MultiSearchRequestDescriptor Routing(Elastic.Clients.Elasticsearch.Routing? routing) => Qs("routing", routing); + public MultiSearchRequestDescriptor SearchType(Elastic.Clients.Elasticsearch.SearchType? searchType) => Qs("search_type", searchType); + public MultiSearchRequestDescriptor TypedKeys(bool? typedKeys = true) => Qs("typed_keys", typedKeys); + public MultiSearchRequestDescriptor Indices(Elastic.Clients.Elasticsearch.Indices? indices) + { + RouteValues.Optional("index", indices); + return Self; + } + + protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings) + { + } + } + + public sealed partial class MultiSearchRequestDescriptor : RequestDescriptorBase + { + internal MultiSearchRequestDescriptor(Action configure) => configure.Invoke(this); + public MultiSearchRequestDescriptor() + { + } + + internal override ApiUrls ApiUrls => ApiUrlsLookups.NoNamespaceMsearch; + protected override HttpMethod HttpMethod => HttpMethod.POST; + protected override bool SupportsBody => false; + public MultiSearchRequestDescriptor AllowNoIndices(bool? allowNoIndices = true) => Qs("allow_no_indices", allowNoIndices); + public MultiSearchRequestDescriptor CcsMinimizeRoundtrips(bool? ccsMinimizeRoundtrips = true) => Qs("ccs_minimize_roundtrips", ccsMinimizeRoundtrips); + public MultiSearchRequestDescriptor ExpandWildcards(Elastic.Clients.Elasticsearch.ExpandWildcards? expandWildcards) => Qs("expand_wildcards", expandWildcards); + public MultiSearchRequestDescriptor IgnoreThrottled(bool? ignoreThrottled = true) => Qs("ignore_throttled", ignoreThrottled); + public MultiSearchRequestDescriptor IgnoreUnavailable(bool? ignoreUnavailable = true) => Qs("ignore_unavailable", ignoreUnavailable); + public MultiSearchRequestDescriptor MaxConcurrentSearches(long? maxConcurrentSearches) => Qs("max_concurrent_searches", maxConcurrentSearches); + public MultiSearchRequestDescriptor MaxConcurrentShardRequests(long? maxConcurrentShardRequests) => Qs("max_concurrent_shard_requests", maxConcurrentShardRequests); + public MultiSearchRequestDescriptor PreFilterShardSize(long? preFilterShardSize) => Qs("pre_filter_shard_size", preFilterShardSize); + public MultiSearchRequestDescriptor RestTotalHitsAsInt(bool? restTotalHitsAsInt = true) => Qs("rest_total_hits_as_int", restTotalHitsAsInt); + public MultiSearchRequestDescriptor Routing(Elastic.Clients.Elasticsearch.Routing? routing) => Qs("routing", routing); + public MultiSearchRequestDescriptor SearchType(Elastic.Clients.Elasticsearch.SearchType? searchType) => Qs("search_type", searchType); + public MultiSearchRequestDescriptor TypedKeys(bool? typedKeys = true) => Qs("typed_keys", typedKeys); + public MultiSearchRequestDescriptor Indices(Elastic.Clients.Elasticsearch.Indices? indices) + { + RouteValues.Optional("index", indices); + return Self; + } + + protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings) + { + } + } +} \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchResponse.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchResponse.g.cs new file mode 100644 index 00000000000..5483dd4ad8d --- /dev/null +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchResponse.g.cs @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. +// +// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ +// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ +// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ +// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ +// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ +// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ +// ------------------------------------------------ +// +// This file is automatically generated. +// Please do not edit these files manually. +// +// ------------------------------------------------ + +using Elastic.Transport.Products.Elasticsearch; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +#nullable restore +namespace Elastic.Clients.Elasticsearch +{ + public sealed partial class MultiSearchResponse : ElasticsearchResponseBase + { + [JsonInclude] + [JsonPropertyName("responses")] + public IReadOnlyCollection> Responses { get; init; } + + [JsonInclude] + [JsonPropertyName("took")] + public long Took { get; init; } + } +} \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Client/ElasticsearchClient.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Client/ElasticsearchClient.g.cs index 371ae9da4e3..09b260ea21e 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Client/ElasticsearchClient.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Client/ElasticsearchClient.g.cs @@ -1180,6 +1180,48 @@ public Task> MultiGetAsync(Action, MultiGetResponse>(descriptor); } + public MultiSearchResponse MultiSearch(MultiSearchRequest request) + { + request.BeforeRequest(); + return DoRequest>(request); + } + + public Task> MultiSearchAsync(MultiSearchRequest request, CancellationToken cancellationToken = default) + { + request.BeforeRequest(); + return DoRequestAsync>(request, cancellationToken); + } + + public MultiSearchResponse MultiSearch() + { + var descriptor = new MultiSearchRequestDescriptor(); + descriptor.BeforeRequest(); + return DoRequest, MultiSearchResponse>(descriptor); + } + + public MultiSearchResponse MultiSearch(Action> configureRequest) + { + var descriptor = new MultiSearchRequestDescriptor(); + configureRequest?.Invoke(descriptor); + descriptor.BeforeRequest(); + return DoRequest, MultiSearchResponse>(descriptor); + } + + public Task> MultiSearchAsync(CancellationToken cancellationToken = default) + { + var descriptor = new MultiSearchRequestDescriptor(); + descriptor.BeforeRequest(); + return DoRequestAsync, MultiSearchResponse>(descriptor); + } + + public Task> MultiSearchAsync(Action> configureRequest, CancellationToken cancellationToken = default) + { + var descriptor = new MultiSearchRequestDescriptor(); + configureRequest?.Invoke(descriptor); + descriptor.BeforeRequest(); + return DoRequestAsync, MultiSearchResponse>(descriptor); + } + public OpenPointInTimeResponse OpenPointInTime(OpenPointInTimeRequest request) { request.BeforeRequest(); diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/ErrorResponseBase.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/ErrorResponseBase.g.cs new file mode 100644 index 00000000000..8f16f037c59 --- /dev/null +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/ErrorResponseBase.g.cs @@ -0,0 +1,38 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. +// +// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ +// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ +// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ +// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ +// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ +// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ +// ------------------------------------------------ +// +// This file is automatically generated. +// Please do not edit these files manually. +// +// ------------------------------------------------ + +using Elastic.Transport.Products.Elasticsearch; +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Text.Json; +using System.Text.Json.Serialization; + +#nullable restore +namespace Elastic.Clients.Elasticsearch +{ + public abstract partial class ErrorResponseBase : ElasticsearchResponseBase + { + [JsonInclude] + [JsonPropertyName("error")] + public Elastic.Clients.Elasticsearch.ErrorCause Error { get; init; } + + [JsonInclude] + [JsonPropertyName("status")] + public int Status { get; init; } + } +} \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs index 72faf353cdd..79a7ea670eb 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs @@ -29,5 +29,17 @@ public partial class MigrationFeature [JsonInclude] [JsonPropertyName("feature_name")] public string FeatureName { get; init; } + + [JsonInclude] + [JsonPropertyName("indices")] + public IReadOnlyCollection Indices { get; init; } + + [JsonInclude] + [JsonPropertyName("migration_status")] + public Elastic.Clients.Elasticsearch.Migration.MigrationStatus MigrationStatus { get; init; } + + [JsonInclude] + [JsonPropertyName("minimum_index_version")] + public string MinimumIndexVersion { get; init; } } } \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultiSearchItem.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultiSearchItem.g.cs new file mode 100644 index 00000000000..38d29b54f45 --- /dev/null +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultiSearchItem.g.cs @@ -0,0 +1,33 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. +// +// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ +// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ +// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ +// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ +// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ +// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ +// ------------------------------------------------ +// +// This file is automatically generated. +// Please do not edit these files manually. +// +// ------------------------------------------------ + +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Text.Json; +using System.Text.Json.Serialization; + +#nullable restore +namespace Elastic.Clients.Elasticsearch +{ + public partial class MultiSearchItem : ResponseBody + { + [JsonInclude] + [JsonPropertyName("status")] + public int? Status { get; init; } + } +} \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/ResponseBody.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/ResponseBody.g.cs new file mode 100644 index 00000000000..5a744b9884b --- /dev/null +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/ResponseBody.g.cs @@ -0,0 +1,81 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. +// +// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ +// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ +// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ +// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ +// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ +// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ +// ------------------------------------------------ +// +// This file is automatically generated. +// Please do not edit these files manually. +// +// ------------------------------------------------ + +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Text.Json; +using System.Text.Json.Serialization; + +#nullable restore +namespace Elastic.Clients.Elasticsearch +{ + public partial class ResponseBody + { + [JsonInclude] + [JsonPropertyName("_clusters")] + public Elastic.Clients.Elasticsearch.ClusterStatistics? Clusters { get; init; } + + [JsonInclude] + [JsonPropertyName("_scroll_id")] + public string? ScrollId { get; init; } + + [JsonInclude] + [JsonPropertyName("_shards")] + public Elastic.Clients.Elasticsearch.ShardStatistics Shards { get; init; } + + [JsonInclude] + [JsonPropertyName("aggregations")] + public Elastic.Clients.Elasticsearch.Aggregations.AggregateDictionary? Aggregations { get; init; } + + [JsonInclude] + [JsonPropertyName("fields")] + public Dictionary? Fields { get; init; } + + [JsonInclude] + [JsonPropertyName("hits")] + public Elastic.Clients.Elasticsearch.HitsMetadata HitsMetadata { get; init; } + + [JsonInclude] + [JsonPropertyName("max_score")] + public double? MaxScore { get; init; } + + [JsonInclude] + [JsonPropertyName("num_reduce_phases")] + public long? NumReducePhases { get; init; } + + [JsonInclude] + [JsonPropertyName("pit_id")] + public string? PitId { get; init; } + + [JsonInclude] + [JsonPropertyName("profile")] + public Elastic.Clients.Elasticsearch.Profile? Profile { get; init; } + + [JsonInclude] + [JsonPropertyName("terminated_early")] + public bool? TerminatedEarly { get; init; } + + [JsonInclude] + [JsonPropertyName("timed_out")] + public bool TimedOut { get; init; } + + [JsonInclude] + [JsonPropertyName("took")] + public long Took { get; init; } + } +} \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchResponseItem.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchResponseItem.g.cs new file mode 100644 index 00000000000..59e6b88ed2b --- /dev/null +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchResponseItem.g.cs @@ -0,0 +1,38 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. +// +// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ +// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ +// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ +// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ +// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ +// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ +// ------------------------------------------------ +// +// This file is automatically generated. +// Please do not edit these files manually. +// +// ------------------------------------------------ + +using Elastic.Transport; +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Text.Json; +using System.Text.Json.Serialization; + +#nullable restore +namespace Elastic.Clients.Elasticsearch +{ + public partial class SearchResponseItem : Union?, Elastic.Clients.Elasticsearch.ErrorResponseBase?> + { + public SearchResponseItem(Elastic.Clients.Elasticsearch.MultiSearchItem? item) : base(item) + { + } + + public SearchResponseItem(Elastic.Clients.Elasticsearch.ErrorResponseBase? item) : base(item) + { + } + } +} \ No newline at end of file From 2a168a3cf413a7ece8b0278dad60df93556f79cf Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Wed, 8 Jun 2022 11:44:05 +0100 Subject: [PATCH 2/8] Add stub of test class --- .../MultiSearch/MultiSearchApiTests.cs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs diff --git a/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs b/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs new file mode 100644 index 00000000000..41b1e5787a9 --- /dev/null +++ b/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs @@ -0,0 +1,51 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Tests.Core.ManagedElasticsearch.Clusters; +using Tests.Domain; +using Tests.Framework.EndpointTests; +using Tests.Framework.EndpointTests.TestState; + +namespace Tests.Document.Multiple.MultiGet; + +public class MultiSearchApiTests + : ApiIntegrationTestBase, MultiSearchRequestDescriptor, MultiSearchRequest> +{ + private readonly IEnumerable _ids = Developer.Developers.Select(d => d.Id).Take(10); + + public MultiSearchApiTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cluster, usage) { } + + protected override bool ExpectIsValid => true; + + protected override bool VerifyJson => true; + + protected override int ExpectStatusCode => 200; + + protected override Action> Fluent => d => { }; // TODO + + protected override HttpMethod HttpMethod => HttpMethod.POST; + + protected override MultiSearchRequest Initializer => new(Infer.Index()) // TODO + { + }; + + protected override bool SupportsDeserialization => false; + + protected override string ExpectedUrlPathAndQuery => "/devs/_mget"; + + protected override LazyResponses ClientUsage() => Calls( + (client, f) => client.MultiSearch(f), + (client, f) => client.MultiSearchAsync(f), + (client, r) => client.MultiSearch(r), + (client, r) => client.MultiSearchAsync(r) + ); + + protected override void ExpectResponse(MultiSearchResponse response) + { + // TODO + } +} From b64fa9abe5d6aeeb2dc0c4313006901d705b32f4 Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Wed, 8 Jun 2022 15:17:57 +0100 Subject: [PATCH 3/8] Add POC --- .../MultiSearch/MultiSearchRequest.cs | 85 ++++++++++ .../Types/Migration/MigrationFeature.g.cs | 12 -- .../_Generated/Types/MultisearchBody.g.cs | 145 ++++++++++++++++++ .../_Generated/Types/MultisearchHeader.g.cs | 73 +++++++++ .../Documents/MSearchSerialization.cs | 60 ++++++++ ...rialization.SerializesRequest.verified.txt | 4 + 6 files changed, 367 insertions(+), 12 deletions(-) create mode 100644 src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs create mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchBody.g.cs create mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchHeader.g.cs create mode 100644 tests/Tests/Serialization/Documents/MSearchSerialization.cs create mode 100644 tests/Tests/_VerifySnapshots/MSearchSerialization.SerializesRequest.verified.txt diff --git a/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs b/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs new file mode 100644 index 00000000000..9d865683ea4 --- /dev/null +++ b/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs @@ -0,0 +1,85 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.IO; +using System.Text.Json; +using System.Threading.Tasks; +using Elastic.Transport; + +namespace Elastic.Clients.Elasticsearch +{ + // STUBBED POC + + public partial class MultiSearchRequest : IStreamSerializable + { + public List Searches { get; set; } + + void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (Searches is null) + return; + + foreach (var search in Searches) + { + if (search is IStreamSerializable serializable) + serializable.Serialize(stream, settings, formatting); + } + } + + async Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (Searches is null) + return; + + foreach (var search in Searches) + { + if (search is IStreamSerializable serializable) + await serializable.SerializeAsync(stream, settings, formatting).ConfigureAwait(false); + } + } + } + + public class RequestItem : IStreamSerializable + { + public RequestItem(MultisearchBody body) => Body = body; + + public RequestItem(MultisearchHeader header, MultisearchBody body) + { + Header = header; + Body = body; + } + + public MultisearchHeader Header { get; init; } + public MultisearchBody Body { get; init; } + + void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (Body is null) + return; + + if (settings.RequestResponseSerializer.TryGetJsonSerializerOptions(out var options)) + { + JsonSerializer.Serialize(stream, Header, options); + stream.WriteByte((byte)'\n'); + JsonSerializer.Serialize(stream, Body, options); + stream.WriteByte((byte)'\n'); + } + } + + async Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (Body is null) + return; + + if (settings.RequestResponseSerializer.TryGetJsonSerializerOptions(out var options)) + { + await JsonSerializer.SerializeAsync(stream, Header, options).ConfigureAwait(false); + stream.WriteByte((byte)'\n'); + await JsonSerializer.SerializeAsync(stream, Body, options).ConfigureAwait(false); + stream.WriteByte((byte)'\n'); + } + } + } +} diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs index 79a7ea670eb..72faf353cdd 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs @@ -29,17 +29,5 @@ public partial class MigrationFeature [JsonInclude] [JsonPropertyName("feature_name")] public string FeatureName { get; init; } - - [JsonInclude] - [JsonPropertyName("indices")] - public IReadOnlyCollection Indices { get; init; } - - [JsonInclude] - [JsonPropertyName("migration_status")] - public Elastic.Clients.Elasticsearch.Migration.MigrationStatus MigrationStatus { get; init; } - - [JsonInclude] - [JsonPropertyName("minimum_index_version")] - public string MinimumIndexVersion { get; init; } } } \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchBody.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchBody.g.cs new file mode 100644 index 00000000000..d91642093c8 --- /dev/null +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchBody.g.cs @@ -0,0 +1,145 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. +// +// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ +// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ +// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ +// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ +// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ +// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ +// ------------------------------------------------ +// +// This file is automatically generated. +// Please do not edit these files manually. +// +// ------------------------------------------------ + +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Text.Json; +using System.Text.Json.Serialization; + +#nullable restore +namespace Elastic.Clients.Elasticsearch +{ + public partial class MultisearchBody + { + [JsonInclude] + [JsonPropertyName("_source")] + public Elastic.Clients.Elasticsearch.SourceConfig? Source { get; init; } + + [JsonInclude] + [JsonPropertyName("aggregations")] + public Dictionary? Aggregations { get; init; } + + [JsonInclude] + [JsonPropertyName("collapse")] + public Elastic.Clients.Elasticsearch.FieldCollapse? Collapse { get; init; } + + [JsonInclude] + [JsonPropertyName("docvalue_fields")] + public IReadOnlyCollection? DocvalueFields { get; init; } + + [JsonInclude] + [JsonPropertyName("explain")] + public bool? Explain { get; init; } + + [JsonInclude] + [JsonPropertyName("fields")] + public IReadOnlyCollection? Fields { get; init; } + + [JsonInclude] + [JsonPropertyName("from")] + public int? From { get; init; } + + [JsonInclude] + [JsonPropertyName("highlight")] + public Elastic.Clients.Elasticsearch.Highlight? Highlight { get; init; } + + [JsonInclude] + [JsonPropertyName("indices_boost")] + public IReadOnlyCollection>? IndicesBoost { get; init; } + + [JsonInclude] + [JsonPropertyName("min_score")] + public double? MinScore { get; init; } + + [JsonInclude] + [JsonPropertyName("pit")] + public Elastic.Clients.Elasticsearch.PointInTimeReference? Pit { get; init; } + + [JsonInclude] + [JsonPropertyName("post_filter")] + public Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? PostFilter { get; init; } + + [JsonInclude] + [JsonPropertyName("profile")] + public bool? Profile { get; init; } + + [JsonInclude] + [JsonPropertyName("query")] + public Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? Query { get; init; } + + [JsonInclude] + [JsonPropertyName("rescore")] + public IReadOnlyCollection? Rescore { get; init; } + + [JsonInclude] + [JsonPropertyName("runtime_mappings")] + public Dictionary>? RuntimeMappings { get; init; } + + [JsonInclude] + [JsonPropertyName("script_fields")] + public Dictionary? ScriptFields { get; init; } + + [JsonInclude] + [JsonPropertyName("search_after")] + public IReadOnlyCollection? SearchAfter { get; init; } + + [JsonInclude] + [JsonPropertyName("seq_no_primary_term")] + public bool? SeqNoPrimaryTerm { get; init; } + + [JsonInclude] + [JsonPropertyName("size")] + public int? Size { get; init; } + + [JsonInclude] + [JsonPropertyName("sort")] + public SortCollection? Sort { get; init; } + + [JsonInclude] + [JsonPropertyName("stats")] + public IReadOnlyCollection? Stats { get; init; } + + [JsonInclude] + [JsonPropertyName("stored_fields")] + public Elastic.Clients.Elasticsearch.Fields? StoredFields { get; init; } + + [JsonInclude] + [JsonPropertyName("suggest")] + public Elastic.Clients.Elasticsearch.Suggester? Suggest { get; init; } + + [JsonInclude] + [JsonPropertyName("terminate_after")] + public long? TerminateAfter { get; init; } + + [JsonInclude] + [JsonPropertyName("timeout")] + public string? Timeout { get; init; } + + [JsonInclude] + [JsonPropertyName("track_scores")] + public bool? TrackScores { get; init; } + + [JsonInclude] + [JsonPropertyName("track_total_hits")] + public Elastic.Clients.Elasticsearch.TrackHits? TrackTotalHits { get; init; } + + [JsonInclude] + [JsonPropertyName("version")] + public bool? Version { get; init; } + } +} \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchHeader.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchHeader.g.cs new file mode 100644 index 00000000000..56ea5b66555 --- /dev/null +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchHeader.g.cs @@ -0,0 +1,73 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. +// +// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ +// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ +// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ +// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ +// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ +// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ +// ------------------------------------------------ +// +// This file is automatically generated. +// Please do not edit these files manually. +// +// ------------------------------------------------ + +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Text.Json; +using System.Text.Json.Serialization; + +#nullable restore +namespace Elastic.Clients.Elasticsearch +{ + public partial class MultisearchHeader + { + [JsonInclude] + [JsonPropertyName("allow_no_indices")] + public bool? AllowNoIndices { get; init; } + + [JsonInclude] + [JsonPropertyName("allow_partial_search_results")] + public bool? AllowPartialSearchResults { get; init; } + + [JsonInclude] + [JsonPropertyName("ccs_minimize_roundtrips")] + public bool? CcsMinimizeRoundtrips { get; init; } + + [JsonInclude] + [JsonPropertyName("expand_wildcards")] + public Elastic.Clients.Elasticsearch.ExpandWildcards? ExpandWildcards { get; init; } + + [JsonInclude] + [JsonPropertyName("ignore_throttled")] + public bool? IgnoreThrottled { get; init; } + + [JsonInclude] + [JsonPropertyName("ignore_unavailable")] + public bool? IgnoreUnavailable { get; init; } + + [JsonInclude] + [JsonPropertyName("index")] + public Elastic.Clients.Elasticsearch.Indices? Index { get; init; } + + [JsonInclude] + [JsonPropertyName("preference")] + public string? Preference { get; init; } + + [JsonInclude] + [JsonPropertyName("request_cache")] + public bool? RequestCache { get; init; } + + [JsonInclude] + [JsonPropertyName("routing")] + public string? Routing { get; init; } + + [JsonInclude] + [JsonPropertyName("search_type")] + public Elastic.Clients.Elasticsearch.SearchType? SearchType { get; init; } + } +} \ No newline at end of file diff --git a/tests/Tests/Serialization/Documents/MSearchSerialization.cs b/tests/Tests/Serialization/Documents/MSearchSerialization.cs new file mode 100644 index 00000000000..aed10cd0357 --- /dev/null +++ b/tests/Tests/Serialization/Documents/MSearchSerialization.cs @@ -0,0 +1,60 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using Tests.Domain; +using VerifyTests; +using VerifyXunit; +using Elastic.Clients.Elasticsearch.QueryDsl; + +namespace Tests.Serialization.Documents; + +[UsesVerify] +public class MSearchSerialization +{ + private readonly VerifySettings _verifySettings; + + public MSearchSerialization() + { + _verifySettings = new VerifySettings(); + _verifySettings.DisableRequireUniquePrefix(); + } + + [U] + public async Task SerializesRequest() + { + var settings = new ElasticsearchClientSettings(); + settings.DefaultMappingFor(m => m.IndexName("projects")); + + var ms = new MemoryStream(); + + var request = (IStreamSerializable)new MultiSearchRequest + { + Searches = new List + { + new RequestItem(new MultisearchHeader { Index = Infer.Index() }, new MultisearchBody { From = 0, Query = new MatchAllQuery() }), + new RequestItem(new MultisearchHeader { Index = Infer.Index() }, new MultisearchBody { From = 0, Query = new MatchAllQuery() }) + } + }; + + await request.SerializeAsync(ms, settings); + + ms.Position = 0; + var reader = new StreamReader(ms); + var ndjson = reader.ReadToEnd(); + + await Verifier.Verify(ndjson, _verifySettings); + + ms = new MemoryStream(); + request.Serialize(ms, settings); + + ms.Position = 0; + reader = new StreamReader(ms); + ndjson = reader.ReadToEnd(); + + await Verifier.Verify(ndjson, _verifySettings); + } +} diff --git a/tests/Tests/_VerifySnapshots/MSearchSerialization.SerializesRequest.verified.txt b/tests/Tests/_VerifySnapshots/MSearchSerialization.SerializesRequest.verified.txt new file mode 100644 index 00000000000..ab546efce49 --- /dev/null +++ b/tests/Tests/_VerifySnapshots/MSearchSerialization.SerializesRequest.verified.txt @@ -0,0 +1,4 @@ +{"index":"projects"} +{"from":0,"query":{"match_all":{}}} +{"index":"projects"} +{"from":0,"query":{"match_all":{}}} From abc8afc954cc7ea66341f8cea930ee1b9e28fbc4 Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Wed, 8 Jun 2022 16:14:55 +0100 Subject: [PATCH 4/8] Completed POC ready for code gen --- .../MultiSearch/MultiSearchRequest.cs | 63 +++++++++++++++++++ .../_Generated/Api/MultiSearchRequest.g.cs | 6 +- tests/Tests.Configuration/tests.default.yaml | 4 +- .../MultiSearch/MultiSearchApiTests.cs | 35 ++++++++--- 4 files changed, 96 insertions(+), 12 deletions(-) diff --git a/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs b/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs index 9d865683ea4..a2cd52527eb 100644 --- a/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs +++ b/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs @@ -4,7 +4,9 @@ using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading.Tasks; using Elastic.Transport; @@ -12,6 +14,45 @@ namespace Elastic.Clients.Elasticsearch { // STUBBED POC + public sealed partial class MultiSearchRequestDescriptor : IStreamSerializable + { + // Temporary implementation - TODO - Code gen properly + + private List _searches = new List(); + + void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (_searches is null) + return; + + foreach (var search in _searches) + { + if (search is IStreamSerializable serializable) + serializable.Serialize(stream, settings, formatting); + } + } + + async Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (_searches is null) + return; + + foreach (var search in _searches) + { + if (search is IStreamSerializable serializable) + await serializable.SerializeAsync(stream, settings, formatting).ConfigureAwait(false); + } + } + + public MultiSearchRequestDescriptor AddSearch(RequestItem item) + { + _searches.Add(item); + return this; + } + + internal override void BeforeRequest() => TypedKeys(true); + } + public partial class MultiSearchRequest : IStreamSerializable { public List Searches { get; set; } @@ -39,6 +80,8 @@ async Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClien await serializable.SerializeAsync(stream, settings, formatting).ConfigureAwait(false); } } + + internal override void BeforeRequest() => TypedKeys = true; } public class RequestItem : IStreamSerializable @@ -82,4 +125,24 @@ async Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClien } } } + + public partial class ResponseBody + { + [JsonIgnore] + public IReadOnlyCollection> Hits => HitsMetadata.Hits; + + [JsonIgnore] + public IReadOnlyCollection Documents => HitsMetadata.Hits.Select(s => s.Source).ToReadOnlyCollection(); + + [JsonIgnore] + public long Total => HitsMetadata?.Total?.Value ?? -1; + } + + public partial class MultiSearchResponse + { + public override bool IsValid => base.IsValid && Responses.All(b => b.Item1 is not null && b.Item1.Status == 200); + + [JsonIgnore] + public int TotalResponses => Responses.HasAny() ? Responses.Count() : 0; + } } diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs index d4d4ec9e351..5a01d08682c 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs @@ -76,7 +76,7 @@ public MultiSearchRequest(Elastic.Clients.Elasticsearch.Indices? indices) : base internal override ApiUrls ApiUrls => ApiUrlsLookups.NoNamespaceMsearch; protected override HttpMethod HttpMethod => HttpMethod.POST; - protected override bool SupportsBody => false; + protected override bool SupportsBody => true; [JsonIgnore] public bool? AllowNoIndices { get => Q("allow_no_indices"); set => Q("allow_no_indices", value); } @@ -123,7 +123,7 @@ public MultiSearchRequestDescriptor() internal override ApiUrls ApiUrls => ApiUrlsLookups.NoNamespaceMsearch; protected override HttpMethod HttpMethod => HttpMethod.POST; - protected override bool SupportsBody => false; + protected override bool SupportsBody => true; public MultiSearchRequestDescriptor AllowNoIndices(bool? allowNoIndices = true) => Qs("allow_no_indices", allowNoIndices); public MultiSearchRequestDescriptor CcsMinimizeRoundtrips(bool? ccsMinimizeRoundtrips = true) => Qs("ccs_minimize_roundtrips", ccsMinimizeRoundtrips); public MultiSearchRequestDescriptor ExpandWildcards(Elastic.Clients.Elasticsearch.ExpandWildcards? expandWildcards) => Qs("expand_wildcards", expandWildcards); @@ -179,4 +179,4 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o { } } -} \ No newline at end of file +} diff --git a/tests/Tests.Configuration/tests.default.yaml b/tests/Tests.Configuration/tests.default.yaml index 1fd8ea95a0a..0b8b217a073 100644 --- a/tests/Tests.Configuration/tests.default.yaml +++ b/tests/Tests.Configuration/tests.default.yaml @@ -5,10 +5,10 @@ # tracked by git). # mode either u (unit test), i (integration test) or m (mixed mode) -mode: u +mode: i # the elasticsearch version that should be started # Can be a snapshot version of sonatype or "latest" to get the latest snapshot of sonatype -elasticsearch_version: latest +elasticsearch_version: latest-8 # cluster filter allows you to only run the integration tests of a particular cluster (cluster suffix not needed) # cluster_filter: # whether we want to forcefully reseed on the node, if you are starting the tests with a node already running diff --git a/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs b/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs index 41b1e5787a9..403c1bb79c4 100644 --- a/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs +++ b/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs @@ -1,10 +1,11 @@ -// Licensed to Elasticsearch B.V under one or more agreements. +// Licensed to Elasticsearch B.V under one or more agreements. // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information. using System; using System.Collections.Generic; using System.Linq; +using Elastic.Clients.Elasticsearch.QueryDsl; using Tests.Core.ManagedElasticsearch.Clusters; using Tests.Domain; using Tests.Framework.EndpointTests; @@ -15,8 +16,6 @@ namespace Tests.Document.Multiple.MultiGet; public class MultiSearchApiTests : ApiIntegrationTestBase, MultiSearchRequestDescriptor, MultiSearchRequest> { - private readonly IEnumerable _ids = Developer.Developers.Select(d => d.Id).Take(10); - public MultiSearchApiTests(ReadOnlyCluster cluster, EndpointUsage usage) : base(cluster, usage) { } protected override bool ExpectIsValid => true; @@ -25,17 +24,26 @@ public MultiSearchApiTests(ReadOnlyCluster cluster, EndpointUsage usage) : base( protected override int ExpectStatusCode => 200; - protected override Action> Fluent => d => { }; // TODO + // TODO - Fluent API improvements after POC code-gen + protected override Action> Fluent => d => d + .Indices(Infer.Index()) // TODO - Should support fluent verion and ctor with Indices + .AddSearch(new RequestItem(new MultisearchBody { From = 0, Size = 10, Query = new MatchAllQuery() })) + .AddSearch(new RequestItem(new MultisearchBody { From = 0, Size = 1, Query = new MatchAllQuery() })); protected override HttpMethod HttpMethod => HttpMethod.POST; - protected override MultiSearchRequest Initializer => new(Infer.Index()) // TODO + protected override MultiSearchRequest Initializer => new(Infer.Index()) { + Searches = new List + { + new RequestItem(new MultisearchBody { From = 0, Size = 10, Query = new MatchAllQuery() }), + new RequestItem(new MultisearchBody { From = 0, Size = 1, Query = new MatchAllQuery() }) + } }; protected override bool SupportsDeserialization => false; - protected override string ExpectedUrlPathAndQuery => "/devs/_mget"; + protected override string ExpectedUrlPathAndQuery => "/projects/_mget"; protected override LazyResponses ClientUsage() => Calls( (client, f) => client.MultiSearch(f), @@ -46,6 +54,19 @@ protected override LazyResponses ClientUsage() => Calls( protected override void ExpectResponse(MultiSearchResponse response) { - // TODO + response.Took.Should().BeGreaterThan(0); + response.Responses.Count.Should().Be(2); + + var firstResults = response.Responses.First().Item1; + firstResults.Should().NotBeNull(); + firstResults.Total.Should().Be(100); + firstResults.Documents.Should().HaveCount(10); + + var lastResults = response.Responses.Last().Item1; + lastResults.Should().NotBeNull(); + lastResults.Total.Should().Be(100); + lastResults.Documents.Should().HaveCount(1); + + // TODO - More assertions } } From 2531625bd66c51a28d5ffcb3dcfb3e09dd51a2b5 Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Thu, 9 Jun 2022 11:57:24 +0100 Subject: [PATCH 5/8] Further code-gen for array bodied requests --- .../MultiSearch/MultiSearchRequest.cs | 3 +- .../_Generated/Api/MultiSearchRequest.g.cs | 4 +- .../Types/Migration/MigrationFeature.g.cs | 12 + .../_Generated/Types/MultisearchBody.g.cs | 1706 ++++++++++++++++- .../_Generated/Types/MultisearchHeader.g.cs | 190 +- .../_Generated/Types/SearchRequestItem.g.cs | 38 + 6 files changed, 1910 insertions(+), 43 deletions(-) create mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchRequestItem.g.cs diff --git a/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs b/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs index a2cd52527eb..574726a1a36 100644 --- a/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs +++ b/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs @@ -18,7 +18,7 @@ public sealed partial class MultiSearchRequestDescriptor : IStreamSer { // Temporary implementation - TODO - Code gen properly - private List _searches = new List(); + private readonly List _searches = new(); void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) { @@ -84,6 +84,7 @@ async Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClien internal override void BeforeRequest() => TypedKeys = true; } + // Will generate as SearchRequestItem public class RequestItem : IStreamSerializable { public RequestItem(MultisearchBody body) => Body = body; diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs index 5a01d08682c..92cec3aa5fd 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs @@ -156,7 +156,7 @@ public MultiSearchRequestDescriptor() internal override ApiUrls ApiUrls => ApiUrlsLookups.NoNamespaceMsearch; protected override HttpMethod HttpMethod => HttpMethod.POST; - protected override bool SupportsBody => false; + protected override bool SupportsBody => true; public MultiSearchRequestDescriptor AllowNoIndices(bool? allowNoIndices = true) => Qs("allow_no_indices", allowNoIndices); public MultiSearchRequestDescriptor CcsMinimizeRoundtrips(bool? ccsMinimizeRoundtrips = true) => Qs("ccs_minimize_roundtrips", ccsMinimizeRoundtrips); public MultiSearchRequestDescriptor ExpandWildcards(Elastic.Clients.Elasticsearch.ExpandWildcards? expandWildcards) => Qs("expand_wildcards", expandWildcards); @@ -179,4 +179,4 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o { } } -} +} \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs index 72faf353cdd..79a7ea670eb 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs @@ -29,5 +29,17 @@ public partial class MigrationFeature [JsonInclude] [JsonPropertyName("feature_name")] public string FeatureName { get; init; } + + [JsonInclude] + [JsonPropertyName("indices")] + public IReadOnlyCollection Indices { get; init; } + + [JsonInclude] + [JsonPropertyName("migration_status")] + public Elastic.Clients.Elasticsearch.Migration.MigrationStatus MigrationStatus { get; init; } + + [JsonInclude] + [JsonPropertyName("minimum_index_version")] + public string MinimumIndexVersion { get; init; } } } \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchBody.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchBody.g.cs index d91642093c8..18294393298 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchBody.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchBody.g.cs @@ -28,118 +28,1766 @@ public partial class MultisearchBody { [JsonInclude] [JsonPropertyName("_source")] - public Elastic.Clients.Elasticsearch.SourceConfig? Source { get; init; } + public Elastic.Clients.Elasticsearch.SourceConfig? Source { get; set; } [JsonInclude] [JsonPropertyName("aggregations")] - public Dictionary? Aggregations { get; init; } + public Dictionary? Aggregations { get; set; } [JsonInclude] [JsonPropertyName("collapse")] - public Elastic.Clients.Elasticsearch.FieldCollapse? Collapse { get; init; } + public Elastic.Clients.Elasticsearch.FieldCollapse? Collapse { get; set; } [JsonInclude] [JsonPropertyName("docvalue_fields")] - public IReadOnlyCollection? DocvalueFields { get; init; } + public IEnumerable? DocvalueFields { get; set; } [JsonInclude] [JsonPropertyName("explain")] - public bool? Explain { get; init; } + public bool? Explain { get; set; } [JsonInclude] [JsonPropertyName("fields")] - public IReadOnlyCollection? Fields { get; init; } + public IEnumerable? Fields { get; set; } [JsonInclude] [JsonPropertyName("from")] - public int? From { get; init; } + public int? From { get; set; } [JsonInclude] [JsonPropertyName("highlight")] - public Elastic.Clients.Elasticsearch.Highlight? Highlight { get; init; } + public Elastic.Clients.Elasticsearch.Highlight? Highlight { get; set; } [JsonInclude] [JsonPropertyName("indices_boost")] - public IReadOnlyCollection>? IndicesBoost { get; init; } + public IEnumerable>? IndicesBoost { get; set; } [JsonInclude] [JsonPropertyName("min_score")] - public double? MinScore { get; init; } + public double? MinScore { get; set; } [JsonInclude] [JsonPropertyName("pit")] - public Elastic.Clients.Elasticsearch.PointInTimeReference? Pit { get; init; } + public Elastic.Clients.Elasticsearch.PointInTimeReference? Pit { get; set; } [JsonInclude] [JsonPropertyName("post_filter")] - public Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? PostFilter { get; init; } + public Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? PostFilter { get; set; } [JsonInclude] [JsonPropertyName("profile")] - public bool? Profile { get; init; } + public bool? Profile { get; set; } [JsonInclude] [JsonPropertyName("query")] - public Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? Query { get; init; } + public Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? Query { get; set; } [JsonInclude] [JsonPropertyName("rescore")] - public IReadOnlyCollection? Rescore { get; init; } + public IEnumerable? Rescore { get; set; } [JsonInclude] [JsonPropertyName("runtime_mappings")] - public Dictionary>? RuntimeMappings { get; init; } + public Dictionary>? RuntimeMappings { get; set; } [JsonInclude] [JsonPropertyName("script_fields")] - public Dictionary? ScriptFields { get; init; } + public Dictionary? ScriptFields { get; set; } [JsonInclude] [JsonPropertyName("search_after")] - public IReadOnlyCollection? SearchAfter { get; init; } + public IEnumerable? SearchAfter { get; set; } [JsonInclude] [JsonPropertyName("seq_no_primary_term")] - public bool? SeqNoPrimaryTerm { get; init; } + public bool? SeqNoPrimaryTerm { get; set; } [JsonInclude] [JsonPropertyName("size")] - public int? Size { get; init; } + public int? Size { get; set; } [JsonInclude] [JsonPropertyName("sort")] - public SortCollection? Sort { get; init; } + public SortCollection? Sort { get; set; } [JsonInclude] [JsonPropertyName("stats")] - public IReadOnlyCollection? Stats { get; init; } + public IEnumerable? Stats { get; set; } [JsonInclude] [JsonPropertyName("stored_fields")] - public Elastic.Clients.Elasticsearch.Fields? StoredFields { get; init; } + public Elastic.Clients.Elasticsearch.Fields? StoredFields { get; set; } [JsonInclude] [JsonPropertyName("suggest")] - public Elastic.Clients.Elasticsearch.Suggester? Suggest { get; init; } + public Elastic.Clients.Elasticsearch.Suggester? Suggest { get; set; } [JsonInclude] [JsonPropertyName("terminate_after")] - public long? TerminateAfter { get; init; } + public long? TerminateAfter { get; set; } [JsonInclude] [JsonPropertyName("timeout")] - public string? Timeout { get; init; } + public string? Timeout { get; set; } [JsonInclude] [JsonPropertyName("track_scores")] - public bool? TrackScores { get; init; } + public bool? TrackScores { get; set; } [JsonInclude] [JsonPropertyName("track_total_hits")] - public Elastic.Clients.Elasticsearch.TrackHits? TrackTotalHits { get; init; } + public Elastic.Clients.Elasticsearch.TrackHits? TrackTotalHits { get; set; } [JsonInclude] [JsonPropertyName("version")] - public bool? Version { get; init; } + public bool? Version { get; set; } + } + + public sealed partial class MultisearchBodyDescriptor : SerializableDescriptorBase> + { + internal MultisearchBodyDescriptor(Action> configure) => configure.Invoke(this); + public MultisearchBodyDescriptor() : base() + { + } + + private Elastic.Clients.Elasticsearch.FieldCollapse? CollapseValue { get; set; } + + private FieldCollapseDescriptor CollapseDescriptor { get; set; } + + private Action> CollapseDescriptorAction { get; set; } + + private IEnumerable? DocvalueFieldsValue { get; set; } + + private QueryDsl.FieldAndFormatDescriptor DocvalueFieldsDescriptor { get; set; } + + private Action> DocvalueFieldsDescriptorAction { get; set; } + + private Action>[] DocvalueFieldsDescriptorActions { get; set; } + + private IEnumerable? FieldsValue { get; set; } + + private QueryDsl.FieldAndFormatDescriptor FieldsDescriptor { get; set; } + + private Action> FieldsDescriptorAction { get; set; } + + private Action>[] FieldsDescriptorActions { get; set; } + + private Elastic.Clients.Elasticsearch.Highlight? HighlightValue { get; set; } + + private HighlightDescriptor HighlightDescriptor { get; set; } + + private Action> HighlightDescriptorAction { get; set; } + + private Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? PostFilterValue { get; set; } + + private QueryDsl.QueryContainerDescriptor PostFilterDescriptor { get; set; } + + private Action> PostFilterDescriptorAction { get; set; } + + private Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? QueryValue { get; set; } + + private QueryDsl.QueryContainerDescriptor QueryDescriptor { get; set; } + + private Action> QueryDescriptorAction { get; set; } + + private IEnumerable? RescoreValue { get; set; } + + private RescoreDescriptor RescoreDescriptor { get; set; } + + private Action> RescoreDescriptorAction { get; set; } + + private Action>[] RescoreDescriptorActions { get; set; } + + private SortCollection? SortValue { get; set; } + + private SortDescriptor SortDescriptor { get; set; } + + private Action> SortDescriptorAction { get; set; } + + private Elastic.Clients.Elasticsearch.SourceConfig? SourceValue { get; set; } + + private Dictionary? AggregationsValue { get; set; } + + private bool? ExplainValue { get; set; } + + private int? FromValue { get; set; } + + private IEnumerable>? IndicesBoostValue { get; set; } + + private double? MinScoreValue { get; set; } + + private Elastic.Clients.Elasticsearch.PointInTimeReference? PitValue { get; set; } + + private PointInTimeReferenceDescriptor PitDescriptor { get; set; } + + private Action PitDescriptorAction { get; set; } + + private bool? ProfileValue { get; set; } + + private Dictionary>? RuntimeMappingsValue { get; set; } + + private Dictionary? ScriptFieldsValue { get; set; } + + private IEnumerable? SearchAfterValue { get; set; } + + private bool? SeqNoPrimaryTermValue { get; set; } + + private int? SizeValue { get; set; } + + private IEnumerable? StatsValue { get; set; } + + private Elastic.Clients.Elasticsearch.Fields? StoredFieldsValue { get; set; } + + private Elastic.Clients.Elasticsearch.Suggester? SuggestValue { get; set; } + + private SuggesterDescriptor SuggestDescriptor { get; set; } + + private Action SuggestDescriptorAction { get; set; } + + private long? TerminateAfterValue { get; set; } + + private string? TimeoutValue { get; set; } + + private bool? TrackScoresValue { get; set; } + + private Elastic.Clients.Elasticsearch.TrackHits? TrackTotalHitsValue { get; set; } + + private bool? VersionValue { get; set; } + + public MultisearchBodyDescriptor Collapse(Elastic.Clients.Elasticsearch.FieldCollapse? collapse) + { + CollapseDescriptor = null; + CollapseDescriptorAction = null; + CollapseValue = collapse; + return Self; + } + + public MultisearchBodyDescriptor Collapse(FieldCollapseDescriptor descriptor) + { + CollapseValue = null; + CollapseDescriptorAction = null; + CollapseDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Collapse(Action> configure) + { + CollapseValue = null; + CollapseDescriptor = null; + CollapseDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor DocvalueFields(IEnumerable? docvalueFields) + { + DocvalueFieldsDescriptor = null; + DocvalueFieldsDescriptorAction = null; + DocvalueFieldsDescriptorActions = null; + DocvalueFieldsValue = docvalueFields; + return Self; + } + + public MultisearchBodyDescriptor DocvalueFields(QueryDsl.FieldAndFormatDescriptor descriptor) + { + DocvalueFieldsValue = null; + DocvalueFieldsDescriptorAction = null; + DocvalueFieldsDescriptorActions = null; + DocvalueFieldsDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor DocvalueFields(Action> configure) + { + DocvalueFieldsValue = null; + DocvalueFieldsDescriptor = null; + DocvalueFieldsDescriptorActions = null; + DocvalueFieldsDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor DocvalueFields(params Action>[] configure) + { + DocvalueFieldsValue = null; + DocvalueFieldsDescriptor = null; + DocvalueFieldsDescriptorAction = null; + DocvalueFieldsDescriptorActions = configure; + return Self; + } + + public MultisearchBodyDescriptor Fields(IEnumerable? fields) + { + FieldsDescriptor = null; + FieldsDescriptorAction = null; + FieldsDescriptorActions = null; + FieldsValue = fields; + return Self; + } + + public MultisearchBodyDescriptor Fields(QueryDsl.FieldAndFormatDescriptor descriptor) + { + FieldsValue = null; + FieldsDescriptorAction = null; + FieldsDescriptorActions = null; + FieldsDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Fields(Action> configure) + { + FieldsValue = null; + FieldsDescriptor = null; + FieldsDescriptorActions = null; + FieldsDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Fields(params Action>[] configure) + { + FieldsValue = null; + FieldsDescriptor = null; + FieldsDescriptorAction = null; + FieldsDescriptorActions = configure; + return Self; + } + + public MultisearchBodyDescriptor Highlight(Elastic.Clients.Elasticsearch.Highlight? highlight) + { + HighlightDescriptor = null; + HighlightDescriptorAction = null; + HighlightValue = highlight; + return Self; + } + + public MultisearchBodyDescriptor Highlight(HighlightDescriptor descriptor) + { + HighlightValue = null; + HighlightDescriptorAction = null; + HighlightDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Highlight(Action> configure) + { + HighlightValue = null; + HighlightDescriptor = null; + HighlightDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor PostFilter(Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? postFilter) + { + PostFilterDescriptor = null; + PostFilterDescriptorAction = null; + PostFilterValue = postFilter; + return Self; + } + + public MultisearchBodyDescriptor PostFilter(QueryDsl.QueryContainerDescriptor descriptor) + { + PostFilterValue = null; + PostFilterDescriptorAction = null; + PostFilterDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor PostFilter(Action> configure) + { + PostFilterValue = null; + PostFilterDescriptor = null; + PostFilterDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Query(Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? query) + { + QueryDescriptor = null; + QueryDescriptorAction = null; + QueryValue = query; + return Self; + } + + public MultisearchBodyDescriptor Query(QueryDsl.QueryContainerDescriptor descriptor) + { + QueryValue = null; + QueryDescriptorAction = null; + QueryDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Query(Action> configure) + { + QueryValue = null; + QueryDescriptor = null; + QueryDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Rescore(IEnumerable? rescore) + { + RescoreDescriptor = null; + RescoreDescriptorAction = null; + RescoreDescriptorActions = null; + RescoreValue = rescore; + return Self; + } + + public MultisearchBodyDescriptor Rescore(RescoreDescriptor descriptor) + { + RescoreValue = null; + RescoreDescriptorAction = null; + RescoreDescriptorActions = null; + RescoreDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Rescore(Action> configure) + { + RescoreValue = null; + RescoreDescriptor = null; + RescoreDescriptorActions = null; + RescoreDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Rescore(params Action>[] configure) + { + RescoreValue = null; + RescoreDescriptor = null; + RescoreDescriptorAction = null; + RescoreDescriptorActions = configure; + return Self; + } + + public MultisearchBodyDescriptor Sort(SortCollection? sort) + { + SortDescriptor = null; + SortDescriptorAction = null; + SortValue = sort; + return Self; + } + + public MultisearchBodyDescriptor Sort(SortDescriptor descriptor) + { + SortValue = null; + SortDescriptorAction = null; + SortDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Sort(Action> configure) + { + SortValue = null; + SortDescriptor = null; + SortDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Source(Elastic.Clients.Elasticsearch.SourceConfig? source) + { + SourceValue = source; + return Self; + } + + public MultisearchBodyDescriptor Aggregations(Func, FluentDictionary> selector) + { + AggregationsValue = selector?.Invoke(new FluentDictionary()); + return Self; + } + + public MultisearchBodyDescriptor Explain(bool? explain = true) + { + ExplainValue = explain; + return Self; + } + + public MultisearchBodyDescriptor From(int? from) + { + FromValue = from; + return Self; + } + + public MultisearchBodyDescriptor IndicesBoost(IEnumerable>? indicesBoost) + { + IndicesBoostValue = indicesBoost; + return Self; + } + + public MultisearchBodyDescriptor MinScore(double? minScore) + { + MinScoreValue = minScore; + return Self; + } + + public MultisearchBodyDescriptor Pit(Elastic.Clients.Elasticsearch.PointInTimeReference? pit) + { + PitDescriptor = null; + PitDescriptorAction = null; + PitValue = pit; + return Self; + } + + public MultisearchBodyDescriptor Pit(PointInTimeReferenceDescriptor descriptor) + { + PitValue = null; + PitDescriptorAction = null; + PitDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Pit(Action configure) + { + PitValue = null; + PitDescriptor = null; + PitDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Profile(bool? profile = true) + { + ProfileValue = profile; + return Self; + } + + public MultisearchBodyDescriptor RuntimeMappings(Func>, FluentDictionary>> selector) + { + RuntimeMappingsValue = selector?.Invoke(new FluentDictionary>()); + return Self; + } + + public MultisearchBodyDescriptor ScriptFields(Func, FluentDictionary> selector) + { + ScriptFieldsValue = selector?.Invoke(new FluentDictionary()); + return Self; + } + + public MultisearchBodyDescriptor SearchAfter(IEnumerable? searchAfter) + { + SearchAfterValue = searchAfter; + return Self; + } + + public MultisearchBodyDescriptor SeqNoPrimaryTerm(bool? seqNoPrimaryTerm = true) + { + SeqNoPrimaryTermValue = seqNoPrimaryTerm; + return Self; + } + + public MultisearchBodyDescriptor Size(int? size) + { + SizeValue = size; + return Self; + } + + public MultisearchBodyDescriptor Stats(IEnumerable? stats) + { + StatsValue = stats; + return Self; + } + + public MultisearchBodyDescriptor StoredFields(Elastic.Clients.Elasticsearch.Fields? storedFields) + { + StoredFieldsValue = storedFields; + return Self; + } + + public MultisearchBodyDescriptor StoredFields(Expression> storedFields) + { + StoredFieldsValue = storedFields; + return Self; + } + + public MultisearchBodyDescriptor Suggest(Elastic.Clients.Elasticsearch.Suggester? suggest) + { + SuggestDescriptor = null; + SuggestDescriptorAction = null; + SuggestValue = suggest; + return Self; + } + + public MultisearchBodyDescriptor Suggest(SuggesterDescriptor descriptor) + { + SuggestValue = null; + SuggestDescriptorAction = null; + SuggestDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Suggest(Action configure) + { + SuggestValue = null; + SuggestDescriptor = null; + SuggestDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor TerminateAfter(long? terminateAfter) + { + TerminateAfterValue = terminateAfter; + return Self; + } + + public MultisearchBodyDescriptor Timeout(string? timeout) + { + TimeoutValue = timeout; + return Self; + } + + public MultisearchBodyDescriptor TrackScores(bool? trackScores = true) + { + TrackScoresValue = trackScores; + return Self; + } + + public MultisearchBodyDescriptor TrackTotalHits(Elastic.Clients.Elasticsearch.TrackHits? trackTotalHits) + { + TrackTotalHitsValue = trackTotalHits; + return Self; + } + + public MultisearchBodyDescriptor Version(bool? version = true) + { + VersionValue = version; + return Self; + } + + protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings) + { + writer.WriteStartObject(); + if (CollapseDescriptor is not null) + { + writer.WritePropertyName("collapse"); + JsonSerializer.Serialize(writer, CollapseDescriptor, options); + } + else if (CollapseDescriptorAction is not null) + { + writer.WritePropertyName("collapse"); + JsonSerializer.Serialize(writer, new FieldCollapseDescriptor(CollapseDescriptorAction), options); + } + else if (CollapseValue is not null) + { + writer.WritePropertyName("collapse"); + JsonSerializer.Serialize(writer, CollapseValue, options); + } + + if (DocvalueFieldsDescriptor is not null) + { + writer.WritePropertyName("docvalue_fields"); + JsonSerializer.Serialize(writer, DocvalueFieldsDescriptor, options); + } + else if (DocvalueFieldsDescriptorAction is not null) + { + writer.WritePropertyName("docvalue_fields"); + JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor(DocvalueFieldsDescriptorAction), options); + } + else if (DocvalueFieldsDescriptorActions is not null) + { + writer.WritePropertyName("docvalue_fields"); + writer.WriteStartArray(); + foreach (var action in DocvalueFieldsDescriptorActions) + { + JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor(action), options); + } + + writer.WriteEndArray(); + } + else if (DocvalueFieldsValue is not null) + { + writer.WritePropertyName("docvalue_fields"); + JsonSerializer.Serialize(writer, DocvalueFieldsValue, options); + } + + if (FieldsDescriptor is not null) + { + writer.WritePropertyName("fields"); + JsonSerializer.Serialize(writer, FieldsDescriptor, options); + } + else if (FieldsDescriptorAction is not null) + { + writer.WritePropertyName("fields"); + JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor(FieldsDescriptorAction), options); + } + else if (FieldsDescriptorActions is not null) + { + writer.WritePropertyName("fields"); + writer.WriteStartArray(); + foreach (var action in FieldsDescriptorActions) + { + JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor(action), options); + } + + writer.WriteEndArray(); + } + else if (FieldsValue is not null) + { + writer.WritePropertyName("fields"); + JsonSerializer.Serialize(writer, FieldsValue, options); + } + + if (HighlightDescriptor is not null) + { + writer.WritePropertyName("highlight"); + JsonSerializer.Serialize(writer, HighlightDescriptor, options); + } + else if (HighlightDescriptorAction is not null) + { + writer.WritePropertyName("highlight"); + JsonSerializer.Serialize(writer, new HighlightDescriptor(HighlightDescriptorAction), options); + } + else if (HighlightValue is not null) + { + writer.WritePropertyName("highlight"); + JsonSerializer.Serialize(writer, HighlightValue, options); + } + + if (PostFilterDescriptor is not null) + { + writer.WritePropertyName("post_filter"); + JsonSerializer.Serialize(writer, PostFilterDescriptor, options); + } + else if (PostFilterDescriptorAction is not null) + { + writer.WritePropertyName("post_filter"); + JsonSerializer.Serialize(writer, new QueryDsl.QueryContainerDescriptor(PostFilterDescriptorAction), options); + } + else if (PostFilterValue is not null) + { + writer.WritePropertyName("post_filter"); + JsonSerializer.Serialize(writer, PostFilterValue, options); + } + + if (QueryDescriptor is not null) + { + writer.WritePropertyName("query"); + JsonSerializer.Serialize(writer, QueryDescriptor, options); + } + else if (QueryDescriptorAction is not null) + { + writer.WritePropertyName("query"); + JsonSerializer.Serialize(writer, new QueryDsl.QueryContainerDescriptor(QueryDescriptorAction), options); + } + else if (QueryValue is not null) + { + writer.WritePropertyName("query"); + JsonSerializer.Serialize(writer, QueryValue, options); + } + + if (RescoreDescriptor is not null) + { + writer.WritePropertyName("rescore"); + JsonSerializer.Serialize(writer, RescoreDescriptor, options); + } + else if (RescoreDescriptorAction is not null) + { + writer.WritePropertyName("rescore"); + JsonSerializer.Serialize(writer, new RescoreDescriptor(RescoreDescriptorAction), options); + } + else if (RescoreDescriptorActions is not null) + { + writer.WritePropertyName("rescore"); + writer.WriteStartArray(); + foreach (var action in RescoreDescriptorActions) + { + JsonSerializer.Serialize(writer, new RescoreDescriptor(action), options); + } + + writer.WriteEndArray(); + } + else if (RescoreValue is not null) + { + writer.WritePropertyName("rescore"); + JsonSerializer.Serialize(writer, RescoreValue, options); + } + + if (SortDescriptor is not null) + { + writer.WritePropertyName("sort"); + JsonSerializer.Serialize(writer, SortDescriptor, options); + } + else if (SortDescriptorAction is not null) + { + writer.WritePropertyName("sort"); + JsonSerializer.Serialize(writer, new SortDescriptor(SortDescriptorAction), options); + } + else if (SortValue is not null) + { + writer.WritePropertyName("sort"); + JsonSerializer.Serialize(writer, SortValue, options); + } + + if (SourceValue is not null) + { + writer.WritePropertyName("_source"); + JsonSerializer.Serialize(writer, SourceValue, options); + } + + if (AggregationsValue is not null) + { + writer.WritePropertyName("aggregations"); + JsonSerializer.Serialize(writer, AggregationsValue, options); + } + + if (ExplainValue.HasValue) + { + writer.WritePropertyName("explain"); + writer.WriteBooleanValue(ExplainValue.Value); + } + + if (FromValue.HasValue) + { + writer.WritePropertyName("from"); + writer.WriteNumberValue(FromValue.Value); + } + + if (IndicesBoostValue is not null) + { + writer.WritePropertyName("indices_boost"); + JsonSerializer.Serialize(writer, IndicesBoostValue, options); + } + + if (MinScoreValue.HasValue) + { + writer.WritePropertyName("min_score"); + writer.WriteNumberValue(MinScoreValue.Value); + } + + if (PitDescriptor is not null) + { + writer.WritePropertyName("pit"); + JsonSerializer.Serialize(writer, PitDescriptor, options); + } + else if (PitDescriptorAction is not null) + { + writer.WritePropertyName("pit"); + JsonSerializer.Serialize(writer, new PointInTimeReferenceDescriptor(PitDescriptorAction), options); + } + else if (PitValue is not null) + { + writer.WritePropertyName("pit"); + JsonSerializer.Serialize(writer, PitValue, options); + } + + if (ProfileValue.HasValue) + { + writer.WritePropertyName("profile"); + writer.WriteBooleanValue(ProfileValue.Value); + } + + if (RuntimeMappingsValue is not null) + { + writer.WritePropertyName("runtime_mappings"); + JsonSerializer.Serialize(writer, RuntimeMappingsValue, options); + } + + if (ScriptFieldsValue is not null) + { + writer.WritePropertyName("script_fields"); + JsonSerializer.Serialize(writer, ScriptFieldsValue, options); + } + + if (SearchAfterValue is not null) + { + writer.WritePropertyName("search_after"); + JsonSerializer.Serialize(writer, SearchAfterValue, options); + } + + if (SeqNoPrimaryTermValue.HasValue) + { + writer.WritePropertyName("seq_no_primary_term"); + writer.WriteBooleanValue(SeqNoPrimaryTermValue.Value); + } + + if (SizeValue.HasValue) + { + writer.WritePropertyName("size"); + writer.WriteNumberValue(SizeValue.Value); + } + + if (StatsValue is not null) + { + writer.WritePropertyName("stats"); + JsonSerializer.Serialize(writer, StatsValue, options); + } + + if (StoredFieldsValue is not null) + { + writer.WritePropertyName("stored_fields"); + JsonSerializer.Serialize(writer, StoredFieldsValue, options); + } + + if (SuggestDescriptor is not null) + { + writer.WritePropertyName("suggest"); + JsonSerializer.Serialize(writer, SuggestDescriptor, options); + } + else if (SuggestDescriptorAction is not null) + { + writer.WritePropertyName("suggest"); + JsonSerializer.Serialize(writer, new SuggesterDescriptor(SuggestDescriptorAction), options); + } + else if (SuggestValue is not null) + { + writer.WritePropertyName("suggest"); + JsonSerializer.Serialize(writer, SuggestValue, options); + } + + if (TerminateAfterValue.HasValue) + { + writer.WritePropertyName("terminate_after"); + writer.WriteNumberValue(TerminateAfterValue.Value); + } + + if (!string.IsNullOrEmpty(TimeoutValue)) + { + writer.WritePropertyName("timeout"); + writer.WriteStringValue(TimeoutValue); + } + + if (TrackScoresValue.HasValue) + { + writer.WritePropertyName("track_scores"); + writer.WriteBooleanValue(TrackScoresValue.Value); + } + + if (TrackTotalHitsValue is not null) + { + writer.WritePropertyName("track_total_hits"); + JsonSerializer.Serialize(writer, TrackTotalHitsValue, options); + } + + if (VersionValue.HasValue) + { + writer.WritePropertyName("version"); + writer.WriteBooleanValue(VersionValue.Value); + } + + writer.WriteEndObject(); + } + } + + public sealed partial class MultisearchBodyDescriptor : SerializableDescriptorBase + { + internal MultisearchBodyDescriptor(Action configure) => configure.Invoke(this); + public MultisearchBodyDescriptor() : base() + { + } + + private Elastic.Clients.Elasticsearch.FieldCollapse? CollapseValue { get; set; } + + private FieldCollapseDescriptor CollapseDescriptor { get; set; } + + private Action CollapseDescriptorAction { get; set; } + + private IEnumerable? DocvalueFieldsValue { get; set; } + + private QueryDsl.FieldAndFormatDescriptor DocvalueFieldsDescriptor { get; set; } + + private Action DocvalueFieldsDescriptorAction { get; set; } + + private Action[] DocvalueFieldsDescriptorActions { get; set; } + + private IEnumerable? FieldsValue { get; set; } + + private QueryDsl.FieldAndFormatDescriptor FieldsDescriptor { get; set; } + + private Action FieldsDescriptorAction { get; set; } + + private Action[] FieldsDescriptorActions { get; set; } + + private Elastic.Clients.Elasticsearch.Highlight? HighlightValue { get; set; } + + private HighlightDescriptor HighlightDescriptor { get; set; } + + private Action HighlightDescriptorAction { get; set; } + + private Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? PostFilterValue { get; set; } + + private QueryDsl.QueryContainerDescriptor PostFilterDescriptor { get; set; } + + private Action PostFilterDescriptorAction { get; set; } + + private Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? QueryValue { get; set; } + + private QueryDsl.QueryContainerDescriptor QueryDescriptor { get; set; } + + private Action QueryDescriptorAction { get; set; } + + private IEnumerable? RescoreValue { get; set; } + + private RescoreDescriptor RescoreDescriptor { get; set; } + + private Action RescoreDescriptorAction { get; set; } + + private Action[] RescoreDescriptorActions { get; set; } + + private SortCollection? SortValue { get; set; } + + private SortDescriptor SortDescriptor { get; set; } + + private Action SortDescriptorAction { get; set; } + + private Elastic.Clients.Elasticsearch.SourceConfig? SourceValue { get; set; } + + private Dictionary? AggregationsValue { get; set; } + + private bool? ExplainValue { get; set; } + + private int? FromValue { get; set; } + + private IEnumerable>? IndicesBoostValue { get; set; } + + private double? MinScoreValue { get; set; } + + private Elastic.Clients.Elasticsearch.PointInTimeReference? PitValue { get; set; } + + private PointInTimeReferenceDescriptor PitDescriptor { get; set; } + + private Action PitDescriptorAction { get; set; } + + private bool? ProfileValue { get; set; } + + private Dictionary>? RuntimeMappingsValue { get; set; } + + private Dictionary? ScriptFieldsValue { get; set; } + + private IEnumerable? SearchAfterValue { get; set; } + + private bool? SeqNoPrimaryTermValue { get; set; } + + private int? SizeValue { get; set; } + + private IEnumerable? StatsValue { get; set; } + + private Elastic.Clients.Elasticsearch.Fields? StoredFieldsValue { get; set; } + + private Elastic.Clients.Elasticsearch.Suggester? SuggestValue { get; set; } + + private SuggesterDescriptor SuggestDescriptor { get; set; } + + private Action SuggestDescriptorAction { get; set; } + + private long? TerminateAfterValue { get; set; } + + private string? TimeoutValue { get; set; } + + private bool? TrackScoresValue { get; set; } + + private Elastic.Clients.Elasticsearch.TrackHits? TrackTotalHitsValue { get; set; } + + private bool? VersionValue { get; set; } + + public MultisearchBodyDescriptor Collapse(Elastic.Clients.Elasticsearch.FieldCollapse? collapse) + { + CollapseDescriptor = null; + CollapseDescriptorAction = null; + CollapseValue = collapse; + return Self; + } + + public MultisearchBodyDescriptor Collapse(FieldCollapseDescriptor descriptor) + { + CollapseValue = null; + CollapseDescriptorAction = null; + CollapseDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Collapse(Action configure) + { + CollapseValue = null; + CollapseDescriptor = null; + CollapseDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor DocvalueFields(IEnumerable? docvalueFields) + { + DocvalueFieldsDescriptor = null; + DocvalueFieldsDescriptorAction = null; + DocvalueFieldsDescriptorActions = null; + DocvalueFieldsValue = docvalueFields; + return Self; + } + + public MultisearchBodyDescriptor DocvalueFields(QueryDsl.FieldAndFormatDescriptor descriptor) + { + DocvalueFieldsValue = null; + DocvalueFieldsDescriptorAction = null; + DocvalueFieldsDescriptorActions = null; + DocvalueFieldsDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor DocvalueFields(Action configure) + { + DocvalueFieldsValue = null; + DocvalueFieldsDescriptor = null; + DocvalueFieldsDescriptorActions = null; + DocvalueFieldsDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor DocvalueFields(params Action[] configure) + { + DocvalueFieldsValue = null; + DocvalueFieldsDescriptor = null; + DocvalueFieldsDescriptorAction = null; + DocvalueFieldsDescriptorActions = configure; + return Self; + } + + public MultisearchBodyDescriptor Fields(IEnumerable? fields) + { + FieldsDescriptor = null; + FieldsDescriptorAction = null; + FieldsDescriptorActions = null; + FieldsValue = fields; + return Self; + } + + public MultisearchBodyDescriptor Fields(QueryDsl.FieldAndFormatDescriptor descriptor) + { + FieldsValue = null; + FieldsDescriptorAction = null; + FieldsDescriptorActions = null; + FieldsDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Fields(Action configure) + { + FieldsValue = null; + FieldsDescriptor = null; + FieldsDescriptorActions = null; + FieldsDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Fields(params Action[] configure) + { + FieldsValue = null; + FieldsDescriptor = null; + FieldsDescriptorAction = null; + FieldsDescriptorActions = configure; + return Self; + } + + public MultisearchBodyDescriptor Highlight(Elastic.Clients.Elasticsearch.Highlight? highlight) + { + HighlightDescriptor = null; + HighlightDescriptorAction = null; + HighlightValue = highlight; + return Self; + } + + public MultisearchBodyDescriptor Highlight(HighlightDescriptor descriptor) + { + HighlightValue = null; + HighlightDescriptorAction = null; + HighlightDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Highlight(Action configure) + { + HighlightValue = null; + HighlightDescriptor = null; + HighlightDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor PostFilter(Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? postFilter) + { + PostFilterDescriptor = null; + PostFilterDescriptorAction = null; + PostFilterValue = postFilter; + return Self; + } + + public MultisearchBodyDescriptor PostFilter(QueryDsl.QueryContainerDescriptor descriptor) + { + PostFilterValue = null; + PostFilterDescriptorAction = null; + PostFilterDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor PostFilter(Action configure) + { + PostFilterValue = null; + PostFilterDescriptor = null; + PostFilterDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Query(Elastic.Clients.Elasticsearch.QueryDsl.QueryContainer? query) + { + QueryDescriptor = null; + QueryDescriptorAction = null; + QueryValue = query; + return Self; + } + + public MultisearchBodyDescriptor Query(QueryDsl.QueryContainerDescriptor descriptor) + { + QueryValue = null; + QueryDescriptorAction = null; + QueryDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Query(Action configure) + { + QueryValue = null; + QueryDescriptor = null; + QueryDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Rescore(IEnumerable? rescore) + { + RescoreDescriptor = null; + RescoreDescriptorAction = null; + RescoreDescriptorActions = null; + RescoreValue = rescore; + return Self; + } + + public MultisearchBodyDescriptor Rescore(RescoreDescriptor descriptor) + { + RescoreValue = null; + RescoreDescriptorAction = null; + RescoreDescriptorActions = null; + RescoreDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Rescore(Action configure) + { + RescoreValue = null; + RescoreDescriptor = null; + RescoreDescriptorActions = null; + RescoreDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Rescore(params Action[] configure) + { + RescoreValue = null; + RescoreDescriptor = null; + RescoreDescriptorAction = null; + RescoreDescriptorActions = configure; + return Self; + } + + public MultisearchBodyDescriptor Sort(SortCollection? sort) + { + SortDescriptor = null; + SortDescriptorAction = null; + SortValue = sort; + return Self; + } + + public MultisearchBodyDescriptor Sort(SortDescriptor descriptor) + { + SortValue = null; + SortDescriptorAction = null; + SortDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Sort(Action configure) + { + SortValue = null; + SortDescriptor = null; + SortDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Source(Elastic.Clients.Elasticsearch.SourceConfig? source) + { + SourceValue = source; + return Self; + } + + public MultisearchBodyDescriptor Aggregations(Func, FluentDictionary> selector) + { + AggregationsValue = selector?.Invoke(new FluentDictionary()); + return Self; + } + + public MultisearchBodyDescriptor Explain(bool? explain = true) + { + ExplainValue = explain; + return Self; + } + + public MultisearchBodyDescriptor From(int? from) + { + FromValue = from; + return Self; + } + + public MultisearchBodyDescriptor IndicesBoost(IEnumerable>? indicesBoost) + { + IndicesBoostValue = indicesBoost; + return Self; + } + + public MultisearchBodyDescriptor MinScore(double? minScore) + { + MinScoreValue = minScore; + return Self; + } + + public MultisearchBodyDescriptor Pit(Elastic.Clients.Elasticsearch.PointInTimeReference? pit) + { + PitDescriptor = null; + PitDescriptorAction = null; + PitValue = pit; + return Self; + } + + public MultisearchBodyDescriptor Pit(PointInTimeReferenceDescriptor descriptor) + { + PitValue = null; + PitDescriptorAction = null; + PitDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Pit(Action configure) + { + PitValue = null; + PitDescriptor = null; + PitDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor Profile(bool? profile = true) + { + ProfileValue = profile; + return Self; + } + + public MultisearchBodyDescriptor RuntimeMappings(Func>, FluentDictionary>> selector) + { + RuntimeMappingsValue = selector?.Invoke(new FluentDictionary>()); + return Self; + } + + public MultisearchBodyDescriptor ScriptFields(Func, FluentDictionary> selector) + { + ScriptFieldsValue = selector?.Invoke(new FluentDictionary()); + return Self; + } + + public MultisearchBodyDescriptor SearchAfter(IEnumerable? searchAfter) + { + SearchAfterValue = searchAfter; + return Self; + } + + public MultisearchBodyDescriptor SeqNoPrimaryTerm(bool? seqNoPrimaryTerm = true) + { + SeqNoPrimaryTermValue = seqNoPrimaryTerm; + return Self; + } + + public MultisearchBodyDescriptor Size(int? size) + { + SizeValue = size; + return Self; + } + + public MultisearchBodyDescriptor Stats(IEnumerable? stats) + { + StatsValue = stats; + return Self; + } + + public MultisearchBodyDescriptor StoredFields(Elastic.Clients.Elasticsearch.Fields? storedFields) + { + StoredFieldsValue = storedFields; + return Self; + } + + public MultisearchBodyDescriptor StoredFields(Expression> storedFields) + { + StoredFieldsValue = storedFields; + return Self; + } + + public MultisearchBodyDescriptor StoredFields(Expression> storedFields) + { + StoredFieldsValue = storedFields; + return Self; + } + + public MultisearchBodyDescriptor Suggest(Elastic.Clients.Elasticsearch.Suggester? suggest) + { + SuggestDescriptor = null; + SuggestDescriptorAction = null; + SuggestValue = suggest; + return Self; + } + + public MultisearchBodyDescriptor Suggest(SuggesterDescriptor descriptor) + { + SuggestValue = null; + SuggestDescriptorAction = null; + SuggestDescriptor = descriptor; + return Self; + } + + public MultisearchBodyDescriptor Suggest(Action configure) + { + SuggestValue = null; + SuggestDescriptor = null; + SuggestDescriptorAction = configure; + return Self; + } + + public MultisearchBodyDescriptor TerminateAfter(long? terminateAfter) + { + TerminateAfterValue = terminateAfter; + return Self; + } + + public MultisearchBodyDescriptor Timeout(string? timeout) + { + TimeoutValue = timeout; + return Self; + } + + public MultisearchBodyDescriptor TrackScores(bool? trackScores = true) + { + TrackScoresValue = trackScores; + return Self; + } + + public MultisearchBodyDescriptor TrackTotalHits(Elastic.Clients.Elasticsearch.TrackHits? trackTotalHits) + { + TrackTotalHitsValue = trackTotalHits; + return Self; + } + + public MultisearchBodyDescriptor Version(bool? version = true) + { + VersionValue = version; + return Self; + } + + protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings) + { + writer.WriteStartObject(); + if (CollapseDescriptor is not null) + { + writer.WritePropertyName("collapse"); + JsonSerializer.Serialize(writer, CollapseDescriptor, options); + } + else if (CollapseDescriptorAction is not null) + { + writer.WritePropertyName("collapse"); + JsonSerializer.Serialize(writer, new FieldCollapseDescriptor(CollapseDescriptorAction), options); + } + else if (CollapseValue is not null) + { + writer.WritePropertyName("collapse"); + JsonSerializer.Serialize(writer, CollapseValue, options); + } + + if (DocvalueFieldsDescriptor is not null) + { + writer.WritePropertyName("docvalue_fields"); + JsonSerializer.Serialize(writer, DocvalueFieldsDescriptor, options); + } + else if (DocvalueFieldsDescriptorAction is not null) + { + writer.WritePropertyName("docvalue_fields"); + JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor(DocvalueFieldsDescriptorAction), options); + } + else if (DocvalueFieldsDescriptorActions is not null) + { + writer.WritePropertyName("docvalue_fields"); + writer.WriteStartArray(); + foreach (var action in DocvalueFieldsDescriptorActions) + { + JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor(action), options); + } + + writer.WriteEndArray(); + } + else if (DocvalueFieldsValue is not null) + { + writer.WritePropertyName("docvalue_fields"); + JsonSerializer.Serialize(writer, DocvalueFieldsValue, options); + } + + if (FieldsDescriptor is not null) + { + writer.WritePropertyName("fields"); + JsonSerializer.Serialize(writer, FieldsDescriptor, options); + } + else if (FieldsDescriptorAction is not null) + { + writer.WritePropertyName("fields"); + JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor(FieldsDescriptorAction), options); + } + else if (FieldsDescriptorActions is not null) + { + writer.WritePropertyName("fields"); + writer.WriteStartArray(); + foreach (var action in FieldsDescriptorActions) + { + JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor(action), options); + } + + writer.WriteEndArray(); + } + else if (FieldsValue is not null) + { + writer.WritePropertyName("fields"); + JsonSerializer.Serialize(writer, FieldsValue, options); + } + + if (HighlightDescriptor is not null) + { + writer.WritePropertyName("highlight"); + JsonSerializer.Serialize(writer, HighlightDescriptor, options); + } + else if (HighlightDescriptorAction is not null) + { + writer.WritePropertyName("highlight"); + JsonSerializer.Serialize(writer, new HighlightDescriptor(HighlightDescriptorAction), options); + } + else if (HighlightValue is not null) + { + writer.WritePropertyName("highlight"); + JsonSerializer.Serialize(writer, HighlightValue, options); + } + + if (PostFilterDescriptor is not null) + { + writer.WritePropertyName("post_filter"); + JsonSerializer.Serialize(writer, PostFilterDescriptor, options); + } + else if (PostFilterDescriptorAction is not null) + { + writer.WritePropertyName("post_filter"); + JsonSerializer.Serialize(writer, new QueryDsl.QueryContainerDescriptor(PostFilterDescriptorAction), options); + } + else if (PostFilterValue is not null) + { + writer.WritePropertyName("post_filter"); + JsonSerializer.Serialize(writer, PostFilterValue, options); + } + + if (QueryDescriptor is not null) + { + writer.WritePropertyName("query"); + JsonSerializer.Serialize(writer, QueryDescriptor, options); + } + else if (QueryDescriptorAction is not null) + { + writer.WritePropertyName("query"); + JsonSerializer.Serialize(writer, new QueryDsl.QueryContainerDescriptor(QueryDescriptorAction), options); + } + else if (QueryValue is not null) + { + writer.WritePropertyName("query"); + JsonSerializer.Serialize(writer, QueryValue, options); + } + + if (RescoreDescriptor is not null) + { + writer.WritePropertyName("rescore"); + JsonSerializer.Serialize(writer, RescoreDescriptor, options); + } + else if (RescoreDescriptorAction is not null) + { + writer.WritePropertyName("rescore"); + JsonSerializer.Serialize(writer, new RescoreDescriptor(RescoreDescriptorAction), options); + } + else if (RescoreDescriptorActions is not null) + { + writer.WritePropertyName("rescore"); + writer.WriteStartArray(); + foreach (var action in RescoreDescriptorActions) + { + JsonSerializer.Serialize(writer, new RescoreDescriptor(action), options); + } + + writer.WriteEndArray(); + } + else if (RescoreValue is not null) + { + writer.WritePropertyName("rescore"); + JsonSerializer.Serialize(writer, RescoreValue, options); + } + + if (SortDescriptor is not null) + { + writer.WritePropertyName("sort"); + JsonSerializer.Serialize(writer, SortDescriptor, options); + } + else if (SortDescriptorAction is not null) + { + writer.WritePropertyName("sort"); + JsonSerializer.Serialize(writer, new SortDescriptor(SortDescriptorAction), options); + } + else if (SortValue is not null) + { + writer.WritePropertyName("sort"); + JsonSerializer.Serialize(writer, SortValue, options); + } + + if (SourceValue is not null) + { + writer.WritePropertyName("_source"); + JsonSerializer.Serialize(writer, SourceValue, options); + } + + if (AggregationsValue is not null) + { + writer.WritePropertyName("aggregations"); + JsonSerializer.Serialize(writer, AggregationsValue, options); + } + + if (ExplainValue.HasValue) + { + writer.WritePropertyName("explain"); + writer.WriteBooleanValue(ExplainValue.Value); + } + + if (FromValue.HasValue) + { + writer.WritePropertyName("from"); + writer.WriteNumberValue(FromValue.Value); + } + + if (IndicesBoostValue is not null) + { + writer.WritePropertyName("indices_boost"); + JsonSerializer.Serialize(writer, IndicesBoostValue, options); + } + + if (MinScoreValue.HasValue) + { + writer.WritePropertyName("min_score"); + writer.WriteNumberValue(MinScoreValue.Value); + } + + if (PitDescriptor is not null) + { + writer.WritePropertyName("pit"); + JsonSerializer.Serialize(writer, PitDescriptor, options); + } + else if (PitDescriptorAction is not null) + { + writer.WritePropertyName("pit"); + JsonSerializer.Serialize(writer, new PointInTimeReferenceDescriptor(PitDescriptorAction), options); + } + else if (PitValue is not null) + { + writer.WritePropertyName("pit"); + JsonSerializer.Serialize(writer, PitValue, options); + } + + if (ProfileValue.HasValue) + { + writer.WritePropertyName("profile"); + writer.WriteBooleanValue(ProfileValue.Value); + } + + if (RuntimeMappingsValue is not null) + { + writer.WritePropertyName("runtime_mappings"); + JsonSerializer.Serialize(writer, RuntimeMappingsValue, options); + } + + if (ScriptFieldsValue is not null) + { + writer.WritePropertyName("script_fields"); + JsonSerializer.Serialize(writer, ScriptFieldsValue, options); + } + + if (SearchAfterValue is not null) + { + writer.WritePropertyName("search_after"); + JsonSerializer.Serialize(writer, SearchAfterValue, options); + } + + if (SeqNoPrimaryTermValue.HasValue) + { + writer.WritePropertyName("seq_no_primary_term"); + writer.WriteBooleanValue(SeqNoPrimaryTermValue.Value); + } + + if (SizeValue.HasValue) + { + writer.WritePropertyName("size"); + writer.WriteNumberValue(SizeValue.Value); + } + + if (StatsValue is not null) + { + writer.WritePropertyName("stats"); + JsonSerializer.Serialize(writer, StatsValue, options); + } + + if (StoredFieldsValue is not null) + { + writer.WritePropertyName("stored_fields"); + JsonSerializer.Serialize(writer, StoredFieldsValue, options); + } + + if (SuggestDescriptor is not null) + { + writer.WritePropertyName("suggest"); + JsonSerializer.Serialize(writer, SuggestDescriptor, options); + } + else if (SuggestDescriptorAction is not null) + { + writer.WritePropertyName("suggest"); + JsonSerializer.Serialize(writer, new SuggesterDescriptor(SuggestDescriptorAction), options); + } + else if (SuggestValue is not null) + { + writer.WritePropertyName("suggest"); + JsonSerializer.Serialize(writer, SuggestValue, options); + } + + if (TerminateAfterValue.HasValue) + { + writer.WritePropertyName("terminate_after"); + writer.WriteNumberValue(TerminateAfterValue.Value); + } + + if (!string.IsNullOrEmpty(TimeoutValue)) + { + writer.WritePropertyName("timeout"); + writer.WriteStringValue(TimeoutValue); + } + + if (TrackScoresValue.HasValue) + { + writer.WritePropertyName("track_scores"); + writer.WriteBooleanValue(TrackScoresValue.Value); + } + + if (TrackTotalHitsValue is not null) + { + writer.WritePropertyName("track_total_hits"); + JsonSerializer.Serialize(writer, TrackTotalHitsValue, options); + } + + if (VersionValue.HasValue) + { + writer.WritePropertyName("version"); + writer.WriteBooleanValue(VersionValue.Value); + } + + writer.WriteEndObject(); + } } } \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchHeader.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchHeader.g.cs index 56ea5b66555..c0e73f9546b 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchHeader.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/MultisearchHeader.g.cs @@ -28,46 +28,214 @@ public partial class MultisearchHeader { [JsonInclude] [JsonPropertyName("allow_no_indices")] - public bool? AllowNoIndices { get; init; } + public bool? AllowNoIndices { get; set; } [JsonInclude] [JsonPropertyName("allow_partial_search_results")] - public bool? AllowPartialSearchResults { get; init; } + public bool? AllowPartialSearchResults { get; set; } [JsonInclude] [JsonPropertyName("ccs_minimize_roundtrips")] - public bool? CcsMinimizeRoundtrips { get; init; } + public bool? CcsMinimizeRoundtrips { get; set; } [JsonInclude] [JsonPropertyName("expand_wildcards")] - public Elastic.Clients.Elasticsearch.ExpandWildcards? ExpandWildcards { get; init; } + public Elastic.Clients.Elasticsearch.ExpandWildcards? ExpandWildcards { get; set; } [JsonInclude] [JsonPropertyName("ignore_throttled")] - public bool? IgnoreThrottled { get; init; } + public bool? IgnoreThrottled { get; set; } [JsonInclude] [JsonPropertyName("ignore_unavailable")] - public bool? IgnoreUnavailable { get; init; } + public bool? IgnoreUnavailable { get; set; } [JsonInclude] [JsonPropertyName("index")] - public Elastic.Clients.Elasticsearch.Indices? Index { get; init; } + public Elastic.Clients.Elasticsearch.Indices? Index { get; set; } [JsonInclude] [JsonPropertyName("preference")] - public string? Preference { get; init; } + public string? Preference { get; set; } [JsonInclude] [JsonPropertyName("request_cache")] - public bool? RequestCache { get; init; } + public bool? RequestCache { get; set; } [JsonInclude] [JsonPropertyName("routing")] - public string? Routing { get; init; } + public Elastic.Clients.Elasticsearch.Routing? Routing { get; set; } [JsonInclude] [JsonPropertyName("search_type")] - public Elastic.Clients.Elasticsearch.SearchType? SearchType { get; init; } + public Elastic.Clients.Elasticsearch.SearchType? SearchType { get; set; } + } + + public sealed partial class MultisearchHeaderDescriptor : SerializableDescriptorBase + { + internal MultisearchHeaderDescriptor(Action configure) => configure.Invoke(this); + public MultisearchHeaderDescriptor() : base() + { + } + + private bool? AllowNoIndicesValue { get; set; } + + private bool? AllowPartialSearchResultsValue { get; set; } + + private bool? CcsMinimizeRoundtripsValue { get; set; } + + private Elastic.Clients.Elasticsearch.ExpandWildcards? ExpandWildcardsValue { get; set; } + + private bool? IgnoreThrottledValue { get; set; } + + private bool? IgnoreUnavailableValue { get; set; } + + private Elastic.Clients.Elasticsearch.Indices? IndexValue { get; set; } + + private string? PreferenceValue { get; set; } + + private bool? RequestCacheValue { get; set; } + + private Elastic.Clients.Elasticsearch.Routing? RoutingValue { get; set; } + + private Elastic.Clients.Elasticsearch.SearchType? SearchTypeValue { get; set; } + + public MultisearchHeaderDescriptor AllowNoIndices(bool? allowNoIndices = true) + { + AllowNoIndicesValue = allowNoIndices; + return Self; + } + + public MultisearchHeaderDescriptor AllowPartialSearchResults(bool? allowPartialSearchResults = true) + { + AllowPartialSearchResultsValue = allowPartialSearchResults; + return Self; + } + + public MultisearchHeaderDescriptor CcsMinimizeRoundtrips(bool? ccsMinimizeRoundtrips = true) + { + CcsMinimizeRoundtripsValue = ccsMinimizeRoundtrips; + return Self; + } + + public MultisearchHeaderDescriptor ExpandWildcards(Elastic.Clients.Elasticsearch.ExpandWildcards? expandWildcards) + { + ExpandWildcardsValue = expandWildcards; + return Self; + } + + public MultisearchHeaderDescriptor IgnoreThrottled(bool? ignoreThrottled = true) + { + IgnoreThrottledValue = ignoreThrottled; + return Self; + } + + public MultisearchHeaderDescriptor IgnoreUnavailable(bool? ignoreUnavailable = true) + { + IgnoreUnavailableValue = ignoreUnavailable; + return Self; + } + + public MultisearchHeaderDescriptor Index(Elastic.Clients.Elasticsearch.Indices? index) + { + IndexValue = index; + return Self; + } + + public MultisearchHeaderDescriptor Preference(string? preference) + { + PreferenceValue = preference; + return Self; + } + + public MultisearchHeaderDescriptor RequestCache(bool? requestCache = true) + { + RequestCacheValue = requestCache; + return Self; + } + + public MultisearchHeaderDescriptor Routing(Elastic.Clients.Elasticsearch.Routing? routing) + { + RoutingValue = routing; + return Self; + } + + public MultisearchHeaderDescriptor SearchType(Elastic.Clients.Elasticsearch.SearchType? searchType) + { + SearchTypeValue = searchType; + return Self; + } + + protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings) + { + writer.WriteStartObject(); + if (AllowNoIndicesValue.HasValue) + { + writer.WritePropertyName("allow_no_indices"); + writer.WriteBooleanValue(AllowNoIndicesValue.Value); + } + + if (AllowPartialSearchResultsValue.HasValue) + { + writer.WritePropertyName("allow_partial_search_results"); + writer.WriteBooleanValue(AllowPartialSearchResultsValue.Value); + } + + if (CcsMinimizeRoundtripsValue.HasValue) + { + writer.WritePropertyName("ccs_minimize_roundtrips"); + writer.WriteBooleanValue(CcsMinimizeRoundtripsValue.Value); + } + + if (ExpandWildcardsValue is not null) + { + writer.WritePropertyName("expand_wildcards"); + JsonSerializer.Serialize(writer, ExpandWildcardsValue, options); + } + + if (IgnoreThrottledValue.HasValue) + { + writer.WritePropertyName("ignore_throttled"); + writer.WriteBooleanValue(IgnoreThrottledValue.Value); + } + + if (IgnoreUnavailableValue.HasValue) + { + writer.WritePropertyName("ignore_unavailable"); + writer.WriteBooleanValue(IgnoreUnavailableValue.Value); + } + + if (IndexValue is not null) + { + writer.WritePropertyName("index"); + JsonSerializer.Serialize(writer, IndexValue, options); + } + + if (!string.IsNullOrEmpty(PreferenceValue)) + { + writer.WritePropertyName("preference"); + writer.WriteStringValue(PreferenceValue); + } + + if (RequestCacheValue.HasValue) + { + writer.WritePropertyName("request_cache"); + writer.WriteBooleanValue(RequestCacheValue.Value); + } + + if (RoutingValue is not null) + { + writer.WritePropertyName("routing"); + JsonSerializer.Serialize(writer, RoutingValue, options); + } + + if (SearchTypeValue is not null) + { + writer.WritePropertyName("search_type"); + JsonSerializer.Serialize(writer, SearchTypeValue, options); + } + + writer.WriteEndObject(); + } } } \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchRequestItem.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchRequestItem.g.cs new file mode 100644 index 00000000000..5300a8385e0 --- /dev/null +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchRequestItem.g.cs @@ -0,0 +1,38 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information. +// +// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ +// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ +// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ +// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ +// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ +// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ +// ------------------------------------------------ +// +// This file is automatically generated. +// Please do not edit these files manually. +// +// ------------------------------------------------ + +using Elastic.Transport; +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Text.Json; +using System.Text.Json.Serialization; + +#nullable restore +namespace Elastic.Clients.Elasticsearch +{ + public partial class SearchRequestItem : Union + { + public SearchRequestItem(Elastic.Clients.Elasticsearch.MultisearchHeader? item) : base(item) + { + } + + public SearchRequestItem(Elastic.Clients.Elasticsearch.MultisearchBody? item) : base(item) + { + } + } +} \ No newline at end of file From e2097654138b2f92afd0fbaf51f62e6dbbcbeca5 Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Thu, 9 Jun 2022 12:45:00 +0100 Subject: [PATCH 6/8] Partially code-gen array bodies requests --- .../Types/Documents/MultiSearch/MultiSearchRequest.cs | 4 +--- .../_Generated/Api/MultiSearchRequest.g.cs | 4 +++- .../Document/Multiple/MultiSearch/MultiSearchApiTests.cs | 7 ++++--- .../Tests/Serialization/Documents/MSearchSerialization.cs | 6 +++--- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs b/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs index 574726a1a36..760fd4dbfa9 100644 --- a/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs +++ b/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs @@ -53,10 +53,8 @@ public MultiSearchRequestDescriptor AddSearch(RequestItem item) internal override void BeforeRequest() => TypedKeys(true); } - public partial class MultiSearchRequest : IStreamSerializable + public partial class MultiSearchRequest { - public List Searches { get; set; } - void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) { if (Searches is null) diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs index 92cec3aa5fd..b3448419a3b 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs @@ -64,7 +64,7 @@ public sealed class MultiSearchRequestParameters : RequestParameters Q("typed_keys"); set => Q("typed_keys", value); } } - public partial class MultiSearchRequest : PlainRequestBase + public partial class MultiSearchRequest : PlainRequestBase, IStreamSerializable { public MultiSearchRequest() { @@ -112,6 +112,8 @@ public MultiSearchRequest(Elastic.Clients.Elasticsearch.Indices? indices) : base [JsonIgnore] public bool? TypedKeys { get => Q("typed_keys"); set => Q("typed_keys", value); } + + public List Searches { get; set; } } public sealed partial class MultiSearchRequestDescriptor : RequestDescriptorBase, MultiSearchRequestParameters> diff --git a/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs b/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs index 403c1bb79c4..08f7616c9f5 100644 --- a/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs +++ b/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs @@ -34,10 +34,11 @@ public MultiSearchApiTests(ReadOnlyCluster cluster, EndpointUsage usage) : base( protected override MultiSearchRequest Initializer => new(Infer.Index()) { - Searches = new List + Searches = new List { - new RequestItem(new MultisearchBody { From = 0, Size = 10, Query = new MatchAllQuery() }), - new RequestItem(new MultisearchBody { From = 0, Size = 1, Query = new MatchAllQuery() }) + // TODO after code-gen + //new RequestItem(new MultisearchBody { From = 0, Size = 10, Query = new MatchAllQuery() }), + //new RequestItem(new MultisearchBody { From = 0, Size = 1, Query = new MatchAllQuery() }) } }; diff --git a/tests/Tests/Serialization/Documents/MSearchSerialization.cs b/tests/Tests/Serialization/Documents/MSearchSerialization.cs index aed10cd0357..b993a375046 100644 --- a/tests/Tests/Serialization/Documents/MSearchSerialization.cs +++ b/tests/Tests/Serialization/Documents/MSearchSerialization.cs @@ -33,10 +33,10 @@ public async Task SerializesRequest() var request = (IStreamSerializable)new MultiSearchRequest { - Searches = new List + Searches = new List { - new RequestItem(new MultisearchHeader { Index = Infer.Index() }, new MultisearchBody { From = 0, Query = new MatchAllQuery() }), - new RequestItem(new MultisearchHeader { Index = Infer.Index() }, new MultisearchBody { From = 0, Query = new MatchAllQuery() }) + //new SearchRequestItem(new MultisearchHeader { Index = Infer.Index() }, new MultisearchBody { From = 0, Query = new MatchAllQuery() }), + //new SearchRequestItem(new MultisearchHeader { Index = Infer.Index() }, new MultisearchBody { From = 0, Query = new MatchAllQuery() }) } }; From 70dc64ffe128d626df61440d894b341d73a7dcdc Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Thu, 16 Jun 2022 12:01:10 +0100 Subject: [PATCH 7/8] Updating to latest specification changes --- build/scripts/scripts.fsproj | 4 +- .../Types/Mapping/CoreProperty.g.cs | 31 ----- .../Types/Mapping/DocValuesProperty.g.cs | 31 ----- .../Types/Mapping/NumberProperty.g.cs | 31 ----- .../_Generated/Types/Mapping/Properties.g.cs | 128 +++++++++--------- .../Types/Mapping/RangeProperty.g.cs | 31 ----- .../Types/Migration/MigrationFeature.g.cs | 12 -- 7 files changed, 65 insertions(+), 203 deletions(-) delete mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/CoreProperty.g.cs delete mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/DocValuesProperty.g.cs delete mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/NumberProperty.g.cs delete mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/RangeProperty.g.cs diff --git a/build/scripts/scripts.fsproj b/build/scripts/scripts.fsproj index 6cce8b04b6f..9d2825096c9 100644 --- a/build/scripts/scripts.fsproj +++ b/build/scripts/scripts.fsproj @@ -34,17 +34,15 @@ make-release-notes.yml + - - - diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/CoreProperty.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/CoreProperty.g.cs deleted file mode 100644 index 905c594e387..00000000000 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/CoreProperty.g.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Licensed to Elasticsearch B.V under one or more agreements. -// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. -// See the LICENSE file in the project root for more information. -// -// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ -// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ -// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ -// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ -// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ -// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ -// ------------------------------------------------ -// -// This file is automatically generated. -// Please do not edit these files manually. -// -// ------------------------------------------------ - -using Elastic.Transport; -using System; -using System.Collections.Generic; -using System.Linq.Expressions; -using System.Text.Json; -using System.Text.Json.Serialization; - -#nullable restore -namespace Elastic.Clients.Elasticsearch.Mapping -{ - public partial class CoreProperty - { - } -} \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/DocValuesProperty.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/DocValuesProperty.g.cs deleted file mode 100644 index a3e9aaa8b2d..00000000000 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/DocValuesProperty.g.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Licensed to Elasticsearch B.V under one or more agreements. -// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. -// See the LICENSE file in the project root for more information. -// -// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ -// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ -// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ -// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ -// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ -// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ -// ------------------------------------------------ -// -// This file is automatically generated. -// Please do not edit these files manually. -// -// ------------------------------------------------ - -using Elastic.Transport; -using System; -using System.Collections.Generic; -using System.Linq.Expressions; -using System.Text.Json; -using System.Text.Json.Serialization; - -#nullable restore -namespace Elastic.Clients.Elasticsearch.Mapping -{ - public partial class DocValuesProperty - { - } -} \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/NumberProperty.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/NumberProperty.g.cs deleted file mode 100644 index 16d5f952674..00000000000 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/NumberProperty.g.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Licensed to Elasticsearch B.V under one or more agreements. -// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. -// See the LICENSE file in the project root for more information. -// -// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ -// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ -// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ -// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ -// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ -// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ -// ------------------------------------------------ -// -// This file is automatically generated. -// Please do not edit these files manually. -// -// ------------------------------------------------ - -using Elastic.Transport; -using System; -using System.Collections.Generic; -using System.Linq.Expressions; -using System.Text.Json; -using System.Text.Json.Serialization; - -#nullable restore -namespace Elastic.Clients.Elasticsearch.Mapping -{ - public partial class NumberProperty - { - } -} \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/Properties.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/Properties.g.cs index 8ae3b646814..8aec1febe33 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/Properties.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/Properties.g.cs @@ -286,98 +286,98 @@ private static IProperty DeserializeVariant(string type, ref Utf8JsonReader read { switch (type) { - case "{dynamic_property}": - return JsonSerializer.Deserialize(ref reader, options); - case "match_only_text": - return JsonSerializer.Deserialize(ref reader, options); - case "point": - return JsonSerializer.Deserialize(ref reader, options); - case "wildcard": - return JsonSerializer.Deserialize(ref reader, options); - case "version": - return JsonSerializer.Deserialize(ref reader, options); - case "token_count": - return JsonSerializer.Deserialize(ref reader, options); - case "shape": - return JsonSerializer.Deserialize(ref reader, options); - case "murmur3": - return JsonSerializer.Deserialize(ref reader, options); - case "ip": - return JsonSerializer.Deserialize(ref reader, options); - case "completion": - return JsonSerializer.Deserialize(ref reader, options); - case "geo_shape": - return JsonSerializer.Deserialize(ref reader, options); - case "geo_point": - return JsonSerializer.Deserialize(ref reader, options); - case "date_range": - return JsonSerializer.Deserialize(ref reader, options); - case "double_range": - return JsonSerializer.Deserialize(ref reader, options); - case "float_range": - return JsonSerializer.Deserialize(ref reader, options); - case "integer_range": - return JsonSerializer.Deserialize(ref reader, options); - case "ip_range": - return JsonSerializer.Deserialize(ref reader, options); case "long_range": return JsonSerializer.Deserialize(ref reader, options); - case "scaled_float": - return JsonSerializer.Deserialize(ref reader, options); + case "ip_range": + return JsonSerializer.Deserialize(ref reader, options); + case "integer_range": + return JsonSerializer.Deserialize(ref reader, options); + case "float_range": + return JsonSerializer.Deserialize(ref reader, options); + case "double_range": + return JsonSerializer.Deserialize(ref reader, options); + case "date_range": + return JsonSerializer.Deserialize(ref reader, options); case "unsigned_long": return JsonSerializer.Deserialize(ref reader, options); - case "byte": - return JsonSerializer.Deserialize(ref reader, options); case "short": return JsonSerializer.Deserialize(ref reader, options); + case "scaled_float": + return JsonSerializer.Deserialize(ref reader, options); case "long": return JsonSerializer.Deserialize(ref reader, options); case "integer": return JsonSerializer.Deserialize(ref reader, options); - case "double": - return JsonSerializer.Deserialize(ref reader, options); case "half_float": return JsonSerializer.Deserialize(ref reader, options); case "float": return JsonSerializer.Deserialize(ref reader, options); - case "keyword": - return JsonSerializer.Deserialize(ref reader, options); - case "date_nanos": - return JsonSerializer.Deserialize(ref reader, options); - case "date": - return JsonSerializer.Deserialize(ref reader, options); - case "boolean": - return JsonSerializer.Deserialize(ref reader, options); - case "binary": - return JsonSerializer.Deserialize(ref reader, options); - case "text": - return JsonSerializer.Deserialize(ref reader, options); - case "search_as_you_type": - return JsonSerializer.Deserialize(ref reader, options); - case "nested": - return JsonSerializer.Deserialize(ref reader, options); - case "object": - return JsonSerializer.Deserialize(ref reader, options); - case "aggregate_metric_double": - return JsonSerializer.Deserialize(ref reader, options); - case "dense_vector": - return JsonSerializer.Deserialize(ref reader, options); + case "double": + return JsonSerializer.Deserialize(ref reader, options); + case "byte": + return JsonSerializer.Deserialize(ref reader, options); + case "shape": + return JsonSerializer.Deserialize(ref reader, options); + case "point": + return JsonSerializer.Deserialize(ref reader, options); + case "geo_shape": + return JsonSerializer.Deserialize(ref reader, options); + case "geo_point": + return JsonSerializer.Deserialize(ref reader, options); + case "token_count": + return JsonSerializer.Deserialize(ref reader, options); + case "murmur3": + return JsonSerializer.Deserialize(ref reader, options); + case "ip": + return JsonSerializer.Deserialize(ref reader, options); case "histogram": return JsonSerializer.Deserialize(ref reader, options); case "alias": return JsonSerializer.Deserialize(ref reader, options); case "constant_keyword": return JsonSerializer.Deserialize(ref reader, options); + case "completion": + return JsonSerializer.Deserialize(ref reader, options); + case "object": + return JsonSerializer.Deserialize(ref reader, options); + case "nested": + return JsonSerializer.Deserialize(ref reader, options); + case "flattened": + return JsonSerializer.Deserialize(ref reader, options); + case "dense_vector": + return JsonSerializer.Deserialize(ref reader, options); + case "aggregate_metric_double": + return JsonSerializer.Deserialize(ref reader, options); + case "date": + return JsonSerializer.Deserialize(ref reader, options); + case "date_nanos": + return JsonSerializer.Deserialize(ref reader, options); + case "wildcard": + return JsonSerializer.Deserialize(ref reader, options); + case "version": + return JsonSerializer.Deserialize(ref reader, options); + case "text": + return JsonSerializer.Deserialize(ref reader, options); + case "search_as_you_type": + return JsonSerializer.Deserialize(ref reader, options); case "rank_features": return JsonSerializer.Deserialize(ref reader, options); case "rank_feature": return JsonSerializer.Deserialize(ref reader, options); case "percolator": return JsonSerializer.Deserialize(ref reader, options); + case "match_only_text": + return JsonSerializer.Deserialize(ref reader, options); + case "keyword": + return JsonSerializer.Deserialize(ref reader, options); case "join": return JsonSerializer.Deserialize(ref reader, options); - case "flattened": - return JsonSerializer.Deserialize(ref reader, options); + case "{dynamic_property}": + return JsonSerializer.Deserialize(ref reader, options); + case "boolean": + return JsonSerializer.Deserialize(ref reader, options); + case "binary": + return JsonSerializer.Deserialize(ref reader, options); default: throw new JsonException("Encounted an unknown variant type which could not be deserialised."); } diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/RangeProperty.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/RangeProperty.g.cs deleted file mode 100644 index 078b3be6c51..00000000000 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Mapping/RangeProperty.g.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Licensed to Elasticsearch B.V under one or more agreements. -// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. -// See the LICENSE file in the project root for more information. -// -// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ -// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ -// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ -// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ -// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ -// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ -// ------------------------------------------------ -// -// This file is automatically generated. -// Please do not edit these files manually. -// -// ------------------------------------------------ - -using Elastic.Transport; -using System; -using System.Collections.Generic; -using System.Linq.Expressions; -using System.Text.Json; -using System.Text.Json.Serialization; - -#nullable restore -namespace Elastic.Clients.Elasticsearch.Mapping -{ - public partial class RangeProperty - { - } -} \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs index 79a7ea670eb..72faf353cdd 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Types/Migration/MigrationFeature.g.cs @@ -29,17 +29,5 @@ public partial class MigrationFeature [JsonInclude] [JsonPropertyName("feature_name")] public string FeatureName { get; init; } - - [JsonInclude] - [JsonPropertyName("indices")] - public IReadOnlyCollection Indices { get; init; } - - [JsonInclude] - [JsonPropertyName("migration_status")] - public Elastic.Clients.Elasticsearch.Migration.MigrationStatus MigrationStatus { get; init; } - - [JsonInclude] - [JsonPropertyName("minimum_index_version")] - public string MinimumIndexVersion { get; init; } } } \ No newline at end of file From a8e9434ccd41c5d764d72caeac70e8a49986bb95 Mon Sep 17 00:00:00 2001 From: Steve Gordon Date: Thu, 16 Jun 2022 15:04:10 +0100 Subject: [PATCH 8/8] Updated after code-gen for array based requests --- build/scripts/scripts.fsproj | 1 + .../MultiSearch/MultiSearchRequest.cs | 75 +++------------- .../_Generated/Api/MultiSearchRequest.g.cs | 86 ++++++++++++++++++- .../_Generated/Types/SearchRequestItem.g.cs | 38 -------- .../Multiple/MultiGet/MultiGetApiTests.cs | 2 +- .../MultiSearch/MultiSearchApiTests.cs | 21 ++--- .../Framework/EndpointTests/ApiTestBase.cs | 19 ++++ .../Documents/MSearchSerialization.cs | 4 +- ...iTests.VerifyDescriptorNdJson.verified.txt | 4 + ...Tests.VerifyInitializerNdJson.verified.txt | 4 + 10 files changed, 134 insertions(+), 120 deletions(-) delete mode 100644 src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchRequestItem.g.cs create mode 100644 tests/Tests/_VerifySnapshots/MultiSearchApiTests.VerifyDescriptorNdJson.verified.txt create mode 100644 tests/Tests/_VerifySnapshots/MultiSearchApiTests.VerifyInitializerNdJson.verified.txt diff --git a/build/scripts/scripts.fsproj b/build/scripts/scripts.fsproj index 9d2825096c9..77bedfd1a2f 100644 --- a/build/scripts/scripts.fsproj +++ b/build/scripts/scripts.fsproj @@ -4,6 +4,7 @@ Exe $(NoWarn);NU1701 + true diff --git a/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs b/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs index 760fd4dbfa9..939f89596f4 100644 --- a/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs +++ b/src/Elastic.Clients.Elasticsearch/Types/Documents/MultiSearch/MultiSearchRequest.cs @@ -12,82 +12,27 @@ namespace Elastic.Clients.Elasticsearch { - // STUBBED POC - - public sealed partial class MultiSearchRequestDescriptor : IStreamSerializable + public sealed partial class MultiSearchRequestDescriptor { - // Temporary implementation - TODO - Code gen properly - - private readonly List _searches = new(); - - void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) - { - if (_searches is null) - return; - - foreach (var search in _searches) - { - if (search is IStreamSerializable serializable) - serializable.Serialize(stream, settings, formatting); - } - } - - async Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) - { - if (_searches is null) - return; - - foreach (var search in _searches) - { - if (search is IStreamSerializable serializable) - await serializable.SerializeAsync(stream, settings, formatting).ConfigureAwait(false); - } - } - - public MultiSearchRequestDescriptor AddSearch(RequestItem item) - { - _searches.Add(item); - return this; - } + internal override void BeforeRequest() => TypedKeys(true); + } + public sealed partial class MultiSearchRequestDescriptor + { internal override void BeforeRequest() => TypedKeys(true); } public partial class MultiSearchRequest { - void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) - { - if (Searches is null) - return; - - foreach (var search in Searches) - { - if (search is IStreamSerializable serializable) - serializable.Serialize(stream, settings, formatting); - } - } - - async Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) - { - if (Searches is null) - return; - - foreach (var search in Searches) - { - if (search is IStreamSerializable serializable) - await serializable.SerializeAsync(stream, settings, formatting).ConfigureAwait(false); - } - } - internal override void BeforeRequest() => TypedKeys = true; } - // Will generate as SearchRequestItem - public class RequestItem : IStreamSerializable + // POC - If we have more than one union doing this, can we autogenerate with correct ctors etc. + public class SearchRequestItem : IStreamSerializable { - public RequestItem(MultisearchBody body) => Body = body; + public SearchRequestItem(MultisearchBody body) => Body = body; - public RequestItem(MultisearchHeader header, MultisearchBody body) + public SearchRequestItem(MultisearchHeader header, MultisearchBody body) { Header = header; Body = body; @@ -139,7 +84,7 @@ public partial class ResponseBody public partial class MultiSearchResponse { - public override bool IsValid => base.IsValid && Responses.All(b => b.Item1 is not null && b.Item1.Status == 200); + public override bool IsValid => base.IsValid && (Responses?.All(b => b.Item1 is not null && b.Item1.Status == 200) ?? true); [JsonIgnore] public int TotalResponses => Responses.HasAny() ? Responses.Count() : 0; diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs index b3448419a3b..b947484071d 100644 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs +++ b/src/Elastic.Clients.Elasticsearch/_Generated/Api/MultiSearchRequest.g.cs @@ -18,9 +18,11 @@ using Elastic.Transport; using System; using System.Collections.Generic; +using System.IO; using System.Linq.Expressions; using System.Text.Json; using System.Text.Json.Serialization; +using System.Threading.Tasks; #nullable restore namespace Elastic.Clients.Elasticsearch @@ -114,9 +116,31 @@ public MultiSearchRequest(Elastic.Clients.Elasticsearch.Indices? indices) : base public bool? TypedKeys { get => Q("typed_keys"); set => Q("typed_keys", value); } public List Searches { get; set; } + + void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (Searches is null) + return; + foreach (var item in Searches) + { + if (item is IStreamSerializable serializable) + serializable.Serialize(stream, settings, formatting); + } + } + + async Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (Searches is null) + return; + foreach (var item in Searches) + { + if (item is IStreamSerializable serializable) + await serializable.SerializeAsync(stream, settings, formatting).ConfigureAwait(false); + } + } } - public sealed partial class MultiSearchRequestDescriptor : RequestDescriptorBase, MultiSearchRequestParameters> + public sealed partial class MultiSearchRequestDescriptor : RequestDescriptorBase, MultiSearchRequestParameters>, IStreamSerializable { internal MultiSearchRequestDescriptor(Action> configure) => configure.Invoke(this); public MultiSearchRequestDescriptor() @@ -147,9 +171,38 @@ public MultiSearchRequestDescriptor Indices(Elastic.Clients.Elasticse protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings) { } + + List _items = new(); + void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (_items is null) + return; + foreach (var item in _items) + { + if (item is IStreamSerializable serializable) + serializable.Serialize(stream, settings, formatting); + } + } + + async Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (_items is null) + return; + foreach (var item in _items) + { + if (item is IStreamSerializable serializable) + await serializable.SerializeAsync(stream, settings, formatting).ConfigureAwait(false); + } + } + + public MultiSearchRequestDescriptor AddSearch(SearchRequestItem search) + { + _items.Add(search); + return this; + } } - public sealed partial class MultiSearchRequestDescriptor : RequestDescriptorBase + public sealed partial class MultiSearchRequestDescriptor : RequestDescriptorBase, IStreamSerializable { internal MultiSearchRequestDescriptor(Action configure) => configure.Invoke(this); public MultiSearchRequestDescriptor() @@ -180,5 +233,34 @@ public MultiSearchRequestDescriptor Indices(Elastic.Clients.Elasticsearch.Indice protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions options, IElasticsearchClientSettings settings) { } + + List _items = new(); + void IStreamSerializable.Serialize(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (_items is null) + return; + foreach (var item in _items) + { + if (item is IStreamSerializable serializable) + serializable.Serialize(stream, settings, formatting); + } + } + + async Task IStreamSerializable.SerializeAsync(Stream stream, IElasticsearchClientSettings settings, SerializationFormatting formatting) + { + if (_items is null) + return; + foreach (var item in _items) + { + if (item is IStreamSerializable serializable) + await serializable.SerializeAsync(stream, settings, formatting).ConfigureAwait(false); + } + } + + public MultiSearchRequestDescriptor AddSearch(SearchRequestItem search) + { + _items.Add(search); + return this; + } } } \ No newline at end of file diff --git a/src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchRequestItem.g.cs b/src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchRequestItem.g.cs deleted file mode 100644 index 5300a8385e0..00000000000 --- a/src/Elastic.Clients.Elasticsearch/_Generated/Types/SearchRequestItem.g.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Licensed to Elasticsearch B.V under one or more agreements. -// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. -// See the LICENSE file in the project root for more information. -// -// ███╗ ██╗ ██████╗ ████████╗██╗ ██████╗███████╗ -// ████╗ ██║██╔═══██╗╚══██╔══╝██║██╔════╝██╔════╝ -// ██╔██╗ ██║██║ ██║ ██║ ██║██║ █████╗ -// ██║╚██╗██║██║ ██║ ██║ ██║██║ ██╔══╝ -// ██║ ╚████║╚██████╔╝ ██║ ██║╚██████╗███████╗ -// ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ -// ------------------------------------------------ -// -// This file is automatically generated. -// Please do not edit these files manually. -// -// ------------------------------------------------ - -using Elastic.Transport; -using System; -using System.Collections.Generic; -using System.Linq.Expressions; -using System.Text.Json; -using System.Text.Json.Serialization; - -#nullable restore -namespace Elastic.Clients.Elasticsearch -{ - public partial class SearchRequestItem : Union - { - public SearchRequestItem(Elastic.Clients.Elasticsearch.MultisearchHeader? item) : base(item) - { - } - - public SearchRequestItem(Elastic.Clients.Elasticsearch.MultisearchBody? item) : base(item) - { - } - } -} \ No newline at end of file diff --git a/tests/Tests/Document/Multiple/MultiGet/MultiGetApiTests.cs b/tests/Tests/Document/Multiple/MultiGet/MultiGetApiTests.cs index 138473ad5e8..6216b6aff5d 100644 --- a/tests/Tests/Document/Multiple/MultiGet/MultiGetApiTests.cs +++ b/tests/Tests/Document/Multiple/MultiGet/MultiGetApiTests.cs @@ -10,7 +10,7 @@ using Tests.Framework.EndpointTests; using Tests.Framework.EndpointTests.TestState; -namespace Tests.Document.Multiple.MultiGet; +namespace Tests.Document.Multiple; public class MultiGetSimplifiedApiTests : ApiIntegrationTestBase, MultiGetRequestDescriptor, MultiGetRequest> diff --git a/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs b/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs index 08f7616c9f5..263ae526efa 100644 --- a/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs +++ b/tests/Tests/Document/Multiple/MultiSearch/MultiSearchApiTests.cs @@ -11,7 +11,7 @@ using Tests.Framework.EndpointTests; using Tests.Framework.EndpointTests.TestState; -namespace Tests.Document.Multiple.MultiGet; +namespace Tests.Document.Multiple; public class MultiSearchApiTests : ApiIntegrationTestBase, MultiSearchRequestDescriptor, MultiSearchRequest> @@ -20,15 +20,17 @@ public MultiSearchApiTests(ReadOnlyCluster cluster, EndpointUsage usage) : base( protected override bool ExpectIsValid => true; - protected override bool VerifyJson => true; + protected override bool SupportsDeserialization => false; + + protected override bool VerifyNdJson => true; protected override int ExpectStatusCode => 200; // TODO - Fluent API improvements after POC code-gen protected override Action> Fluent => d => d .Indices(Infer.Index()) // TODO - Should support fluent verion and ctor with Indices - .AddSearch(new RequestItem(new MultisearchBody { From = 0, Size = 10, Query = new MatchAllQuery() })) - .AddSearch(new RequestItem(new MultisearchBody { From = 0, Size = 1, Query = new MatchAllQuery() })); + .AddSearch(new SearchRequestItem(new MultisearchBody { From = 0, Size = 10, Query = new MatchAllQuery() })) + .AddSearch(new SearchRequestItem(new MultisearchBody { From = 0, Size = 1, Query = new MatchAllQuery() })); protected override HttpMethod HttpMethod => HttpMethod.POST; @@ -36,15 +38,12 @@ public MultiSearchApiTests(ReadOnlyCluster cluster, EndpointUsage usage) : base( { Searches = new List { - // TODO after code-gen - //new RequestItem(new MultisearchBody { From = 0, Size = 10, Query = new MatchAllQuery() }), - //new RequestItem(new MultisearchBody { From = 0, Size = 1, Query = new MatchAllQuery() }) + new SearchRequestItem(new MultisearchBody { From = 0, Size = 10, Query = new MatchAllQuery() }), + new SearchRequestItem(new MultisearchBody { From = 0, Size = 1, Query = new MatchAllQuery() }) } }; - protected override bool SupportsDeserialization => false; - - protected override string ExpectedUrlPathAndQuery => "/projects/_mget"; + protected override string ExpectedUrlPathAndQuery => "/project/_msearch"; protected override LazyResponses ClientUsage() => Calls( (client, f) => client.MultiSearch(f), @@ -67,7 +66,5 @@ protected override void ExpectResponse(MultiSearchResponse response) lastResults.Should().NotBeNull(); lastResults.Total.Should().Be(100); lastResults.Documents.Should().HaveCount(1); - - // TODO - More assertions } } diff --git a/tests/Tests/Framework/EndpointTests/ApiTestBase.cs b/tests/Tests/Framework/EndpointTests/ApiTestBase.cs index 1ea239911df..4626c50b526 100644 --- a/tests/Tests/Framework/EndpointTests/ApiTestBase.cs +++ b/tests/Tests/Framework/EndpointTests/ApiTestBase.cs @@ -27,6 +27,7 @@ public abstract class ApiTestBase { - //new SearchRequestItem(new MultisearchHeader { Index = Infer.Index() }, new MultisearchBody { From = 0, Query = new MatchAllQuery() }), - //new SearchRequestItem(new MultisearchHeader { Index = Infer.Index() }, new MultisearchBody { From = 0, Query = new MatchAllQuery() }) + new SearchRequestItem(new MultisearchHeader { Index = Infer.Index() }, new MultisearchBody { From = 0, Query = new MatchAllQuery() }), + new SearchRequestItem(new MultisearchHeader { Index = Infer.Index() }, new MultisearchBody { From = 0, Query = new MatchAllQuery() }) } }; diff --git a/tests/Tests/_VerifySnapshots/MultiSearchApiTests.VerifyDescriptorNdJson.verified.txt b/tests/Tests/_VerifySnapshots/MultiSearchApiTests.VerifyDescriptorNdJson.verified.txt new file mode 100644 index 00000000000..e63d01dd08f --- /dev/null +++ b/tests/Tests/_VerifySnapshots/MultiSearchApiTests.VerifyDescriptorNdJson.verified.txt @@ -0,0 +1,4 @@ +null +{"from":0,"query":{"match_all":{}},"size":10} +null +{"from":0,"query":{"match_all":{}},"size":1} diff --git a/tests/Tests/_VerifySnapshots/MultiSearchApiTests.VerifyInitializerNdJson.verified.txt b/tests/Tests/_VerifySnapshots/MultiSearchApiTests.VerifyInitializerNdJson.verified.txt new file mode 100644 index 00000000000..e63d01dd08f --- /dev/null +++ b/tests/Tests/_VerifySnapshots/MultiSearchApiTests.VerifyInitializerNdJson.verified.txt @@ -0,0 +1,4 @@ +null +{"from":0,"query":{"match_all":{}},"size":10} +null +{"from":0,"query":{"match_all":{}},"size":1}