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.utils.QueryTypeArrayList; public class NestedQuery implements Queryable { private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>(); NestedQuery(QueryTypeArrayList<QueryTypeItem> queryBag) { this.queryBag = queryBag; } public static NestedQueryBuilder builder() { return new NestedQueryBuilder(); } @Override public String getQueryString() { return QueryFactory .nestedQueryGenerator() .generate(queryBag); } public static class NestedQueryBuilder extends Init<NestedQueryBuilder> { @Override protected NestedQueryBuilder self() { return this; } } public static abstract class Init<T extends Init<T>> { private QueryTypeArrayList<QueryTypeItem> queryBag = new QueryTypeArrayList<>(); protected abstract T self(); public T path(String path) { queryBag.addItem(Constants.PATH, path); return self(); } public T query(Queryable query) { queryBag.addItem(Constants.QUERY, query); return self(); } public T scoreMode(ScoreModeOperator scoreMode) { queryBag.addItem(Constants.SCORE_MODE, scoreMode.toString()); return self(); } public NestedQuery build() throws MandatoryParametersAreMissingException { if (!queryBag.containsKey(Constants.PATH)) throw new MandatoryParametersAreMissingException(Constants.PATH); if (!queryBag.containsKey(Constants.QUERY)) throw new MandatoryParametersAreMissingException(Constants.QUERY); return new NestedQuery(queryBag); } } }