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.definition.Queryable;
import com.silverforge.elasticsearchrawclient.queryDSL.generator.QueryFactory;
import com.silverforge.elasticsearchrawclient.utils.QueryTypeArrayList;
public class TermsQuery
implements Queryable {
private QueryTypeArrayList<QueryTypeItem> queryBag;
TermsQuery(QueryTypeArrayList<QueryTypeItem> queryBag) {
this.queryBag = queryBag;
}
@Override
public String getQueryString() {
return QueryFactory
.termsQueryGenerator()
.generate(queryBag);
}
public static Init<?> builder() {
return new TermsQueryBuilder();
}
public static class TermsQueryBuilder
extends Init<TermsQueryBuilder> {
@Override
protected TermsQueryBuilder self() {
return this;
}
}
public static abstract class Init<T extends Init<T>> {
private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>();
protected abstract T self();
private String fieldName;
public T fieldName(String fieldname) {
this.fieldName = fieldname;
return self();
}
public T values(String... values) {
queryBag.addItemsWithParenthesis(fieldName, values);
return self();
}
public TermsQuery build() throws MandatoryParametersAreMissingException {
if(queryBag.isEmpty()) {
throw new MandatoryParametersAreMissingException(Constants.FIELD_NAME, Constants.VALUES);
}
return new TermsQuery(queryBag);
}
}
}