diff --git a/src/Nest/CommonAbstractions/Request/RouteValues.cs b/src/Nest/CommonAbstractions/Request/RouteValues.cs index 7f482761fe6..ba6562aaf00 100644 --- a/src/Nest/CommonAbstractions/Request/RouteValues.cs +++ b/src/Nest/CommonAbstractions/Request/RouteValues.cs @@ -10,24 +10,30 @@ namespace Nest { internal class ResolvedRouteValues : Dictionary { + internal static ResolvedRouteValues Empty = new(0); + public ResolvedRouteValues(int size) : base(size) { } } public class RouteValues : Dictionary { - // Not too happy with this, only exists because IndexRequest needs a resolved - // id to know if it has to send a PUT or POST. - internal ResolvedRouteValues Resolved { get; private set; } + /// + /// Used specifically by index requests to determine whether to use PUT or POST. + /// + internal bool ContainsId { get; private set;} internal ResolvedRouteValues Resolve(IConnectionSettingsValues configurationValues) { - var resolved = new ResolvedRouteValues(); + if (Count == 0) return ResolvedRouteValues.Empty; + + var resolved = new ResolvedRouteValues(Count); foreach (var kv in this) { var value = this[kv.Key].GetString(configurationValues); - if (!value.IsNullOrEmpty()) resolved[kv.Key] = value; + if (value.IsNullOrEmpty()) continue; + resolved[kv.Key] = value; + if (IsId(kv.Key)) ContainsId = true; } - Resolved = resolved; return resolved; } @@ -36,19 +42,20 @@ private RouteValues Route(string name, IUrlParameter routeValue, bool required = switch (routeValue) { case null when !required: { if (!ContainsKey(name)) return this; - Remove(name); - Resolved = null; //invalidate cache + if (IsId(name)) ContainsId = false; // invalidate cache return this; } case null: throw new ArgumentNullException(name, $"{name} is required to build a url to this API"); default: this[name] = routeValue; - Resolved = null; //invalidate cache + if (IsId(name)) ContainsId = false; // invalidate cache return this; } } + private static bool IsId(string key) => key.Equals("id", StringComparison.OrdinalIgnoreCase); + internal RouteValues Required(string route, IUrlParameter value) => Route(route, value); internal RouteValues Optional(string route, IUrlParameter value) => Route(route, value, false); diff --git a/src/Nest/Document/Single/Index/IndexRequest.cs b/src/Nest/Document/Single/Index/IndexRequest.cs index 061da062a98..3d3e409cc1e 100644 --- a/src/Nest/Document/Single/Index/IndexRequest.cs +++ b/src/Nest/Document/Single/Index/IndexRequest.cs @@ -26,7 +26,7 @@ void IProxyRequest.WriteJson(IElasticsearchSerializer sourceSerializer, Stream s sourceSerializer.Serialize(Document, stream, formatting); internal static HttpMethod GetHttpMethod(IIndexRequest request) => - request.Id?.StringOrLongValue != null || (request.RouteValues.Resolved?.ContainsKey("id") ?? false) ? HttpMethod.PUT : HttpMethod.POST; + request.Id?.StringOrLongValue != null || request.RouteValues.ContainsId ? HttpMethod.PUT : HttpMethod.POST; partial void DocumentFromPath(TDocument document) => Document = document; }