package org.molgenis.data.elasticsearch.request;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchType;
import org.molgenis.data.Entity;
import org.molgenis.data.Query;
import org.molgenis.data.meta.model.Attribute;
import org.molgenis.data.meta.model.EntityType;
import java.util.Arrays;
import java.util.List;
/**
* Builds a ElasticSearch search request
*
* @author erwin
*/
public class SearchRequestGenerator
{
private final List<? extends QueryPartGenerator> queryGenerators;
private final AggregateQueryGenerator aggregateQueryGenerator;
public SearchRequestGenerator()
{
aggregateQueryGenerator = new AggregateQueryGenerator();
queryGenerators = Arrays.asList(new QueryGenerator(), new SortGenerator(), new LimitOffsetGenerator());
}
/**
* Writes a query to a {@link SearchRequestBuilder}.
*
* @param searchRequestBuilder
* @param entityName
* @param searchType
* @param aggAttr1 First Field to aggregate on
* @param aggAttr2 Second Field to aggregate on
* @param entityType
*/
public void buildSearchRequest(SearchRequestBuilder searchRequestBuilder, String entityName, SearchType searchType,
Query<Entity> query, Attribute aggAttr1, Attribute aggAttr2,
Attribute aggAttrDistinct, EntityType entityType)
{
searchRequestBuilder.setSearchType(searchType);
// Document type
if (entityName != null)
{
searchRequestBuilder.setTypes(entityName);
}
// Generate query
if (query != null)
{
for (QueryPartGenerator generator : queryGenerators)
{
generator.generate(searchRequestBuilder, query, entityType);
}
}
// Aggregates
if (aggAttr1 != null || aggAttr2 != null)
{
aggregateQueryGenerator.generate(searchRequestBuilder, aggAttr1, aggAttr2, aggAttrDistinct);
}
}
}