Skip to content

Commit 1d7d30e

Browse files
committed
Serialize first precision value on GeoSuggest (#4106)
Relates: #4091 This commit adds a SerializeAsSingleFormatter<T> to serialize only the first value in the Precision collection for a GeoSuggestContext context mapping for the "completion" field data type. Move the Context mapping related types to the Nest/Mapping/Types/Specialized/Completion directory to disambiguate from the context query types. Deprecate the Neighbors property on IGeoSuggestContext.
1 parent 59efad8 commit 1d7d30e

File tree

7 files changed

+51
-3
lines changed

7 files changed

+51
-3
lines changed

src/Nest/CommonAbstractions/SerializationBehavior/JsonFormatters/SingleOrEnumerableFormatter.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Linq;
23
using Elasticsearch.Net.Utf8Json;
34

45
namespace Nest
@@ -25,4 +26,35 @@ public void Serialize(ref JsonWriter writer, IEnumerable<T> value, IJsonFormatte
2526
formatter.Serialize(ref writer, value, formatterResolver);
2627
}
2728
}
29+
30+
internal class SerializeAsSingleFormatter<T> : IJsonFormatter<IEnumerable<T>>
31+
{
32+
public IEnumerable<T> Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver)
33+
{
34+
var token = reader.GetCurrentJsonToken();
35+
return token == JsonToken.BeginArray
36+
? formatterResolver.GetFormatter<IEnumerable<T>>().Deserialize(ref reader, formatterResolver)
37+
: new[] { formatterResolver.GetFormatter<T>().Deserialize(ref reader, formatterResolver) };
38+
}
39+
40+
public void Serialize(ref JsonWriter writer, IEnumerable<T> value, IJsonFormatterResolver formatterResolver)
41+
{
42+
if (value == null)
43+
{
44+
writer.WriteNull();
45+
return;
46+
}
47+
48+
var enumerator = value.GetEnumerator();
49+
if (!enumerator.MoveNext())
50+
{
51+
writer.WriteNull();
52+
return;
53+
}
54+
55+
var firstValue = enumerator.Current;
56+
var formatter = formatterResolver.GetFormatter<T>();
57+
formatter.Serialize(ref writer, firstValue, formatterResolver);
58+
}
59+
}
2860
}

src/Nest/Search/Suggesters/ContextSuggester/GeoSuggestContext.cs renamed to src/Nest/Mapping/Types/Specialized/Completion/GeoSuggestContext.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Runtime.Serialization;
34
using Elasticsearch.Net.Utf8Json;
45

@@ -7,18 +8,26 @@ namespace Nest
78
[InterfaceDataContract]
89
public interface IGeoSuggestContext : ISuggestContext
910
{
10-
[DataMember(Name = "neighbors")]
11+
[IgnoreDataMember]
12+
[Obsolete("No longer valid. Will be removed in next major release")]
1113
bool? Neighbors { get; set; }
1214

15+
/// <summary>
16+
/// The precision of the geohash to encode the query geo point.
17+
/// Only the first value will be serialized.
18+
/// </summary>
19+
[JsonFormatter(typeof(SerializeAsSingleFormatter<string>))]
1320
[DataMember(Name = "precision")]
1421
IEnumerable<string> Precision { get; set; }
1522
}
1623

1724
[DataContract]
1825
public class GeoSuggestContext : SuggestContextBase, IGeoSuggestContext
1926
{
27+
[Obsolete("No longer valid. Will be removed in next major release")]
2028
public bool? Neighbors { get; set; }
2129

30+
/// <inheritdoc />
2231
public IEnumerable<string> Precision { get; set; }
2332
public override string Type => "geo";
2433
}
@@ -29,11 +38,15 @@ public class GeoSuggestContextDescriptor<T>
2938
where T : class
3039
{
3140
protected override string Type => "geo";
41+
42+
[Obsolete("No longer valid. Will be removed in next major release")]
3243
bool? IGeoSuggestContext.Neighbors { get; set; }
3344
IEnumerable<string> IGeoSuggestContext.Precision { get; set; }
3445

46+
/// <inheritdoc cref="IGeoSuggestContext.Precision" />
3547
public GeoSuggestContextDescriptor<T> Precision(params string[] precisions) => Assign(precisions, (a, v) => a.Precision = v);
3648

49+
[Obsolete("No longer valid. Will be removed in next major release")]
3750
public GeoSuggestContextDescriptor<T> Neighbors(bool? neighbors = true) => Assign(neighbors, (a, v) => a.Neighbors = v);
3851
}
3952
}

src/Nest/Search/Suggesters/ContextSuggester/SuggestContextFormatter.cs renamed to src/Nest/Mapping/Types/Specialized/Completion/SuggestContextFormatter.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using Elasticsearch.Net.Utf8Json;
33
using Elasticsearch.Net.Utf8Json.Internal;
44

5-
65
namespace Nest
76
{
87
internal class SuggestContextFormatter : IJsonFormatter<ISuggestContext>

src/Tests/Tests.Core/ManagedElasticsearch/NodeSeeders/DefaultSeeder.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,10 @@ public static PropertiesDescriptor<TProject> ProjectProperties<TProject>(Propert
347347
.Category(c => c
348348
.Name("color")
349349
)
350+
.GeoLocation(c => c
351+
.Name("geo")
352+
.Precision("1")
353+
)
350354
)
351355
)
352356
.Scalar(p => p.NumberOfCommits, n => n.Store())

0 commit comments

Comments
 (0)