Skip to content

[Backport 8.1] Fix MGet Ids and Docs serialization #6534

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 14, 2022
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
69 changes: 64 additions & 5 deletions src/Elastic.Clients.Elasticsearch/Common/Infer/Id/Ids.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,32 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using Elastic.Transport;

namespace Elastic.Clients.Elasticsearch
{
[DebuggerDisplay("{DebugDisplay,nq}")]
[JsonConverter(typeof(IdsConverter))]
public partial class Ids : IUrlParameter, IEquatable<Ids>
{
private readonly List<string> _ids;
private readonly IList<Id> _ids;

public Ids(IEnumerable<string> value) => _ids = value?.ToList();
public Ids(IEnumerable<Id> ids) => _ids = ids.ToList();

public Ids(IList<Id> ids) => _ids = ids;

public Ids(IEnumerable<string> ids) => _ids = ids?.Select(i => new Id(i)).ToList();

public Ids(string value)
{
if (!value.IsNullOrEmptyCommaSeparatedList(out var arr))
_ids = arr.ToList();
_ids = arr.Select(i => new Id(i)).ToList();
}

internal IList<Id> IdsToSerialize => _ids;

private string DebugDisplay => ((IUrlParameter)this).GetString(null);

public bool Equals(Ids other)
Expand All @@ -38,8 +47,15 @@ public bool Equals(Ids other)
_ids.OrderBy(id => id).SequenceEqual(other._ids.OrderBy(id => id));
}

string IUrlParameter.GetString(ITransportConfiguration? settings) =>
string.Join(",", _ids ?? Enumerable.Empty<string>());
string IUrlParameter.GetString(ITransportConfiguration? settings)
{
if (settings is not ElasticsearchClientSettings elasticsearchClientSettings)
{
throw new Exception("Unexpected settings type.");
}

return string.Join(",", _ids.Select(i => i.GetString(elasticsearchClientSettings)) ?? Enumerable.Empty<string>());
}

public override string ToString() => DebugDisplay;

Expand Down Expand Up @@ -68,4 +84,47 @@ public override int GetHashCode()

public static bool operator !=(Ids left, Ids right) => !Equals(left, right);
}

internal sealed class IdsConverter : JsonConverter<Ids>
{
private readonly IElasticsearchClientSettings _settings;

public IdsConverter(IElasticsearchClientSettings settings) => _settings = settings;

public override Ids? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType != JsonTokenType.StartArray)
throw new JsonException($"Unexpected JSON token. Expected {JsonTokenType.StartArray} but read {reader.TokenType}");

var ids = new List<Id>();

while (reader.Read() && reader.TokenType != JsonTokenType.EndArray)
{
var id = JsonSerializer.Deserialize<Id>(ref reader, options);

if (id is not null)
ids.Add(id);
}

return new Ids(ids);
}

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

writer.WriteStartArray();

foreach (var id in value.IdsToSerialize)
{
JsonSerializer.Serialize<Id>(writer, id, options);
}

writer.WriteEndArray();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ public DefaultRequestResponseSerializer(IElasticsearchClientSettings settings)
new SelfTwoWaySerializableConverterFactory(settings),
new IndicesJsonConverter(settings),
new PropertyNameConverter(settings),
new IdsConverter(settings),
new IsADictionaryConverter(),
new ResponseItemConverterFactory(),
new UnionConverter(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public DefaultSourceSerializer(IElasticsearchClientSettings settings, JsonSerial
new PropertyNameConverter(settings),
new JoinFieldConverter(settings),
new LazyDocumentConverter(settings),
new IdsConverter(settings)
},
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -978,12 +978,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (DocvalueFieldsDescriptor is not null)
{
writer.WritePropertyName("docvalue_fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, DocvalueFieldsDescriptor, options);
writer.WriteEndArray();
}
else if (DocvalueFieldsDescriptorAction is not null)
{
writer.WritePropertyName("docvalue_fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor<TDocument>(DocvalueFieldsDescriptorAction), options);
writer.WriteEndArray();
}
else if (DocvalueFieldsDescriptorActions is not null)
{
Expand All @@ -1005,12 +1009,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (FieldsDescriptor is not null)
{
writer.WritePropertyName("fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, FieldsDescriptor, options);
writer.WriteEndArray();
}
else if (FieldsDescriptorAction is not null)
{
writer.WritePropertyName("fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor<TDocument>(FieldsDescriptorAction), options);
writer.WriteEndArray();
}
else if (FieldsDescriptorActions is not null)
{
Expand Down Expand Up @@ -1080,12 +1088,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (RescoreDescriptor is not null)
{
writer.WritePropertyName("rescore");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, RescoreDescriptor, options);
writer.WriteEndArray();
}
else if (RescoreDescriptorAction is not null)
{
writer.WritePropertyName("rescore");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new RescoreDescriptor<TDocument>(RescoreDescriptorAction), options);
writer.WriteEndArray();
}
else if (RescoreDescriptorActions is not null)
{
Expand Down Expand Up @@ -1892,12 +1904,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (DocvalueFieldsDescriptor is not null)
{
writer.WritePropertyName("docvalue_fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, DocvalueFieldsDescriptor, options);
writer.WriteEndArray();
}
else if (DocvalueFieldsDescriptorAction is not null)
{
writer.WritePropertyName("docvalue_fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor(DocvalueFieldsDescriptorAction), options);
writer.WriteEndArray();
}
else if (DocvalueFieldsDescriptorActions is not null)
{
Expand All @@ -1919,12 +1935,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (FieldsDescriptor is not null)
{
writer.WritePropertyName("fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, FieldsDescriptor, options);
writer.WriteEndArray();
}
else if (FieldsDescriptorAction is not null)
{
writer.WritePropertyName("fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor(FieldsDescriptorAction), options);
writer.WriteEndArray();
}
else if (FieldsDescriptorActions is not null)
{
Expand Down Expand Up @@ -1994,12 +2014,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (RescoreDescriptor is not null)
{
writer.WritePropertyName("rescore");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, RescoreDescriptor, options);
writer.WriteEndArray();
}
else if (RescoreDescriptorAction is not null)
{
writer.WritePropertyName("rescore");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new RescoreDescriptor(RescoreDescriptorAction), options);
writer.WriteEndArray();
}
else if (RescoreDescriptorActions is not null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,12 +140,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (CommandsDescriptor is not null)
{
writer.WritePropertyName("commands");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, CommandsDescriptor, options);
writer.WriteEndArray();
}
else if (CommandsDescriptorAction is not null)
{
writer.WritePropertyName("commands");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new CommandDescriptor(CommandsDescriptorAction), options);
writer.WriteEndArray();
}
else if (CommandsDescriptorActions is not null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -343,12 +343,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (FieldsDescriptor is not null)
{
writer.WritePropertyName("fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, FieldsDescriptor, options);
writer.WriteEndArray();
}
else if (FieldsDescriptorAction is not null)
{
writer.WritePropertyName("fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor<TDocument>(FieldsDescriptorAction), options);
writer.WriteEndArray();
}
else if (FieldsDescriptorActions is not null)
{
Expand All @@ -370,12 +374,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (FilterDescriptor is not null)
{
writer.WritePropertyName("filter");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, FilterDescriptor, options);
writer.WriteEndArray();
}
else if (FilterDescriptorAction is not null)
{
writer.WritePropertyName("filter");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new QueryDsl.QueryContainerDescriptor<TDocument>(FilterDescriptorAction), options);
writer.WriteEndArray();
}
else if (FilterDescriptorActions is not null)
{
Expand Down Expand Up @@ -715,12 +723,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (FieldsDescriptor is not null)
{
writer.WritePropertyName("fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, FieldsDescriptor, options);
writer.WriteEndArray();
}
else if (FieldsDescriptorAction is not null)
{
writer.WritePropertyName("fields");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new QueryDsl.FieldAndFormatDescriptor(FieldsDescriptorAction), options);
writer.WriteEndArray();
}
else if (FieldsDescriptorActions is not null)
{
Expand All @@ -742,12 +754,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (FilterDescriptor is not null)
{
writer.WritePropertyName("filter");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, FilterDescriptor, options);
writer.WriteEndArray();
}
else if (FilterDescriptorAction is not null)
{
writer.WritePropertyName("filter");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new QueryDsl.QueryContainerDescriptor(FilterDescriptorAction), options);
writer.WriteEndArray();
}
else if (FilterDescriptorActions is not null)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,12 +276,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (VerticesDescriptor is not null)
{
writer.WritePropertyName("vertices");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, VerticesDescriptor, options);
writer.WriteEndArray();
}
else if (VerticesDescriptorAction is not null)
{
writer.WritePropertyName("vertices");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new VertexDefinitionDescriptor<TDocument>(VerticesDescriptorAction), options);
writer.WriteEndArray();
}
else if (VerticesDescriptorActions is not null)
{
Expand Down Expand Up @@ -514,12 +518,16 @@ protected override void Serialize(Utf8JsonWriter writer, JsonSerializerOptions o
if (VerticesDescriptor is not null)
{
writer.WritePropertyName("vertices");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, VerticesDescriptor, options);
writer.WriteEndArray();
}
else if (VerticesDescriptorAction is not null)
{
writer.WritePropertyName("vertices");
writer.WriteStartArray();
JsonSerializer.Serialize(writer, new VertexDefinitionDescriptor(VerticesDescriptorAction), options);
writer.WriteEndArray();
}
else if (VerticesDescriptorActions is not null)
{
Expand Down
Loading