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
Original file line number Diff line number Diff line change
Expand Up @@ -124,35 +124,6 @@ public sealed partial class BulkRequestParameters : Elastic.Transport.RequestPar
public Elastic.Clients.Elasticsearch.WaitForActiveShards? WaitForActiveShards { get => Q<Elastic.Clients.Elasticsearch.WaitForActiveShards?>("wait_for_active_shards"); set => Q("wait_for_active_shards", value); }
}

internal sealed partial class BulkRequestConverter : System.Text.Json.Serialization.JsonConverter<Elastic.Clients.Elasticsearch.BulkRequest>
{
public override Elastic.Clients.Elasticsearch.BulkRequest Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options)
{
reader.ValidateToken(System.Text.Json.JsonTokenType.StartObject);
while (reader.Read() && reader.TokenType is System.Text.Json.JsonTokenType.PropertyName)
{
if (options.UnmappedMemberHandling is System.Text.Json.Serialization.JsonUnmappedMemberHandling.Skip)
{
reader.Skip();
continue;
}

throw new System.Text.Json.JsonException($"Unknown JSON property '{reader.GetString()}' for type '{typeToConvert.Name}'.");
}

reader.ValidateToken(System.Text.Json.JsonTokenType.EndObject);
return new Elastic.Clients.Elasticsearch.BulkRequest(Elastic.Clients.Elasticsearch.Serialization.JsonConstructorSentinel.Instance)
{
};
}

public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clients.Elasticsearch.BulkRequest value, System.Text.Json.JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WriteEndObject();
}
}

/// <summary>
/// <para>
/// Bulk index or delete documents.
Expand Down Expand Up @@ -352,7 +323,6 @@ public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clien
/// Refer to the linked documentation for step-by-step instructions using the index settings API.
/// </para>
/// </summary>
[System.Text.Json.Serialization.JsonConverter(typeof(Elastic.Clients.Elasticsearch.BulkRequestConverter))]
public partial class BulkRequest : Elastic.Clients.Elasticsearch.Requests.PlainRequest<Elastic.Clients.Elasticsearch.BulkRequestParameters>
{
public BulkRequest(Elastic.Clients.Elasticsearch.IndexName? index) : base(r => r.Optional("index", index))
Expand Down Expand Up @@ -1443,4 +1413,4 @@ public Elastic.Clients.Elasticsearch.BulkRequestDescriptor<TDocument> RequestCon
Instance.RequestConfiguration = configurationSelector.Invoke(Instance.RequestConfiguration is null ? new Elastic.Transport.RequestConfigurationDescriptor() : new Elastic.Transport.RequestConfigurationDescriptor(Instance.RequestConfiguration)) ?? Instance.RequestConfiguration;
return this;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -123,19 +123,6 @@ public sealed partial class MultiSearchRequestParameters : Elastic.Transport.Req
public bool? TypedKeys { get => Q<bool?>("typed_keys"); set => Q("typed_keys", value); }
}

internal sealed partial class MultiSearchRequestConverter : System.Text.Json.Serialization.JsonConverter<Elastic.Clients.Elasticsearch.MultiSearchRequest>
{
public override Elastic.Clients.Elasticsearch.MultiSearchRequest Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options)
{
return new Elastic.Clients.Elasticsearch.MultiSearchRequest(Elastic.Clients.Elasticsearch.Serialization.JsonConstructorSentinel.Instance) { Searches = reader.ReadValue<System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearch.SearchRequestItem>>(options, static System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearch.SearchRequestItem> (ref System.Text.Json.Utf8JsonReader r, System.Text.Json.JsonSerializerOptions o) => r.ReadCollectionValue<Elastic.Clients.Elasticsearch.Core.MSearch.SearchRequestItem>(o, null)!) };
}

public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clients.Elasticsearch.MultiSearchRequest value, System.Text.Json.JsonSerializerOptions options)
{
writer.WriteValue(options, value.Searches, static (System.Text.Json.Utf8JsonWriter w, System.Text.Json.JsonSerializerOptions o, System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearch.SearchRequestItem> v) => w.WriteCollectionValue<Elastic.Clients.Elasticsearch.Core.MSearch.SearchRequestItem>(o, v, null));
}
}

/// <summary>
/// <para>
/// Run multiple searches.
Expand All @@ -159,7 +146,6 @@ public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clien
/// When sending requests to this endpoint the <c>Content-Type</c> header should be set to <c>application/x-ndjson</c>.
/// </para>
/// </summary>
[System.Text.Json.Serialization.JsonConverter(typeof(Elastic.Clients.Elasticsearch.MultiSearchRequestConverter))]
public partial class MultiSearchRequest : Elastic.Clients.Elasticsearch.Requests.PlainRequest<Elastic.Clients.Elasticsearch.MultiSearchRequestParameters>
{
[System.Obsolete("The request contains additional required properties that must be initialized. Please use an alternative constructor to ensure all required values are properly set.")]
Expand Down Expand Up @@ -876,4 +862,4 @@ public Elastic.Clients.Elasticsearch.MultiSearchRequestDescriptor<TDocument> Req
Instance.RequestConfiguration = configurationSelector.Invoke(Instance.RequestConfiguration is null ? new Elastic.Transport.RequestConfigurationDescriptor() : new Elastic.Transport.RequestConfigurationDescriptor(Instance.RequestConfiguration)) ?? Instance.RequestConfiguration;
return this;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,19 +62,6 @@ public sealed partial class MultiSearchTemplateRequestParameters : Elastic.Trans
public bool? TypedKeys { get => Q<bool?>("typed_keys"); set => Q("typed_keys", value); }
}

internal sealed partial class MultiSearchTemplateRequestConverter : System.Text.Json.Serialization.JsonConverter<Elastic.Clients.Elasticsearch.MultiSearchTemplateRequest>
{
public override Elastic.Clients.Elasticsearch.MultiSearchTemplateRequest Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options)
{
return new Elastic.Clients.Elasticsearch.MultiSearchTemplateRequest(Elastic.Clients.Elasticsearch.Serialization.JsonConstructorSentinel.Instance) { SearchTemplates = reader.ReadValue<System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearchTemplate.SearchTemplateRequestItem>>(options, static System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearchTemplate.SearchTemplateRequestItem> (ref System.Text.Json.Utf8JsonReader r, System.Text.Json.JsonSerializerOptions o) => r.ReadCollectionValue<Elastic.Clients.Elasticsearch.Core.MSearchTemplate.SearchTemplateRequestItem>(o, null)!) };
}

public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clients.Elasticsearch.MultiSearchTemplateRequest value, System.Text.Json.JsonSerializerOptions options)
{
writer.WriteValue(options, value.SearchTemplates, static (System.Text.Json.Utf8JsonWriter w, System.Text.Json.JsonSerializerOptions o, System.Collections.Generic.ICollection<Elastic.Clients.Elasticsearch.Core.MSearchTemplate.SearchTemplateRequestItem> v) => w.WriteCollectionValue<Elastic.Clients.Elasticsearch.Core.MSearchTemplate.SearchTemplateRequestItem>(o, v, null));
}
}

/// <summary>
/// <para>
/// Run multiple templated searches.
Expand All @@ -94,7 +81,6 @@ public override void Write(System.Text.Json.Utf8JsonWriter writer, Elastic.Clien
/// $ curl -H "Content-Type: application/x-ndjson" -XGET localhost:9200/_msearch/template --data-binary "@requests"; echo
/// </code>
/// </summary>
[System.Text.Json.Serialization.JsonConverter(typeof(Elastic.Clients.Elasticsearch.MultiSearchTemplateRequestConverter))]
public partial class MultiSearchTemplateRequest : Elastic.Clients.Elasticsearch.Requests.PlainRequest<Elastic.Clients.Elasticsearch.MultiSearchTemplateRequestParameters>
{
[System.Obsolete("The request contains additional required properties that must be initialized. Please use an alternative constructor to ensure all required values are properly set.")]
Expand Down Expand Up @@ -540,4 +526,4 @@ public Elastic.Clients.Elasticsearch.MultiSearchTemplateRequestDescriptor<TDocum
Instance.RequestConfiguration = configurationSelector.Invoke(Instance.RequestConfiguration is null ? new Elastic.Transport.RequestConfigurationDescriptor() : new Elastic.Transport.RequestConfigurationDescriptor(Instance.RequestConfiguration)) ?? Instance.RequestConfiguration;
return this;
}
}
}
2 changes: 2 additions & 0 deletions src/Elastic.Clients.Elasticsearch/_Shared/Api/BulkRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
using Elastic.Clients.Elasticsearch.Serialization;
using Elastic.Clients.Elasticsearch.Requests;
using System.Runtime.InteropServices;
using System.Text.Json.Serialization;

namespace Elastic.Clients.Elasticsearch;

[JsonConverter(typeof(JsonIncompatibleConverter))]
public partial class BulkRequest : IStreamSerializable
{
private static readonly IRequestConfiguration RequestConfigSingleton = new RequestConfiguration
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ public partial class MultiSearchResponse<TDocument>
public int TotalResponses => Responses.Count > 0 ? Responses.Count : 0;
}

public partial class MultiSearchRequest : IStreamSerializable
[JsonConverter(typeof(JsonIncompatibleConverter))]
public partial class MultiSearchRequest :
IStreamSerializable
{
// Any request may contain aggregations so we force `typed_keys` in order to successfully
// deserialize them.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ public partial class MultiSearchTemplateResponse<TDocument>
public int TotalResponses => Responses.Count > 0 ? Responses.Count : 0;
}

public partial class MultiSearchTemplateRequest : IStreamSerializable
[JsonConverter(typeof(JsonIncompatibleConverter))]
public partial class MultiSearchTemplateRequest :
IStreamSerializable
{
internal override void BeforeRequest() => TypedKeys ??= true;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace Elastic.Clients.Elasticsearch.Core.Bulk;

[JsonConverter(typeof(BulkResponseItemConverter))]
[JsonConverter(typeof(Json.BulkResponseItemConverter))]
public abstract partial class ResponseItem
{
public abstract string Operation { get; }
Expand Down
31 changes: 2 additions & 29 deletions src/Elastic.Clients.Elasticsearch/_Shared/Api/SearchRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;

using Elastic.Clients.Elasticsearch.Requests;
Expand Down Expand Up @@ -33,12 +32,12 @@ protected override (string ResolvedUrl, string UrlTemplate, Dictionary<string, s
}
}

[JsonConverter(typeof(SearchRequestOfTConverterFactory))]
[JsonConverter(typeof(Json.SearchRequestOfTConverterFactory))]
public partial class SearchRequest<TInferDocument> : SearchRequest
{
static SearchRequest()
{
DynamicallyAccessed.PublicConstructors(typeof(SearchRequestOfTConverter<TInferDocument>));
DynamicallyAccessed.PublicConstructors(typeof(Json.SearchRequestOfTConverter<TInferDocument>));
}

public SearchRequest(Indices? indices) : base(indices)
Expand All @@ -61,29 +60,3 @@ public SearchRequestDescriptor<TDocument> Pit(string id, Action<Core.Search.Poin
return Pit(configure);
}
}

internal sealed class SearchRequestOfTConverterFactory :
JsonConverterFactory
{
public override bool CanConvert(Type typeToConvert) =>
typeToConvert.IsGenericType && typeToConvert.GetGenericTypeDefinition() == typeof(SearchRequest<>);

public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{
var args = typeToConvert.GetGenericArguments();

#pragma warning disable IL3050
return (JsonConverter)Activator.CreateInstance(typeof(SearchRequestOfTConverter<>).MakeGenericType(args[0]));
#pragma warning restore IL3050
}
}

internal sealed class SearchRequestOfTConverter<T> :
JsonConverter<SearchRequest<T>>
{
public override SearchRequest<T>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
throw new NotSupportedException();

public override void Write(Utf8JsonWriter writer, SearchRequest<T> value, JsonSerializerOptions options) =>
writer.WriteValue(options, (SearchRequest)value);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// 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.Text.Json;
using System.Text.Json.Serialization;

using Elastic.Clients.Elasticsearch.Serialization;

namespace Elastic.Clients.Elasticsearch.Json;

public sealed class SearchRequestOfTConverterFactory :
JsonConverterFactory
{
public override bool CanConvert(Type typeToConvert) =>
typeToConvert.IsGenericType && typeToConvert.GetGenericTypeDefinition() == typeof(SearchRequest<>);

public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{
var args = typeToConvert.GetGenericArguments();

#pragma warning disable IL3050
return (JsonConverter)Activator.CreateInstance(typeof(SearchRequestOfTConverter<>).MakeGenericType(args[0]));
#pragma warning restore IL3050
}
}

public sealed class SearchRequestOfTConverter<T> :
JsonConverter<SearchRequest<T>>
{
public override SearchRequest<T>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
throw new NotSupportedException();

public override void Write(Utf8JsonWriter writer, SearchRequest<T> value, JsonSerializerOptions options) =>
writer.WriteValue(options, (SearchRequest)value);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;

namespace Elastic.Clients.Elasticsearch;

[JsonConverter(typeof(DateMathConverter))]
[JsonConverter(typeof(Json.DateMathConverter))]
public abstract class DateMath
{
private static readonly Regex DateMathRegex =
Expand Down Expand Up @@ -174,26 +173,3 @@ private static void AppendTwoDigitNumber(StringBuilder result, int val)
result.Append((char)('0' + (val % 10)));
}
}

internal sealed class DateMathConverter : JsonConverter<DateMath>
{
public override DateMath? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.String)
return null;

// TODO: Performance - Review potential to avoid allocation on DateTime path and use Span<byte>

var value = reader.GetString();

if (!value.Contains("|") && DateTime.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTime))
return DateMath.Anchored(dateTime);

return DateMath.Anchored(value);
}

public override void Write(Utf8JsonWriter writer, DateMath value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}
Original file line number Diff line number Diff line change
@@ -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.

using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace Elastic.Clients.Elasticsearch.Json;

public sealed class DateMathConverter : JsonConverter<DateMath>
{
public override DateMath? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.String)
return null;

// TODO: Performance - Review potential to avoid allocation on DateTime path and use Span<byte>

var value = reader.GetString();

if (!value.Contains("|") && DateTime.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTime))
return DateMath.Anchored(dateTime);

return DateMath.Anchored(value);
}

public override void Write(Utf8JsonWriter writer, DateMath value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,20 @@
// See the LICENSE file in the project root for more information.

using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace Elastic.Clients.Elasticsearch;

[JsonConverter(typeof(DateMathExpressionConverter))]
[JsonConverter(typeof(Json.DateMathExpressionConverter))]
public class DateMathExpression : DateMath
{
public DateMathExpression(string anchor) : base(anchor) { }
public DateMathExpression(string anchor) : base(anchor)
{
}

public DateMathExpression(DateTime anchor) : base(anchor) { }
public DateMathExpression(DateTime anchor) : base(anchor)
{
}

public DateMathExpression(Union<DateTime, string> anchor, DateMathTime range, DateMathOperation operation)
: base(anchor, range, operation) { }
Expand Down Expand Up @@ -43,33 +45,3 @@ public DateMath RoundTo(DateMathTimeUnit round)
return this;
}
}

internal sealed class DateMathExpressionConverter : JsonConverter<DateMathExpression>
{
public override DateMathExpression? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.String)
return null;

// TODO: Performance - Review potential to avoid allocation on DateTime path and use Span<byte>

var value = reader.GetString();
reader.Read();

if (!value.Contains("|") && DateTime.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTime))
return DateMath.Anchored(dateTime);

return new DateMathExpression(value);
}

public override void Write(Utf8JsonWriter writer, DateMathExpression value, JsonSerializerOptions options)
{
if (value is null)
{
writer.WriteNullValue();
return;
}

writer.WriteStringValue(value.ToString());
}
}
Loading
Loading