Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions src/Nest/CommonAbstractions/Request/RouteValues.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,32 @@

namespace Nest
{
internal class ResolvedRouteValues : Dictionary<string, string> { }
internal class ResolvedRouteValues : Dictionary<string, string>
{
internal static ResolvedRouteValues Empty = new(0);

public ResolvedRouteValues(int size) : base(size) { }
}

public class RouteValues : Dictionary<string, IUrlParameter>
{
// 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; }
/// <summary>
/// Used specifically by index requests to determine whether to use PUT or POST.
/// </summary>
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;
}

Expand All @@ -33,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);
Expand Down
2 changes: 1 addition & 1 deletion src/Nest/Document/Single/Index/IndexRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ void IProxyRequest.WriteJson(ITransportSerializer sourceSerializer, Stream strea
sourceSerializer.Serialize(Document, stream, formatting);

internal static HttpMethod GetHttpMethod(IIndexRequest<TDocument> 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;
}
Expand Down