Skip to content

Commit 9de6fa9

Browse files
authored
added another hook for properties of type object that need optionally flow through the source converter. (#2997)
1 parent 7053097 commit 9de6fa9

File tree

12 files changed

+109
-18
lines changed

12 files changed

+109
-18
lines changed

src/Nest/CommonAbstractions/Extensions/TypeExtensions.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,7 @@ private static ObjectActivator<T> GetActivator<T>(ConstructorInfo ctor)
117117
internal static IList<JsonProperty> GetCachedObjectProperties(this Type t,
118118
MemberSerialization memberSerialization = MemberSerialization.OptIn)
119119
{
120-
IList<JsonProperty> propertyDictionary;
121-
if (CachedTypeProperties.TryGetValue(t, out propertyDictionary))
120+
if (CachedTypeProperties.TryGetValue(t, out var propertyDictionary))
122121
return propertyDictionary;
123122
propertyDictionary = JsonContract.PropertiesOfAll(t, memberSerialization);
124123
CachedTypeProperties.TryAdd(t, propertyDictionary);

src/Nest/CommonAbstractions/SerializationBehavior/GenericJsonConverters/ReadAsTypeJsonConverter.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@ internal class ReadAsTypeJsonConverter<T> : JsonConverter
1111

1212
public override bool CanConvert(Type objectType) => true;
1313

14-
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
15-
{
16-
}
14+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { }
1715

1816
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) =>
1917
FromJson.ReadAs<T>(reader, serializer);

src/Nest/CommonAbstractions/SerializationBehavior/GenericJsonConverters/ReserializeJsonConverter.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,18 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
2323
return reader.ReadToEnd(depth, deserialized);
2424
}
2525

26-
protected TReadAs ReadAs(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) =>
27-
this.Reader.ReadJson(reader, objectType, existingValue, serializer) as TReadAs;
26+
protected TReadAs ReadAs(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
27+
{
28+
29+
return this.Reader.ReadJson(reader, objectType, existingValue, serializer) as TReadAs;
30+
}
2831

2932
protected virtual object DeserializeJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) =>
3033
this.ReadAs(reader, objectType, existingValue, serializer);
3134

3235
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
3336
{
34-
var v = value as TInterface;
35-
if (v == null) return;
37+
if (!(value is TInterface v)) return;
3638
this.SerializeJson(writer, value, v, serializer);
3739
}
3840

@@ -53,7 +55,10 @@ protected void Reserialize(JsonWriter writer, object value, JsonSerializer seria
5355
var vv = p.ValueProvider.GetValue(value);
5456
if (vv == null) continue;
5557
writer.WritePropertyName(p.PropertyName);
56-
serializer.Serialize(writer, vv);
58+
if (p.Converter?.GetType() == typeof(SourceValueWriteConverter))
59+
SourceValueWriteConverter.Write(writer, vv, serializer);
60+
else
61+
serializer.Serialize(writer, vv);
5762
}
5863
writer.WriteEndObject();
5964
}

src/Nest/CommonAbstractions/SerializationBehavior/SourceConverter.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,28 @@ internal class CollapsedSourceConverter : SourceConverter
3636
{
3737
public override SerializationFormatting? ForceFormatting { get; } = None;
3838
}
39+
internal class SourceValueWriteConverter : JsonConverter
40+
{
41+
public override bool CanRead => false;
42+
public override bool CanWrite => true;
43+
public override bool CanConvert(Type objectType) => true;
44+
45+
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
46+
{
47+
Write(writer, value, serializer);
48+
}
49+
50+
public static void Write(JsonWriter writer, object value, JsonSerializer serializer)
51+
{
52+
var sourceSerializer = serializer.GetConnectionSettings().SourceSerializer;
53+
var f = writer.Formatting == Formatting.Indented ? Indented : None;
54+
var v = sourceSerializer.SerializeToString(value, f);
55+
writer.WriteRawValue(v);
56+
}
57+
58+
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
59+
{
60+
throw new NotImplementedException("CanRead is false so this is not expected to be called");
61+
}
62+
}
3963
}

src/Nest/Ingest/Processors/SetProcessor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public interface ISetProcessor : IProcessor
1515
Field Field { get; set; }
1616

1717
[JsonProperty("value")]
18+
[JsonConverter(typeof(SourceValueWriteConverter))]
1819
object Value { get; set; }
1920
}
2021

src/Nest/QueryDsl/TermLevel/Term/TermQuery.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ namespace Nest
77
public interface ITermQuery : IFieldNameQuery
88
{
99
[JsonProperty("value")]
10+
[JsonConverter(typeof(SourceValueWriteConverter))]
1011
object Value { get; set; }
1112
}
1213

1314
public class TermQuery : FieldNameQueryBase, ITermQuery
1415
{
1516
protected override bool Conditionless => IsConditionless(this);
17+
[JsonConverter(typeof(SourceValueWriteConverter))]
1618
public object Value { get; set; }
1719

1820
internal override void InternalWrapInContainer(IQueryContainer c) => c.Term = this;

src/Nest/QueryDsl/TermLevel/Wildcard/WildcardQuery.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,4 @@ public class WildcardQueryDescriptor<T> : TermQueryDescriptorBase<WildcardQueryD
3636

3737
public WildcardQueryDescriptor<T> Rewrite(MultiTermQueryRewrite rewrite) => Assign(a => a.Rewrite = rewrite);
3838
}
39-
}
39+
}

src/Tests/ClientConcepts/HighLevel/Serialization/SendsUsingSourceSerializer.cs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using System.Runtime.Serialization;
45
using Elasticsearch.Net;
56
using Nest;
67
using Newtonsoft.Json;
8+
using Newtonsoft.Json.Converters;
79
using Tests.Framework;
810
using Tests.Framework.ManagedElasticsearch.SourceSerializers;
11+
using Tests.Framework.MockData;
912
using static Tests.Framework.RoundTripper;
1013

1114
namespace Tests.ClientConcepts.HighLevel.Serialization
@@ -42,6 +45,11 @@ protected override JsonSerializerSettings CreateJsonSerializerSettings()
4245
};
4346
}
4447

48+
protected override IEnumerable<JsonConverter> CreateJsonConverters()
49+
{
50+
foreach (var c in base.CreateJsonConverters()) yield return c;
51+
yield return new StringEnumConverter();
52+
}
4553
}
4654

4755
private static void CanAlterSource<T>(Func<IElasticClient, T> call, object usingDefaults, object withSourceSerializer)
@@ -54,6 +62,24 @@ private static void CanAlterSource<T>(Func<IElasticClient, T> call, object using
5462
.FromRequest(call);
5563
}
5664

65+
private static void Serializes<T>(T o, object usingDefaults, object withSourceSerializer)
66+
{
67+
SerializesDefault(o, usingDefaults);
68+
SerializesSourceSerializer(o, withSourceSerializer);
69+
}
70+
71+
private static void SerializesSourceSerializer<T>(T o, object withSourceSerializer)
72+
{
73+
WithSourceSerializer((s, c) => new CustomSettingsSerializerBase(s, c))
74+
.Expect(withSourceSerializer)
75+
.WhenSerializing(o);
76+
}
77+
78+
private static void SerializesDefault<T>(T o, object usingDefaults)
79+
{
80+
Expect(usingDefaults).WhenSerializing(o);
81+
}
82+
5783
[U] public void IndexRequest()
5884
{
5985
CanAlterSource(
@@ -155,5 +181,35 @@ [U] public void MultiTermVectorsRequest()
155181
withSourceSerializer: ExpectMultiTermVectors(IncludesNullAndType)
156182
);
157183
}
184+
185+
public enum SomeEnum
186+
{
187+
Value,
188+
[EnumMember(Value = "different")]
189+
AnotherValue
190+
}
191+
192+
[U] public void TermQuery() =>
193+
SerializesEnumValue(new TermQuery { Field = Infer.Field<Project>(p=>p.Name), Value = SomeEnum.AnotherValue});
194+
195+
[U] public void WildcardQuery() =>
196+
SerializesEnumValue(new WildcardQuery {Field = Infer.Field<Project>(p => p.Name), Value = SomeEnum.AnotherValue});
197+
198+
[U] public void PrefixQuery() =>
199+
SerializesEnumValue(new PrefixQuery { Field = Infer.Field<Project>(p=>p.Name), Value = SomeEnum.AnotherValue});
200+
201+
[U] public void SpanTermQueryInitializer() =>
202+
SerializesEnumValue(new SpanTermQuery { Field = Infer.Field<Project>(p=>p.Name), Value = SomeEnum.AnotherValue});
203+
204+
[U] public void SpanTermQueryFluent() =>
205+
SerializesEnumValue<ISpanTermQuery>(new SpanTermQueryDescriptor<Project>().Field(p=>p.Name).Value(SomeEnum.AnotherValue));
206+
207+
private static void SerializesEnumValue<T>(T query)
208+
{
209+
Serializes(query,
210+
usingDefaults: new {name = new {value = 1}},
211+
withSourceSerializer: new {name = new {value = "different"}}
212+
);
213+
}
158214
}
159215
}

src/Tests/Framework/Configuration/YamlConfiguration.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@ public YamlConfiguration(string configurationFile)
2828

2929
this.Mode = GetTestMode(_config["mode"]);
3030
this.ElasticsearchVersion = ElasticsearchVersion.GetOrAdd(_config["elasticsearch_version"]);
31-
this.ForceReseed = bool.Parse(_config["force_reseed"]);
32-
this.TestAgainstAlreadyRunningElasticsearch =
33-
_config.TryGetValue("test_against_already_running_elasticsearch", out var tar) && bool.Parse(tar);
31+
this.ForceReseed = BoolConfig("force_reseed", false);
32+
this.TestAgainstAlreadyRunningElasticsearch = BoolConfig("test_against_already_running_elasticsearch", false);
3433
this.ClusterFilter = _config.ContainsKey("cluster_filter") ? _config["cluster_filter"] : null;
3534
this.TestFilter = _config.ContainsKey("test_filter") ? _config["test_filter"] : null;
3635

@@ -39,12 +38,15 @@ public YamlConfiguration(string configurationFile)
3938
var randomizer = new Randomizer();
4039
this.Random = new RandomConfiguration
4140
{
42-
SourceSerializer = BoolConfig("source_serializer", randomizer),
43-
TypedKeys = BoolConfig("typed_keys", randomizer)
41+
SourceSerializer = RandomBool("source_serializer", randomizer),
42+
TypedKeys = RandomBool("typed_keys", randomizer)
4443
};
4544
}
4645

47-
private bool BoolConfig(string key, Randomizer randomizer) =>
46+
private bool BoolConfig(string key, bool @default) =>
47+
_config.TryGetValue(key, out var v) ? bool.Parse(v) : @default;
48+
49+
private bool RandomBool(string key, Randomizer randomizer) =>
4850
_config.TryGetValue($"random_{key}", out var v) ? bool.Parse(v) : randomizer.Bool();
4951

5052
private static string ConfigName(string configLine) => Parse(configLine, 0);

src/Tests/Framework/ManagedElasticsearch/SourceSerializers/TestSourceSerializerBase.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using Nest;
44
using Nest.JsonNetSerializer;
55
using Newtonsoft.Json;
6+
using Newtonsoft.Json.Converters;
67
using Newtonsoft.Json.Serialization;
78
using Tests.Framework.MockData;
89

@@ -29,5 +30,6 @@ protected override void ModifyContractResolver(ConnectionSettingsAwareContractRe
2930
{
3031
resolver.NamingStrategy = new CamelCaseNamingStrategy();
3132
}
33+
3234
}
3335
}

0 commit comments

Comments
 (0)