Skip to content

Commit 82b56eb

Browse files
committed
Fix _suggest serialization and add integration tests
1 parent 4da9589 commit 82b56eb

File tree

10 files changed

+1501
-1295
lines changed

10 files changed

+1501
-1295
lines changed

src/Nest/Search/Suggesters/BaseSuggest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ public abstract class SuggesterBase : ISuggester
3131
}
3232

3333
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
34-
public abstract class SuggesterBaseDescriptor<TDescriptor, TInterface, T> : DescriptorBase<TDescriptor, TInterface>, ISuggester
35-
where TDescriptor : SuggesterBaseDescriptor<TDescriptor, TInterface, T>, TInterface, ISuggester
34+
public abstract class SuggestDescriptorBase<TDescriptor, TInterface, T> : DescriptorBase<TDescriptor, TInterface>, ISuggester
35+
where TDescriptor : SuggestDescriptorBase<TDescriptor, TInterface, T>, TInterface, ISuggester
3636
where TInterface : class, ISuggester
3737
{
3838
string ISuggester.Text { get; set; }

src/Nest/Search/Suggesters/CompletionSuggester/CompletionSuggester.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class CompletionSuggester : SuggesterBase, ICompletionSuggester
2121
public IDictionary<string, object> Context { get; set; }
2222
}
2323

24-
public class CompletionSuggesterDescriptor<T> : SuggesterBaseDescriptor<CompletionSuggesterDescriptor<T>, ICompletionSuggester, T>, ICompletionSuggester
24+
public class CompletionSuggesterDescriptor<T> : SuggestDescriptorBase<CompletionSuggesterDescriptor<T>, ICompletionSuggester, T>, ICompletionSuggester
2525
where T : class
2626
{
2727
IFuzzySuggester ICompletionSuggester.Fuzzy { get; set; }

src/Nest/Search/Suggesters/PhraseSuggester/PhraseSuggester.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class PhraseSuggester : SuggesterBase, IPhraseSuggester
4646
public IPhraseSuggestCollate Collate { get; set; }
4747
}
4848

49-
public class PhraseSuggesterDescriptor<T> : SuggesterBaseDescriptor<PhraseSuggesterDescriptor<T>, IPhraseSuggester, T>, IPhraseSuggester
49+
public class PhraseSuggesterDescriptor<T> : SuggestDescriptorBase<PhraseSuggesterDescriptor<T>, IPhraseSuggester, T>, IPhraseSuggester
5050
where T : class
5151
{
5252
int? IPhraseSuggester.GramSize { get; set; }

src/Nest/Search/Suggesters/Suggest/SuggestRequest.cs

Lines changed: 16 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,72 +8,53 @@ namespace Nest
88
public partial interface ISuggestRequest
99
{
1010
string GlobalText { get; set; }
11-
IDictionary<string, ISuggester> Suggest { get; set; }
11+
ISuggestContainer Suggest { get; set; }
1212
}
1313

1414
public partial class SuggestRequest
1515
{
1616
public string GlobalText { get; set; }
17-
public IDictionary<string, ISuggester> Suggest { get; set; }
17+
public ISuggestContainer Suggest { get; set; }
1818
}
1919

2020
[DescriptorFor("Suggest")]
2121
public partial class SuggestDescriptor<T> where T : class
2222
{
2323
string ISuggestRequest.GlobalText { get; set; }
24-
IDictionary<string, ISuggester> ISuggestRequest.Suggest { get; set; } = new Dictionary<string, ISuggester>();
24+
ISuggestContainer ISuggestRequest.Suggest { get; set; } = new SuggestContainer();
2525

2626
/// <summary>
2727
/// To avoid repetition of the suggest text, it is possible to define a global text.
2828
/// </summary>
29-
public SuggestDescriptor<T> GlobalText(string globalSuggestText)
30-
{
31-
Self.GlobalText = globalSuggestText;
32-
return this;
33-
}
29+
public SuggestDescriptor<T> GlobalText(string globalText) => Assign(a => a.GlobalText = globalText);
3430

3531
/// <summary>
3632
/// The term suggester suggests terms based on edit distance. The provided suggest text is analyzed before terms are suggested.
3733
/// The suggested terms are provided per analyzed suggest text token. The term suggester doesn’t take the query into account that is part of request.
3834
/// </summary>
39-
public SuggestDescriptor<T> Term(string name, Func<TermSuggesterDescriptor<T>, TermSuggesterDescriptor<T>> suggest)
40-
{
41-
name.ThrowIfNullOrEmpty(nameof(name));
42-
suggest.ThrowIfNull(nameof(suggest));
43-
var desc = new TermSuggesterDescriptor<T>();
44-
var item = suggest(desc);
45-
Self.Suggest.Add(name, item);
46-
return this;
47-
}
35+
public SuggestDescriptor<T> Term(string name, Func<TermSuggesterDescriptor<T>, ITermSuggester> suggest) =>
36+
AssignToBucket(name, suggest?.Invoke(new TermSuggesterDescriptor<T>()), (b, s) => b.Term = s);
4837

4938
/// <summary>
5039
/// The phrase suggester adds additional logic on top of the term suggester to select entire corrected phrases
5140
/// instead of individual tokens weighted based on ngram-langugage models.
5241
/// </summary>
53-
public SuggestDescriptor<T> Phrase(string name, Func<PhraseSuggesterDescriptor<T>, PhraseSuggesterDescriptor<T>> suggest)
54-
{
55-
name.ThrowIfNullOrEmpty(nameof(name));
56-
suggest.ThrowIfNull(nameof(suggest));
57-
58-
var desc = new PhraseSuggesterDescriptor<T>();
59-
var item = suggest(desc);
60-
Self.Suggest.Add(name, item);
61-
return this;
62-
}
42+
public SuggestDescriptor<T> Phrase(string name, Func<PhraseSuggesterDescriptor<T>, IPhraseSuggester> suggest) =>
43+
AssignToBucket(name, suggest?.Invoke(new PhraseSuggesterDescriptor<T>()), (b, s) => b.Phrase = s);
6344

6445
/// <summary>
6546
/// The completion suggester is a so-called prefix suggester.
6647
/// It does not do spell correction like the term or phrase suggesters but allows basic auto-complete functionality.
6748
/// </summary>
68-
public SuggestDescriptor<T> Completion(string name, Func<CompletionSuggesterDescriptor<T>, CompletionSuggesterDescriptor<T>> suggest)
69-
{
70-
name.ThrowIfNullOrEmpty(nameof(name));
71-
suggest.ThrowIfNull(nameof(suggest));
49+
public SuggestDescriptor<T> Completion(string name, Func<CompletionSuggesterDescriptor<T>, ICompletionSuggester> suggest) =>
50+
AssignToBucket(name, suggest?.Invoke(new CompletionSuggesterDescriptor<T>()), (b, s) => b.Completion = s);
7251

73-
var desc = new CompletionSuggesterDescriptor<T>();
74-
var item = suggest(desc);
75-
Self.Suggest.Add(name, item);
76-
return this;
52+
private SuggestDescriptor<T> AssignToBucket<TSuggester>(string name, TSuggester suggester, Action<SuggestBucket, TSuggester> assign)
53+
where TSuggester : ISuggester
54+
{
55+
var bucket = new SuggestBucket { Text = suggester.Text };
56+
assign(bucket, suggester);
57+
return Assign(a => a.Suggest.Add(name, bucket));
7758
}
7859
}
7960
}

src/Nest/Search/Suggesters/Suggest/SuggestRequestJsonConverter.cs

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,21 @@ namespace Nest
77
{
88
internal class SuggestRequestJsonConverter : JsonConverter
99
{
10-
public override bool CanRead => true;
10+
public override bool CanRead => false;
1111
public override bool CanWrite => true;
1212
public override bool CanConvert(Type objectType) => true;
1313

1414
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
1515
{
16-
var searchRequest = serializer.Deserialize<SearchRequest>(reader);
17-
return new PutWarmerRequest("unknown name because its not on the body when deserializing") { Search = searchRequest };
16+
throw new NotSupportedException();
1817
}
1918

2019
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
2120
{
2221
var suggestRequest = value as ISuggestRequest;
2322
if (suggestRequest == null) return;
2423

25-
var dict = new Dictionary<string, object>();
24+
writer.WriteStartObject();
2625
if (!suggestRequest.GlobalText.IsNullOrEmpty())
2726
{
2827
writer.WritePropertyName("text");
@@ -33,23 +32,11 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
3332
{
3433
foreach (var kv in suggestRequest.Suggest)
3534
{
36-
var item = kv.Value;
37-
var bucket = new SuggestBucket() { Text = item.Text };
38-
39-
var completion = item as ICompletionSuggester;
40-
if (completion != null) bucket.Completion = completion;
41-
42-
var phrase = item as IPhraseSuggester;
43-
if (phrase != null) bucket.Phrase = phrase;
44-
45-
var term = item as ITermSuggester;
46-
if (term != null) bucket.Term = term;
47-
4835
writer.WritePropertyName(kv.Key);
49-
serializer.Serialize(writer, bucket);
50-
dict.Add(kv.Key, bucket);
36+
serializer.Serialize(writer, kv.Value);
5137
}
5238
}
39+
writer.WriteEndObject();
5340
}
5441
}
5542
}

src/Nest/Search/Suggesters/SuggestBucket.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@ public interface ISuggestBucket
88
{
99
[JsonProperty("text")]
1010
string Text { get; set; }
11+
1112
[JsonProperty("term")]
1213
ITermSuggester Term { get; set; }
14+
1315
[JsonProperty("phrase")]
1416
IPhraseSuggester Phrase { get; set; }
17+
1518
[JsonProperty("completion")]
1619
ICompletionSuggester Completion { get; set; }
1720
}

src/Nest/Search/Suggesters/TermSuggester/TermSuggester.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ public class TermSuggester : SuggesterBase, ITermSuggester
4242
public decimal? MaxTermFrequency { get; set; }
4343
}
4444

45-
public class TermSuggesterDescriptor<T> : SuggesterBaseDescriptor<TermSuggesterDescriptor<T>, ITermSuggester, T>, ITermSuggester
45+
public class TermSuggesterDescriptor<T>
46+
: SuggestDescriptorBase<TermSuggesterDescriptor<T>, ITermSuggester, T>, ITermSuggester
4647
where T : class
4748
{
4849
int? ITermSuggester.PrefixLen { get; set; }

0 commit comments

Comments
 (0)