package com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries; import com.silverforge.elasticsearchrawclient.exceptions.MandatoryParametersAreMissingException; import com.silverforge.elasticsearchrawclient.queryDSL.operators.AnalyzerOperator; import com.silverforge.elasticsearchrawclient.queryDSL.operators.FuzzinessOperator; import com.silverforge.elasticsearchrawclient.queryDSL.operators.FuzzyRewriteOperator; import com.silverforge.elasticsearchrawclient.queryDSL.operators.LogicOperator; import com.silverforge.elasticsearchrawclient.queryDSL.operators.MultiMatchTypeOperator; import com.silverforge.elasticsearchrawclient.queryDSL.operators.PhraseTypeOperator; import com.silverforge.elasticsearchrawclient.queryDSL.operators.ZeroTermsQueryOperator; import com.silverforge.elasticsearchrawclient.queryDSL.operators.ZeroToOneRangeOperator; import com.silverforge.elasticsearchrawclient.queryDSL.Constants; import com.silverforge.elasticsearchrawclient.model.QueryTypeItem; import com.silverforge.elasticsearchrawclient.queryDSL.generator.QueryFactory; import com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries.common.MinimumShouldMatchQuery; import com.silverforge.elasticsearchrawclient.utils.QueryTypeArrayList; import com.silverforge.elasticsearchrawclient.utils.StringUtils; public class MultiMatchQuery extends MinimumShouldMatchQuery { private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>(); MultiMatchQuery(QueryTypeArrayList<QueryTypeItem> queryBag) { this.queryBag = queryBag; } @Override public String getQueryString() { return QueryFactory .multiMatchQueryGenerator() .generate(queryBag); } public static Init<?> builder() { return new MultiMatchQueryBuilder(); } public static class MultiMatchQueryBuilder extends Init<MultiMatchQueryBuilder> { @Override protected MultiMatchQueryBuilder self() { return this; } } public static abstract class Init<T extends Init<T>> extends MinimumShouldMatchInit<T> { public T fields(String... fields) { return fields(fields, false); } public T fields(String[] fields, boolean isEdge) { if (!queryBag.containsKey(Constants.FIELDS)) { String format; if (isEdge) format = "[%s.edge]"; else format = "[%s]"; String fieldList = String.format(format, StringUtils.makeCommaSeparatedListWithQuotationMark(fields)); queryBag.add(QueryTypeItem .builder() .name(Constants.FIELDS) .value(fieldList) .build()); } return self(); } public T useDisMax(boolean use) { queryBag.addItem(Constants.USE_DIS_MAX, use); return self(); } public T tieBreaker(ZeroToOneRangeOperator tieBreakerOperator) { String value = tieBreakerOperator.toString(); queryBag.addItem(Constants.TIE_BREAKER, value); return self(); } public T type(MultiMatchTypeOperator typeOperator) { String value = typeOperator.toString(); queryBag.addItem(Constants.TYPE, value); return self(); } public T analyzer(String analyzer) { queryBag.addItem(Constants.ANALYZER, analyzer); return self(); } public T analyzer(AnalyzerOperator analyzer) { String value = analyzer.toString(); queryBag.addItem(Constants.ANALYZER, value); return self(); } public T fuzziness(FuzzinessOperator fuzzinessOperator) { String value = fuzzinessOperator.toString(); queryBag.addItem(Constants.FUZZINESS, value); return self(); } public T fuzziness(String fuzzinessOperator) { queryBag.addItem(Constants.FUZZINESS, fuzzinessOperator); return self(); } public T fuzzyRewrite(FuzzyRewriteOperator fuzzyRewriteOperator) { return fuzzyRewrite(fuzzyRewriteOperator, (byte) 1); } public T fuzzyRewrite(FuzzyRewriteOperator fuzzyRewriteOperator, byte topN) { if (!queryBag.containsKey(Constants.FUZZY_REWRITE)) { if (fuzzyRewriteOperator == FuzzyRewriteOperator.TOP_TERMS_N || fuzzyRewriteOperator == FuzzyRewriteOperator.TOP_TERMS_BOOST_N) { String fuzzyRewriteTop = fuzzyRewriteOperator.toString().replace("_N", "_" + topN); queryBag.add(QueryTypeItem .builder() .name(Constants.FUZZY_REWRITE) .value(fuzzyRewriteTop) .build()); } else { queryBag.add(QueryTypeItem .builder() .name(Constants.FUZZY_REWRITE) .value(fuzzyRewriteOperator.toString()) .build()); } } return self(); } public T lenient(boolean lenient) { queryBag.addItem(Constants.LENIENT, lenient); return self(); } public T maxExpansions(int maxExpansions) { queryBag.addItem(Constants.MAX_EXPANSIONS, maxExpansions); return self(); } public T operator(LogicOperator queryOperator) { String value = queryOperator.toString(); queryBag.addItem(Constants.OPERATOR, value); return self(); } public T prefixLength(int prefixLength) { queryBag.addItem(Constants.PREFIX_LENGTH, prefixLength); return self(); } public T query(String queryExpression) { queryBag.addItem(Constants.QUERY, queryExpression); return self(); } public T type(PhraseTypeOperator phraseTypeOperator) { String value = phraseTypeOperator.toString(); queryBag.addItem(Constants.TYPE, value); return self(); } public T zeroTermsQuery(ZeroTermsQueryOperator zeroTermsQueryOperator) { String value = zeroTermsQueryOperator.toString(); queryBag.addItem(Constants.ZERO_TERMS_QUERY, value); return self(); } public MultiMatchQuery build() throws MandatoryParametersAreMissingException { if (!queryBag.containsKey(Constants.QUERY)) throw new MandatoryParametersAreMissingException(Constants.QUERY); if (!queryBag.containsKey(Constants.FIELDS)) throw new MandatoryParametersAreMissingException(Constants.FIELDS); return new MultiMatchQuery(queryBag); } } }