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.SpanQueryable;
import com.silverforge.elasticsearchrawclient.queryDSL.generator.QueryFactory;
import com.silverforge.elasticsearchrawclient.utils.QueryTypeArrayList;
public class SpanNearQuery
implements SpanQueryable {
private QueryTypeArrayList<QueryTypeItem> queryBag;
SpanNearQuery(QueryTypeArrayList<QueryTypeItem> queryBag) {
this.queryBag = queryBag;
}
@Override
public String getQueryString() {
return QueryFactory
.spanNearQueryGenerator()
.generate(queryBag);
}
public static Init<?> builder() {
return new SpanNearQueryBuilder();
}
public static class SpanNearQueryBuilder
extends Init<SpanNearQueryBuilder> {
@Override
protected SpanNearQueryBuilder self() {
return this;
}
}
public static abstract class Init<T extends Init<T>> {
private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>();
protected abstract T self();
public T clauses(SpanQueryable... clauses) {
queryBag.addItem(Constants.CLAUSES, clauses);
return self();
}
public T slop(int slop) {
queryBag.addItem(Constants.SLOP, slop);
return self();
}
public T in_order(boolean inOrder) {
queryBag.addItem(Constants.IN_ORDER, inOrder);
return self();
}
public T collect_payloads(boolean collectPayloads) {
queryBag.addItem(Constants.COLLECT_PAYLOADS, collectPayloads);
return self();
}
public SpanNearQuery build() throws MandatoryParametersAreMissingException {
if(!queryBag.containsKey(Constants.CLAUSES)) {
throw new MandatoryParametersAreMissingException(Constants.CLAUSES);
}
return new SpanNearQuery(queryBag);
}
}
}