package alien4cloud.dao;
import java.util.Map;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.index.query.FilterBuilder;
import org.elasticsearch.mapping.FilterValuesStrategy;
import org.elasticsearch.mapping.ISearchBuilderAdapter;
import org.elasticsearch.mapping.QueryBuilderAdapter;
import org.elasticsearch.search.aggregations.metrics.tophits.TopHitsBuilder;
import alien4cloud.dao.model.FacetedSearchResult;
import alien4cloud.dao.model.GetMultipleDataResult;
/**
*
*/
public interface IESSearchQueryBuilderHelper<T> extends IESQueryBuilderHelper<T> {
/**
* Execute a search query and get a single element or null if no elements can be found.
* Note that the query may have multiple valid results but only a single one will be returned. Based on the query syntax and sort parameters different
* results may be returned every time.
*
* @return the first matching instance or null if none can be found.
*/
T find();
/**
* Execute a search query using the defined query.
*
* @param from The start index of the search (for pagination).
* @param size The maximum number of elements to return.
*/
GetMultipleDataResult<T> search(int from, int size);
/**
* Execute a search query using the defined query with facets (aggregations).
*
* @param from The start index of the search (for pagination).
* @param size The maximum number of elements to return.
*/
FacetedSearchResult<T> facetedSearch(int from, int size);
/**
* Execute a search query using the defined query with facets (aggregations) and use the provided IAggregationQueryManager to fetch data from an aggregation
* rather than query result.
*
* @param aggregationQueryManager The aggregation query manager that manages the query through aggregation.
* @return The facet search result that contains data from the aggregation as well as other facets.
*/
FacetedSearchResult facetedSearch(IAggregationQueryManager aggregationQueryManager);
/**
* Get the underlying search request builder.
*
* @return The underlying search request builder.
*/
SearchRequestBuilder getSearchRequestBuilder();
/**
* Execute the given consumer to alter the search request builder.
*
* @param searchBuilderAdapter the search request builder adapter to alter the search request.
*/
IESSearchQueryBuilderHelper<T> alterSearchRequestBuilder(ISearchBuilderAdapter searchBuilderAdapter);
/**
* Allows to define a sort field.
*
* @param fieldName Name of the field to sort.
* @param desc Descending or Ascending
* @return this
*/
IESSearchQueryBuilderHelper<T> setFieldSort(String fieldName, boolean desc);
/**
* Add a fetch context to the query.
*
* @param fetchContext The fetch context to add to the query.
*/
IESSearchQueryBuilderHelper<T> setFetchContext(String fetchContext);
/**
* Apply the fetch context to the given aggregation (BUT DOES NOT add it to the query).
*
* @param fetchContext The fetch context to add to the aggregation.
* @param topHitsBuilder The top hits aggregation builder on which to add fetch context include and excludes.
* @return The search query builder helper with the top
*/
IESSearchQueryBuilderHelper<T> setFetchContext(String fetchContext, TopHitsBuilder topHitsBuilder);
@Override
IESSearchQueryBuilderHelper<T> alterQueryBuilder(QueryBuilderAdapter queryBuilderAdapter);
@Override
IESSearchQueryBuilderHelper<T> setScriptFunction(String functionScore);
@Override
IESSearchQueryBuilderHelper<T> setFilters(FilterBuilder... customFilter);
@Override
IESSearchQueryBuilderHelper<T> setFilters(Map<String, String[]> filters, FilterBuilder... customFilters);
@Override
IESSearchQueryBuilderHelper<T> setFilters(Map<String, String[]> filters, Map<String, FilterValuesStrategy> filterStrategies,
FilterBuilder... customFilters);
}