Skip to content

[Backport 8.2] Name and namespace cleanup #6773

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
Oct 17, 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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -8,82 +8,87 @@
using System.Reflection;
using Elastic.Clients.Elasticsearch;
using Elastic.Clients.Elasticsearch.QueryDsl;
using Elastic.Clients.Elasticsearch.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using JsonProperty = Newtonsoft.Json.Serialization.JsonProperty;

namespace Elastic.Clients.JsonNetSerializer
namespace Elastic.Clients.Elasticsearch.JsonNetSerializer;

public class ConnectionSettingsAwareContractResolver : DefaultContractResolver
{
public class ConnectionSettingsAwareContractResolver : DefaultContractResolver
public ConnectionSettingsAwareContractResolver(IElasticsearchClientSettings connectionSettings) =>
ConnectionSettings = connectionSettings ?? throw new ArgumentNullException(nameof(connectionSettings));

protected IElasticsearchClientSettings ConnectionSettings { get; }

protected override string ResolvePropertyName(string fieldName) =>
ConnectionSettings.DefaultFieldNameInferrer != null
? ConnectionSettings.DefaultFieldNameInferrer(fieldName)
: base.ResolvePropertyName(fieldName);

protected override JsonContract CreateContract(Type objectType)
{
var contract = base.CreateContract(objectType);
if (objectType.IsEnum && objectType.GetCustomAttribute<StringEnumAttribute>() != null)
contract.Converter = new StringEnumConverter();

return contract;
}

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
ApplyShouldSerializer(property);
ApplyPropertyOverrides(member, property);
return property;
}

/// <summary> Renames/Ignores a property based on the connection settings mapping or custom attributes for the property </summary>
private void ApplyPropertyOverrides(MemberInfo member, JsonProperty property)
{
//if (!ConnectionSettings.PropertyMappings.TryGetValue(member, out var propertyMapping))
// propertyMapping = ElasticsearchPropertyAttributeBase.From(member);

var serializerMapping = ConnectionSettings.PropertyMappingProvider?.CreatePropertyMapping(member);

var nameOverride = /*propertyMapping?.Name ??*/ serializerMapping?.Name;
if (!string.IsNullOrWhiteSpace(nameOverride))
property.PropertyName = nameOverride;

var overrideIgnore = /*propertyMapping?.Ignore ??*/ serializerMapping?.Ignore;
if (overrideIgnore.HasValue)
property.Ignored = overrideIgnore.Value;
}

private static void ApplyShouldSerializer(JsonProperty property)
{
if (property.PropertyType == typeof(QueryContainer))
property.ShouldSerialize = o => ShouldSerializeQueryContainer(o, property);
else if (property.PropertyType == typeof(IEnumerable<QueryContainer>))
property.ShouldSerialize = o => ShouldSerializeQueryContainers(o, property);
}

private static bool ShouldSerializeQueryContainer(object o, JsonProperty prop)
{
if (o == null)
return false;
if (prop.ValueProvider.GetValue(o) is not QueryContainer q)
return false;
//return q.IsWritable;
return true;
}

private static bool ShouldSerializeQueryContainers(object o, JsonProperty prop)
{
public ConnectionSettingsAwareContractResolver(IElasticsearchClientSettings connectionSettings) =>
ConnectionSettings = connectionSettings ?? throw new ArgumentNullException(nameof(connectionSettings));

protected IElasticsearchClientSettings ConnectionSettings { get; }

protected override string ResolvePropertyName(string fieldName) =>
ConnectionSettings.DefaultFieldNameInferrer != null
? ConnectionSettings.DefaultFieldNameInferrer(fieldName)
: base.ResolvePropertyName(fieldName);

protected override JsonContract CreateContract(Type objectType)
{
var contract = base.CreateContract(objectType);
if (objectType.IsEnum && objectType.GetCustomAttribute<StringEnumAttribute>() != null)
contract.Converter = new StringEnumConverter();

return contract;
}

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
ApplyShouldSerializer(property);
ApplyPropertyOverrides(member, property);
return property;
}

/// <summary> Renames/Ignores a property based on the connection settings mapping or custom attributes for the property </summary>
private void ApplyPropertyOverrides(MemberInfo member, JsonProperty property)
{
//if (!ConnectionSettings.PropertyMappings.TryGetValue(member, out var propertyMapping))
// propertyMapping = ElasticsearchPropertyAttributeBase.From(member);

var serializerMapping = ConnectionSettings.PropertyMappingProvider?.CreatePropertyMapping(member);

var nameOverride = /*propertyMapping?.Name ??*/ serializerMapping?.Name;
if (!string.IsNullOrWhiteSpace(nameOverride)) property.PropertyName = nameOverride;

var overrideIgnore = /*propertyMapping?.Ignore ??*/ serializerMapping?.Ignore;
if (overrideIgnore.HasValue)
property.Ignored = overrideIgnore.Value;
}

private static void ApplyShouldSerializer(JsonProperty property)
{
if (property.PropertyType == typeof(QueryContainer))
property.ShouldSerialize = o => ShouldSerializeQueryContainer(o, property);
else if (property.PropertyType == typeof(IEnumerable<QueryContainer>))
property.ShouldSerialize = o => ShouldSerializeQueryContainers(o, property);
}

private static bool ShouldSerializeQueryContainer(object o, JsonProperty prop)
{
if (o == null) return false;
if (prop.ValueProvider.GetValue(o) is not QueryContainer q) return false;
//return q.IsWritable;
return true;
}

private static bool ShouldSerializeQueryContainers(object o, JsonProperty prop)
{
if (o == null) return false;
if (prop.ValueProvider.GetValue(o) is not IEnumerable<QueryContainer> q) return false;

var queryContainers = q as QueryContainer[] ?? q.ToArray();
//return queryContainers.Any(qq => qq != null && ((QueryContainer)qq).IsWritable);
return queryContainers.Any(qq => qq != null);
}
if (o == null)
return false;
if (prop.ValueProvider.GetValue(o) is not IEnumerable<QueryContainer> q)
return false;

var queryContainers = q as QueryContainer[] ?? q.ToArray();
//return queryContainers.Any(qq => qq != null && ((QueryContainer)qq).IsWritable);
return queryContainers.Any(qq => qq != null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
using Elastic.Transport;
using Newtonsoft.Json;

namespace Elastic.Clients.JsonNetSerializer
namespace Elastic.Clients.Elasticsearch.JsonNetSerializer
{
public abstract partial class ConnectionSettingsAwareSerializer : Serializer
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
using Elastic.Clients.Elasticsearch;
using Newtonsoft.Json;

namespace Elastic.Clients.JsonNetSerializer
namespace Elastic.Clients.Elasticsearch.JsonNetSerializer
{
public abstract partial class ConnectionSettingsAwareSerializer : IPropertyMappingProvider
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,77 +5,75 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Elastic.Clients.JsonNetSerializer.Converters;
using Newtonsoft.Json;
using Elastic.Transport;
using Elastic.Clients.Elasticsearch;
using Newtonsoft.Json.Converters;
using Elastic.Clients.Elasticsearch.JsonNetSerializer.Converters;

namespace Elastic.Clients.JsonNetSerializer
namespace Elastic.Clients.Elasticsearch.JsonNetSerializer;

public abstract partial class ConnectionSettingsAwareSerializer
{
public abstract partial class ConnectionSettingsAwareSerializer
protected ConnectionSettingsAwareSerializer(Serializer builtinSerializer, IElasticsearchClientSettings connectionSettings)
: this(builtinSerializer, connectionSettings, null, null, null) { }

internal ConnectionSettingsAwareSerializer(
Serializer builtinSerializer,
IElasticsearchClientSettings connectionSettings,
Func<JsonSerializerSettings> jsonSerializerSettingsFactory,
Action<ConnectionSettingsAwareContractResolver> modifyContractResolver,
IEnumerable<JsonConverter> contractJsonConverters
)
{
protected ConnectionSettingsAwareSerializer(Serializer builtinSerializer, IElasticsearchClientSettings connectionSettings)
: this(builtinSerializer, connectionSettings, null, null, null) { }
JsonSerializerSettingsFactory = jsonSerializerSettingsFactory;
ModifyContractResolverCallback = modifyContractResolver;
ContractJsonConverters = contractJsonConverters ?? Enumerable.Empty<JsonConverter>();

internal ConnectionSettingsAwareSerializer(
Serializer builtinSerializer,
IElasticsearchClientSettings connectionSettings,
Func<JsonSerializerSettings> jsonSerializerSettingsFactory,
Action<ConnectionSettingsAwareContractResolver> modifyContractResolver,
IEnumerable<JsonConverter> contractJsonConverters
)
ConnectionSettings = connectionSettings;
BuiltinSerializer = builtinSerializer;
Converters = new List<JsonConverter>
{
JsonSerializerSettingsFactory = jsonSerializerSettingsFactory;
ModifyContractResolverCallback = modifyContractResolver;
ContractJsonConverters = contractJsonConverters ?? Enumerable.Empty<JsonConverter>();

ConnectionSettings = connectionSettings;
BuiltinSerializer = builtinSerializer;
Converters = new List<JsonConverter>
{
new HandleNestTypesOnSourceJsonConverter(BuiltinSerializer, connectionSettings.MemoryStreamFactory),
new TimeSpanToStringConverter(),
new StringEnumConverter()
};
_serializer = CreateSerializer(SerializationFormatting.Indented);
_collapsedSerializer = CreateSerializer(SerializationFormatting.None);
}
new HandleNestTypesOnSourceJsonConverter(BuiltinSerializer, connectionSettings.MemoryStreamFactory),
new TimeSpanToStringConverter(),
new StringEnumConverter()
};
_serializer = CreateSerializer(SerializationFormatting.Indented);
_collapsedSerializer = CreateSerializer(SerializationFormatting.None);
}

protected Serializer BuiltinSerializer { get; }
protected Serializer BuiltinSerializer { get; }

protected IElasticsearchClientSettings ConnectionSettings { get; }
protected IEnumerable<JsonConverter> ContractJsonConverters { get; }
protected Func<JsonSerializerSettings> JsonSerializerSettingsFactory { get; }
protected Action<ConnectionSettingsAwareContractResolver> ModifyContractResolverCallback { get; }
protected IElasticsearchClientSettings ConnectionSettings { get; }
protected IEnumerable<JsonConverter> ContractJsonConverters { get; }
protected Func<JsonSerializerSettings> JsonSerializerSettingsFactory { get; }
protected Action<ConnectionSettingsAwareContractResolver> ModifyContractResolverCallback { get; }

private List<JsonConverter> Converters { get; }
private List<JsonConverter> Converters { get; }

private JsonSerializer CreateSerializer(SerializationFormatting formatting)
{
var s = CreateJsonSerializerSettings() ?? new JsonSerializerSettings();
var converters = CreateJsonConverters() ?? Enumerable.Empty<JsonConverter>();
var contract = CreateContractResolver();
s.Formatting = formatting == SerializationFormatting.Indented ? Formatting.Indented : Formatting.None;
s.ContractResolver = contract;
foreach (var converter in converters.Concat(Converters))
s.Converters.Add(converter);
private JsonSerializer CreateSerializer(SerializationFormatting formatting)
{
var s = CreateJsonSerializerSettings() ?? new JsonSerializerSettings();
var converters = CreateJsonConverters() ?? Enumerable.Empty<JsonConverter>();
var contract = CreateContractResolver();
s.Formatting = formatting == SerializationFormatting.Indented ? Formatting.Indented : Formatting.None;
s.ContractResolver = contract;
foreach (var converter in converters.Concat(Converters))
s.Converters.Add(converter);

return JsonSerializer.Create(s);
}
return JsonSerializer.Create(s);
}

protected virtual ConnectionSettingsAwareContractResolver CreateContractResolver()
{
var contract = new ConnectionSettingsAwareContractResolver(ConnectionSettings);
ModifyContractResolver(contract);
return contract;
}
protected virtual ConnectionSettingsAwareContractResolver CreateContractResolver()
{
var contract = new ConnectionSettingsAwareContractResolver(ConnectionSettings);
ModifyContractResolver(contract);
return contract;
}

protected virtual JsonSerializerSettings CreateJsonSerializerSettings() => JsonSerializerSettingsFactory?.Invoke();
protected virtual JsonSerializerSettings CreateJsonSerializerSettings() => JsonSerializerSettingsFactory?.Invoke();

protected virtual IEnumerable<JsonConverter> CreateJsonConverters() => ContractJsonConverters;
protected virtual IEnumerable<JsonConverter> CreateJsonConverters() => ContractJsonConverters;

protected virtual void ModifyContractResolver(ConnectionSettingsAwareContractResolver resolver) =>
ModifyContractResolverCallback?.Invoke(resolver);
}
protected virtual void ModifyContractResolver(ConnectionSettingsAwareContractResolver resolver) =>
ModifyContractResolverCallback?.Invoke(resolver);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Elastic.Clients.JsonNetSerializer.Converters
namespace Elastic.Clients.Elasticsearch.JsonNetSerializer.Converters
{
public class HandleNestTypesOnSourceJsonConverter : JsonConverter
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
using System;
using Newtonsoft.Json;

namespace Elastic.Clients.JsonNetSerializer.Converters
namespace Elastic.Clients.Elasticsearch.JsonNetSerializer.Converters
{
/// <summary>
/// Included for compatibility reasons
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Elastic.Clients.JsonNetSerializer
namespace Elastic.Clients.Elasticsearch.JsonNetSerializer
{
internal static class JTokenExtensions
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
using Elastic.Transport;
using Elastic.Clients.Elasticsearch;
using Newtonsoft.Json;
using Elastic.Clients.Elasticsearch.JsonNetSerializer;

namespace Elastic.Clients.JsonNetSerializer
namespace Elastic.Clients.Elasticsearch.JsonNetSerializer
{
public class JsonNetSerializer : ConnectionSettingsAwareSerializer
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Elastic.Clients.JsonNetSerializer
namespace Elastic.Clients.Elasticsearch.JsonNetSerializer
{
internal static class JsonReaderExtensions
{
Expand Down
4 changes: 3 additions & 1 deletion src/Elastic.Clients.Elasticsearch/Api/BulkRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
using System.Collections.Generic;
using System.Linq;
using Elastic.Clients.Elasticsearch.Core.Bulk;
using Elastic.Clients.Elasticsearch.Serialization;
using Elastic.Clients.Elasticsearch.Requests;

namespace Elastic.Clients.Elasticsearch
{
Expand Down Expand Up @@ -107,7 +109,7 @@ public BulkRequestDescriptor Index<TSource>(TSource document, IndexName index, A
return this;
}

public BulkRequestDescriptor Update(BulkUpdateOperationBase update)
public BulkRequestDescriptor Update(BulkUpdateOperation update)
{
_operations.Add(update);
return this;
Expand Down
6 changes: 3 additions & 3 deletions src/Elastic.Clients.Elasticsearch/Api/BulkResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ namespace Elastic.Clients.Elasticsearch
public partial class BulkResponse
{
[JsonConverter(typeof(BulkResponseItemConverter)), JsonPropertyName("items")]
public IReadOnlyList<BulkResponseItemBase> Items { get; init; }
public IReadOnlyList<ResponseItem> Items { get; init; }

[JsonIgnore]
public IEnumerable<BulkResponseItemBase> ItemsWithErrors => !Items.HasAny()
? Enumerable.Empty<BulkResponseItemBase>()
public IEnumerable<ResponseItem> ItemsWithErrors => !Items.HasAny()
? Enumerable.Empty<ResponseItem>()
: Items.Where(i => !i.IsValid);

public override bool IsValid => base.IsValid && !Errors && !ItemsWithErrors.HasAny();
Expand Down
1 change: 1 addition & 0 deletions src/Elastic.Clients.Elasticsearch/Api/CreateRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// 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 Elastic.Clients.Elasticsearch.Serialization;
using Elastic.Transport;
using System.Text.Json;

Expand Down
Loading