diff options
author | Christoph Büscher <christoph@elastic.co> | 2017-02-16 17:59:55 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-16 17:59:55 +0100 |
commit | 268d15ec4cdbc85330ee4f28ca6974ff27326de9 (patch) | |
tree | b01959feb5e22ee5e55d3fcdce37e2274e294655 /core/src/main | |
parent | 76675229c7eb64ee2dbd41ec4a8258d74a3f1d03 (diff) |
Adding fromXContent to Suggestion.Entry and subclasses (#23202)
This adds parsing from xContent to Suggestion.Entry and its subclasses for Terms-, Phrase-
and CompletionSuggestion.Entry.
Diffstat (limited to 'core/src/main')
4 files changed, 76 insertions, 20 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/Suggest.java b/core/src/main/java/org/elasticsearch/search/suggest/Suggest.java index f1875564f8..36a780fec3 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/Suggest.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/Suggest.java @@ -25,6 +25,7 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.Streamable; import org.elasticsearch.common.text.Text; import org.elasticsearch.common.xcontent.ConstructingObjectParser; +import org.elasticsearch.common.xcontent.ObjectParser; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -371,37 +372,38 @@ public class Suggest implements Iterable<Suggest.Suggestion<? extends Entry<? ex /** * Represents a part from the suggest text with suggested options. */ - public static class Entry<O extends Entry.Option> implements Iterable<O>, Streamable, ToXContent { + public static class Entry<O extends Entry.Option> implements Iterable<O>, Streamable, ToXContentObject { - static class Fields { - - static final String TEXT = "text"; - static final String OFFSET = "offset"; - static final String LENGTH = "length"; - static final String OPTIONS = "options"; - - } + private static final String TEXT = "text"; + private static final String OFFSET = "offset"; + private static final String LENGTH = "length"; + protected static final String OPTIONS = "options"; protected Text text; protected int offset; protected int length; - protected List<O> options; + protected List<O> options = new ArrayList<>(5); public Entry(Text text, int offset, int length) { this.text = text; this.offset = offset; this.length = length; - this.options = new ArrayList<>(5); } - public Entry() { + protected Entry() { } public void addOption(O option) { options.add(option); } + protected void addOptions(List<O> options) { + for (O option : options) { + addOption(option); + } + } + protected void sort(Comparator<O> comparator) { CollectionUtil.timSort(options, comparator); } @@ -539,10 +541,10 @@ public class Suggest implements Iterable<Suggest.Suggestion<? extends Entry<? ex @Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); - builder.field(Fields.TEXT, text); - builder.field(Fields.OFFSET, offset); - builder.field(Fields.LENGTH, length); - builder.startArray(Fields.OPTIONS); + builder.field(TEXT, text); + builder.field(OFFSET, offset); + builder.field(LENGTH, length); + builder.startArray(OPTIONS); for (Option option : options) { option.toXContent(builder, params); } @@ -551,6 +553,23 @@ public class Suggest implements Iterable<Suggest.Suggestion<? extends Entry<? ex return builder; } + private static ObjectParser<Entry<Option>, Void> PARSER = new ObjectParser<>("SuggestionEntryParser", true, Entry::new); + + static { + declareCommonFields(PARSER); + PARSER.declareObjectArray(Entry::addOptions, (p,c) -> Option.fromXContent(p), new ParseField(OPTIONS)); + } + + protected static void declareCommonFields(ObjectParser<? extends Entry<? extends Option>, Void> parser) { + parser.declareString((entry, text) -> entry.text = new Text(text), new ParseField(TEXT)); + parser.declareInt((entry, offset) -> entry.offset = offset, new ParseField(OFFSET)); + parser.declareInt((entry, length) -> entry.length = length, new ParseField(LENGTH)); + } + + public static Entry<? extends Option> fromXContent(XContentParser parser) { + return PARSER.apply(parser, null); + } + /** * Contains the suggested text with its document frequency and score. */ diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java index 33ff15fbbb..51b44a300d 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java @@ -194,8 +194,7 @@ public final class CompletionSuggestion extends Suggest.Suggestion<CompletionSug super(text, offset, length); } - protected Entry() { - super(); + Entry() { } @Override @@ -203,6 +202,18 @@ public final class CompletionSuggestion extends Suggest.Suggestion<CompletionSug return new Option(); } + private static ObjectParser<Entry, Void> PARSER = new ObjectParser<>("CompletionSuggestionEntryParser", true, + Entry::new); + + static { + declareCommonFields(PARSER); + PARSER.declareObjectArray(Entry::addOptions, (p,c) -> Option.fromXContent(p), new ParseField(OPTIONS)); + } + + public static Entry fromXContent(XContentParser parser) { + return PARSER.apply(parser, null); + } + public static class Option extends Suggest.Suggestion.Entry.Option { private Map<String, Set<CharSequence>> contexts = Collections.emptyMap(); private ScoreDoc doc; diff --git a/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestion.java b/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestion.java index e673ccb128..3ea0d61d72 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestion.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestion.java @@ -19,9 +19,12 @@ package org.elasticsearch.search.suggest.phrase; +import org.elasticsearch.common.ParseField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.text.Text; +import org.elasticsearch.common.xcontent.ObjectParser; +import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.search.suggest.Suggest; import org.elasticsearch.search.suggest.Suggest.Suggestion; @@ -69,7 +72,7 @@ public class PhraseSuggestion extends Suggest.Suggestion<PhraseSuggestion.Entry> this.cutoffScore = cutoffScore; } - public Entry() { + Entry() { } /** @@ -100,6 +103,17 @@ public class PhraseSuggestion extends Suggest.Suggestion<PhraseSuggestion.Entry> } } + private static ObjectParser<Entry, Void> PARSER = new ObjectParser<>("PhraseSuggestionEntryParser", true, Entry::new); + + static { + declareCommonFields(PARSER); + PARSER.declareObjectArray(Entry::addOptions, (p,c) -> Option.fromXContent(p), new ParseField(OPTIONS)); + } + + public static Entry fromXContent(XContentParser parser) { + return PARSER.apply(parser, null); + } + @Override public void readFrom(StreamInput in) throws IOException { super.readFrom(in); diff --git a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java b/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java index 68aed8b80a..5f6cd310ad 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java @@ -24,6 +24,7 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.text.Text; import org.elasticsearch.common.xcontent.ConstructingObjectParser; +import org.elasticsearch.common.xcontent.ObjectParser; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.search.suggest.SortBy; @@ -142,7 +143,7 @@ public class TermSuggestion extends Suggestion<TermSuggestion.Entry> { public static class Entry extends org.elasticsearch.search.suggest.Suggest.Suggestion.Entry<TermSuggestion.Entry.Option> { - Entry(Text text, int offset, int length) { + public Entry(Text text, int offset, int length) { super(text, offset, length); } @@ -154,6 +155,17 @@ public class TermSuggestion extends Suggestion<TermSuggestion.Entry> { return new Option(); } + private static ObjectParser<Entry, Void> PARSER = new ObjectParser<>("TermSuggestionEntryParser", true, Entry::new); + + static { + declareCommonFields(PARSER); + PARSER.declareObjectArray(Entry::addOptions, (p,c) -> Option.fromXContent(p), new ParseField(OPTIONS)); + } + + public static Entry fromXContent(XContentParser parser) { + return PARSER.apply(parser, null); + } + /** * Contains the suggested text with its document frequency and score. */ |