package com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries;
import com.silverforge.elasticsearchrawclient.exceptions.MandatoryParametersAreMissingException;
import com.silverforge.elasticsearchrawclient.model.QueryTypeItem;
import com.silverforge.elasticsearchrawclient.queryDSL.Constants;
import com.silverforge.elasticsearchrawclient.queryDSL.generator.QueryFactory;
import com.silverforge.elasticsearchrawclient.queryDSL.operators.AnalyzerOperator;
import com.silverforge.elasticsearchrawclient.queryDSL.operators.FuzzinessOperator;
import com.silverforge.elasticsearchrawclient.queryDSL.operators.LogicOperator;
import com.silverforge.elasticsearchrawclient.queryDSL.operators.TimeZoneOperator;
import com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries.common.MinimumShouldMatchQuery;
import com.silverforge.elasticsearchrawclient.utils.QueryTypeArrayList;
public class QueryStringQuery
extends MinimumShouldMatchQuery {
private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>();
QueryStringQuery(QueryTypeArrayList<QueryTypeItem> queryBag) {
this.queryBag = queryBag;
}
@Override
public String getQueryString() {
return QueryFactory
.queryStringQueryGenerator()
.generate(queryBag);
}
public static Init<?> builder() {
return new QueryStringQueryBuilder();
}
public static class QueryStringQueryBuilder
extends Init<QueryStringQueryBuilder> {
@Override
protected QueryStringQueryBuilder self() {
return this;
}
}
public static abstract class Init<T extends Init<T>>
extends MinimumShouldMatchInit<T> {
public T defaultField(String fieldName) {
queryBag.addItem(Constants.DEFAULT_FIELD, fieldName);
return self();
}
public T query(String expression) {
queryBag.addItem(Constants.QUERY, expression);
return self();
}
public T defaultOperator(LogicOperator logicOperator) {
queryBag.addItem(Constants.DEFAULT_OPERATOR, logicOperator.toString());
return self();
}
public T analyzer(AnalyzerOperator analyzerOperator) {
queryBag.addItem(Constants.ANALYZER, analyzerOperator.toString());
return self();
}
public T analyzer(String analyzer) {
queryBag.addItem(Constants.ANALYZER, analyzer);
return self();
}
public T allowLeadingWildcard(boolean allow) {
queryBag.addItem(Constants.ALLOW_LEADING_WILDCARD, allow);
return self();
}
public T lowercaseExpandedTerms(boolean lowerCase) {
queryBag.addItem(Constants.LOWERCASE_EXPANDED_TERMS, lowerCase);
return self();
}
public T enablePositionIncrements(boolean enable) {
queryBag.addItem(Constants.ENABLE_POSITION_INCREMENTS, enable);
return self();
}
public T fuzzyMaxExpansions(int max) {
queryBag.addItem(Constants.FUZZY_MAX_EXPANSIONS, max);
return self();
}
public T fuzzyMaxExpansions(float max) {
queryBag.addItem(Constants.FUZZY_MAX_EXPANSIONS, max);
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 fuzzyPrefixLength(int length) {
queryBag.addItem(Constants.FUZZY_PREFIX_LENGTH, length);
return self();
}
public T fuzzyPrefixLength(float length) {
queryBag.addItem(Constants.FUZZY_PREFIX_LENGTH, length);
return self();
}
public T phraseSlop(int slop) {
queryBag.addItem(Constants.PHRASE_SLOP, slop);
return self();
}
public T phraseSlop(float slop) {
queryBag.addItem(Constants.PHRASE_SLOP, slop);
return self();
}
public T boost(int boost) {
queryBag.addItem(Constants.BOOST, boost);
return self();
}
public T boost(float boost) {
queryBag.addItem(Constants.BOOST, boost);
return self();
}
public T analyzeWildcard(boolean analyze) {
queryBag.addItem(Constants.ANALYZE_WILDCARD, analyze);
return self();
}
public T autoGeneratePhraseQueries(boolean auto) {
queryBag.addItem(Constants.AUTO_GENERATE_PHRASE_QUERIES, auto);
return self();
}
public T maxDeterminizedStates(int max) {
queryBag.addItem(Constants.MAX_DETERMINIZED_STATES, max);
return self();
}
public T maxDeterminizedStates(float max) {
queryBag.addItem(Constants.MAX_DETERMINIZED_STATES, max);
return self();
}
public T lenient(boolean lenient) {
queryBag.addItem(Constants.LENIENT, lenient);
return self();
}
public T locale(String locale) {
queryBag.addItem(Constants.LOCALE, locale);
return self();
}
public T timeZone(String timeZone) {
queryBag.addItem(Constants.TIME_ZONE, timeZone);
return self();
}
public T timeZone(TimeZoneOperator timeZone) {
String value = timeZone.toString();
queryBag.addItem(Constants.TIME_ZONE, value);
return self();
}
public T fields(String... fields) {
queryBag.addItemsWithParenthesis(Constants.FIELDS, fields);
return self();
}
public T useDisMax(boolean use) {
queryBag.addItem(Constants.USE_DIS_MAX, use);
return self();
}
public QueryStringQuery build() throws MandatoryParametersAreMissingException {
if (!queryBag.containsKey(Constants.DEFAULT_FIELD)
&& !queryBag.containsKey(Constants.FIELDS))
throw new MandatoryParametersAreMissingException(Constants.DEFAULT_FIELD, Constants.FIELDS);
if (!queryBag.containsKey(Constants.QUERY))
throw new MandatoryParametersAreMissingException(Constants.QUERY);
return new QueryStringQuery(queryBag);
}
}
}