diff options
author | Areek Zillur <areek.zillur@elasticsearch.com> | 2016-03-05 01:07:57 -0500 |
---|---|---|
committer | Areek Zillur <areek.zillur@elasticsearch.com> | 2016-03-09 11:53:13 -0500 |
commit | 987f2f5aa8575bbbee2ba524e9e5fa48abe9391d (patch) | |
tree | ac937fb72919c90bcd3e69f040e5dd266bfaccf9 /core/src/main/java/org/elasticsearch | |
parent | 5bb72dbcd247637ed823bd3f89a9c54e88fe7645 (diff) |
cleanup
Diffstat (limited to 'core/src/main/java/org/elasticsearch')
6 files changed, 71 insertions, 53 deletions
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java index be90a2e7e7..e3953c8e0b 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggester.java @@ -84,7 +84,7 @@ public class CompletionSuggester extends Suggester<CompletionSuggestionContext> } // collect payloads final Map<String, List<Object>> payload = new HashMap<>(0); - Set<String> payloadFields = suggestionContext.getPayloadFields(); + List<String> payloadFields = suggestionContext.getPayloadFields(); if (payloadFields.isEmpty() == false) { final int readerIndex = ReaderUtil.subIndex(suggestDoc.doc, leaves); final LeafReaderContext subReaderContext = leaves.get(readerIndex); diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionBuilder.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionBuilder.java index 38242a29ae..141e41e826 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionBuilder.java @@ -18,7 +18,7 @@ */ package org.elasticsearch.search.suggest.completion; -import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; @@ -64,9 +64,9 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug static final ParseField CONTEXTS_FIELD = new ParseField("contexts", "context"); private static ObjectParser<CompletionSuggestionBuilder, Void> TLP_PARSER = - new ObjectParser<>(CompletionSuggestionBuilder.SUGGESTION_NAME, null); + new ObjectParser<>(SUGGESTION_NAME, null); static { - TLP_PARSER.declareStringArray(CompletionSuggestionBuilder::payload, CompletionSuggestionBuilder.PAYLOAD_FIELD); + TLP_PARSER.declareStringArray(CompletionSuggestionBuilder::payload, PAYLOAD_FIELD); TLP_PARSER.declareField((parser, completionSuggestionContext, context) -> { if (parser.currentToken() == XContentParser.Token.VALUE_BOOLEAN) { if (parser.booleanValue()) { @@ -90,7 +90,7 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug builder.copyCurrentStructure(p); v.contextBytes = builder.bytes(); p.skipChildren(); - }, CompletionSuggestionBuilder.CONTEXTS_FIELD, ObjectParser.ValueType.OBJECT); // context is deprecated + }, CONTEXTS_FIELD, ObjectParser.ValueType.OBJECT); // context is deprecated } private FuzzyOptions fuzzyOptions; @@ -103,6 +103,18 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug } /** + * internal copy constructor that copies over all class fields except for the fieldname which is + * set to the one provided in the first argument + */ + private CompletionSuggestionBuilder(String fieldname, CompletionSuggestionBuilder in) { + super(fieldname, in); + fuzzyOptions = in.fuzzyOptions; + regexOptions = in.regexOptions; + contextBytes = in.contextBytes; + payloadFields = in.payloadFields; + } + + /** * Sets the prefix to provide completions for. * The prefix gets analyzed by the suggest analyzer. */ @@ -184,6 +196,12 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug } } + private String field; + private CompletionSuggestionBuilder field(String fieldName) { + this.field = fieldName; + return this; + } + @Override protected XContentBuilder innerToXContent(XContentBuilder builder, Params params) throws IOException { if (payloadFields.isEmpty() == false) { @@ -209,9 +227,15 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug @Override protected CompletionSuggestionBuilder innerFromXContent(QueryParseContext parseContext) throws IOException { - CompletionSuggestionBuilder builder = new CompletionSuggestionBuilder(); + CompletionSuggestionBuilder builder = new CompletionSuggestionBuilder("_na_"); TLP_PARSER.parse(parseContext.parser(), builder); - return builder; + String field = builder.field; + // now we should have field name, check and copy fields over to the suggestion builder we return + if (field == null) { + throw new ElasticsearchParseException( + "required field [" + SuggestUtils.Fields.FIELD.getPreferredName() + "] is missing"); + } + return new CompletionSuggestionBuilder(field, builder); } @Override @@ -224,10 +248,9 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug suggestionContext.setFuzzyOptions(fuzzyOptions); suggestionContext.setRegexOptions(regexOptions); MappedFieldType mappedFieldType = mapperService.fullName(suggestionContext.getField()); - if (mappedFieldType == null) { - throw new ElasticsearchException("Field [" + suggestionContext.getField() + "] is not a completion suggest field"); - } else if (mappedFieldType instanceof CompletionFieldMapper.CompletionFieldType) { + if (mappedFieldType != null && mappedFieldType instanceof CompletionFieldMapper.CompletionFieldType) { CompletionFieldMapper.CompletionFieldType type = (CompletionFieldMapper.CompletionFieldType) mappedFieldType; + suggestionContext.setFieldType(type); if (type.hasContextMappings() && contextBytes != null) { XContentParser contextParser = XContentFactory.xContent(contextBytes).createParser(contextBytes); suggestionContext.setQueryContexts(parseQueryContexts(contextParser, type)); @@ -247,9 +270,8 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug @Override public void doWriteTo(StreamOutput out) throws IOException { - boolean payloadFieldExists = payloadFields.isEmpty() == false; - out.writeBoolean(payloadFieldExists); - if (payloadFieldExists) { + out.writeBoolean(payloadFields.isEmpty() == false); + if (payloadFields.isEmpty() == false) { out.writeVInt(payloadFields.size()); for (String payloadField : payloadFields) { out.writeString(payloadField); @@ -263,9 +285,8 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug if (regexOptions != null) { regexOptions.writeTo(out); } - boolean queryContextsExists = contextBytes != null; - out.writeBoolean(queryContextsExists); - if (queryContextsExists) { + out.writeBoolean(contextBytes != null); + if (contextBytes != null) { out.writeBytesReference(contextBytes); } } @@ -295,7 +316,7 @@ public class CompletionSuggestionBuilder extends SuggestionBuilder<CompletionSug @Override protected boolean doEquals(CompletionSuggestionBuilder other) { - return Objects.equals(payloadFields, other.payloadFields) && + return Objects.equals(payloadFields, other.payloadFields) && Objects.equals(fuzzyOptions, other.fuzzyOptions) && Objects.equals(regexOptions, other.regexOptions) && Objects.equals(contextBytes, other.contextBytes); diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionContext.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionContext.java index c681455117..f9f948a551 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionContext.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/CompletionSuggestionContext.java @@ -27,10 +27,8 @@ import org.elasticsearch.search.suggest.completion.context.ContextMapping; import org.elasticsearch.search.suggest.completion.context.ContextMappings; import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; /** * @@ -45,7 +43,7 @@ public class CompletionSuggestionContext extends SuggestionSearchContext.Suggest private FuzzyOptions fuzzyOptions; private RegexOptions regexOptions; private Map<String, List<ContextMapping.InternalQueryContext>> queryContexts = Collections.emptyMap(); - private Set<String> payloadFields = Collections.emptySet(); + private List<String> payloadFields = Collections.emptyList(); CompletionFieldMapper.CompletionFieldType getFieldType() { return this.fieldType; @@ -67,15 +65,11 @@ public class CompletionSuggestionContext extends SuggestionSearchContext.Suggest this.queryContexts = queryContexts; } - void setPayloadFields(Set<String> fields) { - this.payloadFields = fields; - } - void setPayloadFields(List<String> fields) { - setPayloadFields(new HashSet<>(fields)); + this.payloadFields = fields; } - Set<String> getPayloadFields() { + List<String> getPayloadFields() { return payloadFields; } diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/FuzzyOptions.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/FuzzyOptions.java index aac58d7cb3..709124443b 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/completion/FuzzyOptions.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/FuzzyOptions.java @@ -40,20 +40,20 @@ import java.util.Objects; */ public class FuzzyOptions implements ToXContent, Writeable<FuzzyOptions> { static final ParseField FUZZY_OPTIONS = new ParseField("fuzzy"); - static final ParseField TRANSPOSITION_FIELD = new ParseField("transpositions"); - static final ParseField MIN_LENGTH_FIELD = new ParseField("min_length"); - static final ParseField PREFIX_LENGTH_FIELD = new ParseField("prefix_length"); - static final ParseField UNICODE_AWARE_FIELD = new ParseField("unicode_aware"); - static final ParseField MAX_DETERMINIZED_STATES_FIELD = new ParseField("max_determinized_states"); + private static final ParseField TRANSPOSITION_FIELD = new ParseField("transpositions"); + private static final ParseField MIN_LENGTH_FIELD = new ParseField("min_length"); + private static final ParseField PREFIX_LENGTH_FIELD = new ParseField("prefix_length"); + private static final ParseField UNICODE_AWARE_FIELD = new ParseField("unicode_aware"); + private static final ParseField MAX_DETERMINIZED_STATES_FIELD = new ParseField("max_determinized_states"); - static ObjectParser<FuzzyOptions.Builder, Void> FUZZY_PARSER = new ObjectParser<>(FUZZY_OPTIONS.getPreferredName(), Builder::new); + private static ObjectParser<Builder, Void> PARSER = new ObjectParser<>(FUZZY_OPTIONS.getPreferredName(), Builder::new); static { - FUZZY_PARSER.declareInt(FuzzyOptions.Builder::setFuzzyMinLength, MIN_LENGTH_FIELD); - FUZZY_PARSER.declareInt(FuzzyOptions.Builder::setMaxDeterminizedStates, MAX_DETERMINIZED_STATES_FIELD); - FUZZY_PARSER.declareBoolean(FuzzyOptions.Builder::setUnicodeAware, UNICODE_AWARE_FIELD); - FUZZY_PARSER.declareInt(FuzzyOptions.Builder::setFuzzyPrefixLength, PREFIX_LENGTH_FIELD); - FUZZY_PARSER.declareBoolean(FuzzyOptions.Builder::setTranspositions, TRANSPOSITION_FIELD); - FUZZY_PARSER.declareValue((a, b) -> { + PARSER.declareInt(Builder::setFuzzyMinLength, MIN_LENGTH_FIELD); + PARSER.declareInt(Builder::setMaxDeterminizedStates, MAX_DETERMINIZED_STATES_FIELD); + PARSER.declareBoolean(Builder::setUnicodeAware, UNICODE_AWARE_FIELD); + PARSER.declareInt(Builder::setFuzzyPrefixLength, PREFIX_LENGTH_FIELD); + PARSER.declareBoolean(Builder::setTranspositions, TRANSPOSITION_FIELD); + PARSER.declareValue((a, b) -> { try { a.setFuzziness(Fuzziness.parse(b).asDistance()); } catch (IOException e) { @@ -82,8 +82,8 @@ public class FuzzyOptions implements ToXContent, Writeable<FuzzyOptions> { private FuzzyOptions() { } - public static FuzzyOptions parse(XContentParser parser) throws IOException { - return FUZZY_PARSER.parse(parser).build(); + static FuzzyOptions parse(XContentParser parser) throws IOException { + return PARSER.parse(parser).build(); } public static Builder builder() { diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/RegexOptions.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/RegexOptions.java index a1dcec2d55..81e524d6e3 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/completion/RegexOptions.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/RegexOptions.java @@ -38,17 +38,14 @@ import java.io.IOException; * Regular expression options for completion suggester */ public class RegexOptions implements ToXContent, Writeable<RegexOptions> { - static final String NAME = "regex"; - static final ParseField REGEX_OPTIONS = new ParseField(NAME); - static final ParseField FLAGS_VALUE = new ParseField("flags", "flags_value"); - static final ParseField MAX_DETERMINIZED_STATES = new ParseField("max_determinized_states"); + static final ParseField REGEX_OPTIONS = new ParseField("regex"); + private static final ParseField FLAGS_VALUE = new ParseField("flags", "flags_value"); + private static final ParseField MAX_DETERMINIZED_STATES = new ParseField("max_determinized_states"); - - private static ObjectParser<RegexOptions.Builder, Void> REGEXP_PARSER = - new ObjectParser<>(REGEX_OPTIONS.getPreferredName(), RegexOptions.Builder::new); + private static ObjectParser<Builder, Void> PARSER = new ObjectParser<>(REGEX_OPTIONS.getPreferredName(), Builder::new); static { - REGEXP_PARSER.declareInt(RegexOptions.Builder::setMaxDeterminizedStates, MAX_DETERMINIZED_STATES); - REGEXP_PARSER.declareField((parser, builder, aVoid) -> { + PARSER.declareInt(Builder::setMaxDeterminizedStates, MAX_DETERMINIZED_STATES); + PARSER.declareField((parser, builder, aVoid) -> { if (parser.currentToken() == XContentParser.Token.VALUE_STRING) { builder.setFlags(parser.text()); } else if (parser.currentToken() == XContentParser.Token.VALUE_NUMBER) { @@ -58,7 +55,7 @@ public class RegexOptions implements ToXContent, Writeable<RegexOptions> { + " " + FLAGS_VALUE.getPreferredName() + " supports string or number"); } }, FLAGS_VALUE, ObjectParser.ValueType.VALUE); - REGEXP_PARSER.declareStringOrNull(RegexOptions.Builder::setFlags, FLAGS_VALUE); + PARSER.declareStringOrNull(Builder::setFlags, FLAGS_VALUE); } private int flagsValue; @@ -91,8 +88,8 @@ public class RegexOptions implements ToXContent, Writeable<RegexOptions> { return new Builder(); } - public static RegexOptions parse(XContentParser parser) throws IOException { - return REGEXP_PARSER.parse(parser).build(); + static RegexOptions parse(XContentParser parser) throws IOException { + return PARSER.parse(parser).build(); } @Override diff --git a/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMapping.java b/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMapping.java index 501f4d153d..959a749a85 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMapping.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/completion/context/ContextMapping.java @@ -96,12 +96,15 @@ public abstract class ContextMapping<T extends QueryContext> implements ToXConte */ protected abstract Set<CharSequence> parseContext(ParseContext.Document document); + /** + * Prototype for the query context + */ protected abstract T prototype(); /** * Parses query contexts for this mapper */ - public List<InternalQueryContext> parseQueryContext(XContentParser parser) throws IOException, ElasticsearchParseException { + public final List<InternalQueryContext> parseQueryContext(XContentParser parser) throws IOException, ElasticsearchParseException { List<T> queryContexts = new ArrayList<>(); Token token = parser.nextToken(); if (token == Token.START_OBJECT || token == Token.VALUE_STRING) { @@ -114,6 +117,9 @@ public abstract class ContextMapping<T extends QueryContext> implements ToXConte return toInternalQueryContexts(queryContexts); } + /** + * Convert query contexts to common representation + */ protected abstract List<InternalQueryContext> toInternalQueryContexts(List<T> queryContexts); /** |