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.queryDSL.operators.ScoreModeOperator;
import com.silverforge.elasticsearchrawclient.queryDSL.queries.innerQueries.common.BoostQuery;
import com.silverforge.elasticsearchrawclient.utils.QueryTypeArrayList;
import java.util.ArrayList;
import java.util.List;
import static br.com.zbra.androidlinq.Linq.*;
public class HasChildQuery
implements Queryable {
private QueryTypeArrayList<QueryTypeItem> queryBag;
protected HasChildQuery(QueryTypeArrayList<QueryTypeItem> queryBag) {
this.queryBag = queryBag;
}
public static Init<?> builder() {
return new HasChildQueryBuilder();
}
@Override
public String getQueryString() {
return QueryFactory
.hasChildQueryGenerator()
.generate(queryBag);
}
public static class HasChildQueryBuilder
extends Init<HasChildQueryBuilder> {
@Override
protected HasChildQueryBuilder self() {
return this;
}
}
public static abstract class Init<T extends Init<T>>
extends BoostQuery.BoostInit<T> {
public T query(Queryable query) {
queryBag.addItem(Constants.QUERY, query);
return self();
}
public T type(String type) {
queryBag.addItem(Constants.TYPE, type);
return self();
}
public T scoreMode(ScoreModeOperator scoreModeOperator) {
String value = scoreModeOperator.toString();
queryBag.addItem(Constants.SCORE_MODE, value);
return self();
}
public T minChildren(int minChildren) {
queryBag.addItem(Constants.MIN_CHILDREN, minChildren);
return self();
}
public T maxChildren(int maxChildren) {
queryBag.addItem(Constants.MAX_CHILDREN, maxChildren);
return self();
}
public HasChildQuery build() throws MandatoryParametersAreMissingException {
List<String> missingParams = new ArrayList<>();
if(!queryBag.containsKey(Constants.TYPE)) {
missingParams.add(Constants.TYPE);
}
if(!queryBag.containsKey(Constants.QUERY)) {
missingParams.add(Constants.QUERY);
}
if(stream(missingParams).count() > 0) {
throw new MandatoryParametersAreMissingException(missingParams.toString());
}
return new HasChildQuery(queryBag);
}
}
}