package com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries;
import android.text.TextUtils;
import com.silverforge.elasticsearchrawclient.exceptions.MandatoryParametersAreMissingException;
import com.silverforge.elasticsearchrawclient.model.QueryTypeItem;
import com.silverforge.elasticsearchrawclient.queryDSL.Constants;
import com.silverforge.elasticsearchrawclient.definition.Queryable;
import com.silverforge.elasticsearchrawclient.queryDSL.generator.QueryFactory;
import com.silverforge.elasticsearchrawclient.queryDSL.operators.LogicOperator;
import com.silverforge.elasticsearchrawclient.queryDSL.operators.SimpleFlagOperator;
import com.silverforge.elasticsearchrawclient.utils.QueryTypeArrayList;
import java.util.Locale;
import static br.com.zbra.androidlinq.Linq.stream;
public class SimpleQueryStringQuery
implements Queryable {
private QueryTypeArrayList<QueryTypeItem> queryBag;
public SimpleQueryStringQuery(QueryTypeArrayList<QueryTypeItem> queryBag) {
this.queryBag = queryBag;
}
public static Init<?> builder() {
return new SimpleQueryStringQueryBuilder();
}
@Override
public String getQueryString() {
return QueryFactory
.simpleQueryStringQueryGenerator()
.generate(queryBag);
}
public static class SimpleQueryStringQueryBuilder
extends Init<SimpleQueryStringQueryBuilder> {
@Override
protected SimpleQueryStringQueryBuilder self() {
return this;
}
}
public static abstract class Init<T extends Init<T>> {
private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>();
protected abstract T self();
public T query(String query) {
queryBag.addItem(Constants.QUERY, query);
return self();
}
public T fields(String... fields) {
queryBag.addItemsWithParenthesis(Constants.FIELDS, fields);
return self();
}
public T default_operator(LogicOperator defaultOperator) {
String value = defaultOperator.toString();
queryBag.addItem(Constants.DEFAULT_OPERATOR, value);
return self();
}
public T analyzer(String analyzer) {
queryBag.addItem(Constants.ANALYZER, analyzer);
return self();
}
public T flags(SimpleFlagOperator... flags) {
String joinedFlags = TextUtils.join("|", flags);
queryBag.addItem(Constants.FLAGS, joinedFlags);
return self();
}
public T lowercase_expanded_terms(boolean lowercaseExpandedTerms) {
queryBag.addItem(Constants.LOWERCASE_EXPANDED_TERMS, lowercaseExpandedTerms);
return self();
}
public T analyze_wildcard(boolean analyze_wildcard) {
queryBag.addItem(Constants.ANALYZE_WILDCARD, analyze_wildcard);
return self();
}
public T locale(Locale locale) {
String value = locale.toString();
queryBag.addItem(Constants.LOCALE, value);
return self();
}
public T lenient(boolean lenient) {
queryBag.addItem(Constants.LENIENT, lenient);
return self();
}
public T minimum_should_match(String minimumShouldMatch) {
queryBag.addItem(Constants.MINIMUM_SHOULD_MATCH, minimumShouldMatch);
return self();
}
public SimpleQueryStringQuery build() throws MandatoryParametersAreMissingException {
if(!queryBag.containsKey(Constants.QUERY)) {
throw new MandatoryParametersAreMissingException(Constants.QUERY);
}
return new SimpleQueryStringQuery(queryBag);
}
}
}