summaryrefslogtreecommitdiff
path: root/core/src/main/java/org/elasticsearch/search/suggest
diff options
context:
space:
mode:
authorLuca Cavanna <javanna@users.noreply.github.com>2017-02-27 15:42:25 +0100
committerGitHub <noreply@github.com>2017-02-27 15:42:25 +0100
commit2fb0466f669b030dfdd3cf0f876f4f4a98560781 (patch)
tree001d5827172b3b4101ee74f5cf041b8a15027881 /core/src/main/java/org/elasticsearch/search/suggest
parent1ceaef0de63b75904faa8d77d962dea364e176d0 (diff)
Convert suggestion response parsing to use NamedXContentRegistry (#23355)
We recently added parsing code to parse suggesters responses into java api objects. This was done using a switch based on the type of the returned suggestion. We can now replace the switch with using NamedXContentRegistry, which will also be used for aggs parsing.
Diffstat (limited to 'core/src/main/java/org/elasticsearch/search/suggest')
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/Suggest.java40
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestion.java6
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/phrase/PhraseSuggestion.java9
-rw-r--r--core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestion.java12
4 files changed, 33 insertions, 34 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 ba5ad712f4..f85ea18109 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/Suggest.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/Suggest.java
@@ -19,6 +19,7 @@
package org.elasticsearch.search.suggest;
import org.apache.lucene.util.CollectionUtil;
+import org.elasticsearch.common.CheckedFunction;
import org.elasticsearch.common.ParseField;
import org.elasticsearch.common.ParsingException;
import org.elasticsearch.common.io.stream.StreamInput;
@@ -48,7 +49,6 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.function.Function;
import java.util.stream.Collectors;
import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg;
@@ -384,13 +384,14 @@ public class Suggest implements Iterable<Suggest.Suggestion<? extends Entry<? ex
return builder;
}
+ @SuppressWarnings("unchecked")
public static Suggestion<? extends Entry<? extends Option>> fromXContent(XContentParser parser) throws IOException {
ensureExpectedToken(XContentParser.Token.FIELD_NAME, parser.currentToken(), parser::getTokenLocation);
String typeAndName = parser.currentName();
// we need to extract the type prefix from the name and throw error if it is not present
int delimiterPos = typeAndName.indexOf(InternalAggregation.TYPED_KEYS_DELIMITER);
- String type = null;
- String name = null;
+ String type;
+ String name;
if (delimiterPos > 0) {
type = typeAndName.substring(0, delimiterPos);
name = typeAndName.substring(delimiterPos + 1);
@@ -399,35 +400,17 @@ public class Suggest implements Iterable<Suggest.Suggestion<? extends Entry<? ex
"Cannot parse suggestion response without type information. Set [" + RestSearchAction.TYPED_KEYS_PARAM
+ "] parameter on the request to ensure the type information is added to the response output");
}
- Suggestion suggestion = null;
- Function<XContentParser, Entry> entryParser = null;
- // the "size" parameter and the SortBy for TermSuggestion cannot be parsed from the response, use default values
- // TODO investigate if we can use NamedXContentRegistry instead of this switch
- switch (type) {
- case Suggestion.NAME:
- suggestion = new Suggestion(name, -1);
- entryParser = Suggestion.Entry::fromXContent;
- break;
- case PhraseSuggestion.NAME:
- suggestion = new PhraseSuggestion(name, -1);
- entryParser = PhraseSuggestion.Entry::fromXContent;
- break;
- case TermSuggestion.NAME:
- suggestion = new TermSuggestion(name, -1, SortBy.SCORE);
- entryParser = TermSuggestion.Entry::fromXContent;
- break;
- case CompletionSuggestion.NAME:
- suggestion = new CompletionSuggestion(name, -1);
- entryParser = CompletionSuggestion.Entry::fromXContent;
- break;
- default:
- throw new ParsingException(parser.getTokenLocation(), "Unknown suggestion type [{}]", type);
- }
+
+ return parser.namedObject(Suggestion.class, type, name);
+ }
+
+ protected static <E extends Suggestion.Entry<?>> void parseEntries(XContentParser parser, Suggestion<E> suggestion,
+ CheckedFunction<XContentParser, E, IOException> entryParser)
+ throws IOException {
ensureExpectedToken(XContentParser.Token.START_ARRAY, parser.nextToken(), parser::getTokenLocation);
while ((parser.nextToken()) != XContentParser.Token.END_ARRAY) {
suggestion.addTerm(entryParser.apply(parser));
}
- return suggestion;
}
/**
@@ -584,6 +567,7 @@ public class Suggest implements Iterable<Suggest.Suggestion<? extends Entry<? ex
}
}
+ @SuppressWarnings("unchecked")
protected O newOption(){
return (O) new Option();
}
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 ed45104d99..229b77aad2 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
@@ -94,6 +94,12 @@ public final class CompletionSuggestion extends Suggest.Suggestion<CompletionSug
return getOptions().size() > 0;
}
+ public static CompletionSuggestion fromXContent(XContentParser parser, String name) throws IOException {
+ CompletionSuggestion suggestion = new CompletionSuggestion(name, -1);
+ parseEntries(parser, suggestion, CompletionSuggestion.Entry::fromXContent);
+ return suggestion;
+ }
+
private static final class OptionPriorityQueue extends org.apache.lucene.util.PriorityQueue<Entry.Option> {
private final Comparator<Suggest.Suggestion.Entry.Option> comparator;
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 fb646b03ae..bd6c828bd4 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
@@ -60,10 +60,13 @@ public class PhraseSuggestion extends Suggest.Suggestion<PhraseSuggestion.Entry>
return new Entry();
}
+ public static PhraseSuggestion fromXContent(XContentParser parser, String name) throws IOException {
+ PhraseSuggestion suggestion = new PhraseSuggestion(name, -1);
+ parseEntries(parser, suggestion, PhraseSuggestion.Entry::fromXContent);
+ return suggestion;
+ }
+
public static class Entry extends Suggestion.Entry<Suggestion.Entry.Option> {
- static class Fields {
- static final String CUTOFF_SCORE = "cutoff_score";
- }
protected double cutoffScore = Double.MIN_VALUE;
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 31621fb63b..185e4c76b3 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
@@ -132,6 +132,13 @@ public class TermSuggestion extends Suggestion<TermSuggestion.Entry> {
sort.writeTo(out);
}
+ public static TermSuggestion fromXContent(XContentParser parser, String name) throws IOException {
+ // the "size" parameter and the SortBy for TermSuggestion cannot be parsed from the response, use default values
+ TermSuggestion suggestion = new TermSuggestion(name, -1, SortBy.SCORE);
+ parseEntries(parser, suggestion, TermSuggestion.Entry::fromXContent);
+ return suggestion;
+ }
+
@Override
protected Entry newEntry() {
return new Entry();
@@ -140,8 +147,7 @@ public class TermSuggestion extends Suggestion<TermSuggestion.Entry> {
/**
* Represents a part from the suggest text with suggested options.
*/
- public static class Entry extends
- org.elasticsearch.search.suggest.Suggest.Suggestion.Entry<TermSuggestion.Entry.Option> {
+ public static class Entry extends org.elasticsearch.search.suggest.Suggest.Suggestion.Entry<TermSuggestion.Entry.Option> {
public Entry(Text text, int offset, int length) {
super(text, offset, length);
@@ -235,7 +241,7 @@ public class TermSuggestion extends Suggestion<TermSuggestion.Entry> {
PARSER.declareFloat(constructorArg(), Suggestion.Entry.Option.SCORE);
}
- public static final Option fromXContent(XContentParser parser) {
+ public static Option fromXContent(XContentParser parser) {
return PARSER.apply(parser, null);
}
}