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;
import java.util.Map;
public class TemplateQuery
implements Queryable {
private QueryTypeArrayList<QueryTypeItem> queryBag;
public TemplateQuery(QueryTypeArrayList<QueryTypeItem> queryBag) {
this.queryBag = queryBag;
}
public static Init<?> builder() {
return new TemplateQueryBuilder();
}
@Override
public String getQueryString() {
return QueryFactory
.templateQueryGenerator()
.generate(queryBag);
}
public static class TemplateQueryBuilder
extends Init<TemplateQueryBuilder> {
@Override
protected TemplateQueryBuilder self() {
return this;
}
}
public static abstract class Init<T extends Init<T>> {
private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>();
protected abstract T self();
public T inline(Queryable inline) {
queryBag.addItem(Constants.INLINE, inline);
return self();
}
public T inline(String inline) {
queryBag.addItem(Constants.INLINE, inline);
return self();
}
public T params(Map<String, String> params) {
queryBag.addItem(Constants.PARAMS, params);
return self();
}
public T file(String file) {
queryBag.addItem(Constants.FILE, file);
return self();
}
public T id(String id) {
queryBag.addItem(Constants.ID, id);
return self();
}
public TemplateQuery build() throws MandatoryParametersAreMissingException {
if(!queryBag.containsKey(Constants.INLINE) && !queryBag.containsKey(Constants.FILE) && !queryBag.containsKey(Constants.ID)) {
throw new MandatoryParametersAreMissingException(Constants.INLINE,Constants.FILE,Constants.ID);
}
return new TemplateQuery(queryBag);
}
}
}