package alien4cloud.dao;
import java.util.List;
import java.util.Map;
import org.elasticsearch.index.query.FilterBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.mapping.FilterValuesStrategy;
import org.elasticsearch.mapping.QueryHelper;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import alien4cloud.dao.model.FacetedSearchResult;
import alien4cloud.dao.model.GetMultipleDataResult;
/**
* A Dao that supports search and/or filter based queries.
*/
public interface IGenericSearchDAO extends IGenericIdDAO {
/**
* Return the dao {@link QueryHelper}
*
* @return
*/
QueryHelper getQueryHelper();
/**
* Get the index in which a class belongs.
*
* @param clazz The class for which to get the index.
* @return The name of the index in which the class lies.
*/
String getIndexForType(Class<?> clazz);
/**
* Count the number of objects in the index in which a given class lies. The result is not limited to the actual given type.
*
* @param clazz Class of the object. This is used to retrieve the index on which to perform the count. The current query do not query only the given type
* but all object in the index.
* @param query Additional query.
* @return The number of objects in the index in which the given class lies (Note some other types may lies in the same index and be counted also.
*/
<T> long count(Class<T> clazz, QueryBuilder query);
/**
* Count the number of objects in the index that matches (based on class name) the given class, search text and filters.
*
* @param clazz The type of data to query.
* @param searchText The text of the search request (null to match all).
* @param filters The filters to apply to the request.
* @return The number of objects matching the query.
*/
<T> long count(Class<T> clazz, String searchText, Map<String, String[]> filters);
/**
* Delete a data by query
*
* @param clazz
* @param query
*/
void delete(Class<?> clazz, QueryBuilder query);
/**
* Run a custom query on elastic search for the given class.
*
* @param clazz The type of data to query.
* @param query The query to execute.
* @return A single result.
*/
<T> T customFind(Class<T> clazz, QueryBuilder query);
/**
* Run a custom query on elastic search for the given class.
*
* @param clazz The type of data to query.
* @param query The query to execute.
* @param sortBuilder the sort configuration
* @return A single result.
*/
<T> T customFind(Class<T> clazz, QueryBuilder query, SortBuilder sortBuilder);
/**
* Run a custom query on elastic search for the given class.
*
* @param clazz The type of data to query.
* @param query The query to execute.
* @return All result.
*/
<T> List<T> customFindAll(Class<T> clazz, QueryBuilder query);
/**
* Run a custom query on elastic search for the given class.
*
* @param clazz The type of data to query.
* @param query The query to execute.
* @param sortBuilder the sort configuration
* @return All result.
*/
<T> List<T> customFindAll(Class<T> clazz, QueryBuilder query, SortBuilder sortBuilder);
/**
* Run a query build from a {@link QueryHelper.ISearchQueryBuilderHelper}.
*
* @param queryHelperBuilder The query builder that contains the query to run.
* @param from Offset from the first result you want to fetch.
* @param maxElements The maximum number of elements to return.
* @return A {@link GetMultipleDataResult} that contains the search response.
*/
GetMultipleDataResult<Object> search(QueryHelper.ISearchQueryBuilderHelper queryHelperBuilder, int from, int maxElements);
/**
* Search for data.
*
* @param clazz The type of data to query.
* @param searchText The search text if any.
* @param filters The filters for the search or null if no filters.
* @param maxElements The maximum number of elements to return.
* @return A {@link GetMultipleDataResult} instance that contains the result data. Empty instance if no data found.
*/
<T> GetMultipleDataResult<T> search(Class<T> clazz, String searchText, Map<String, String[]> filters, int maxElements);
/**
* Same as {@link IGenericSearchDAO#search(Class, String, Map, int)}, but with pagination supported.
*
* @param clazz The type of data to query.
* @param searchText The search text if any.
* @param filters The filters for the search or null if no filters.
* @param from Offset from the first result you want to fetch.
* @param maxElements The maximum number of elements to return.
* @return A {@link GetMultipleDataResult} instance that contains the result data. Empty instance if no data found.
* @see IGenericSearchDAO#search(Class, String, Map, int)
*/
<T> GetMultipleDataResult<T> search(Class<T> clazz, String searchText, Map<String, String[]> filters, int from, int maxElements);
/**
* Same as {@link IGenericSearchDAO#search(Class, String, Map, int)}, but with pagination supported.
*
* @param clazz The type of data to query.
* @param searchText The search text if any.
* @param filters The filters for the search or null if no filters.
* @param fetchContext A fetch context to define a partial response.
* @param from Offset from the first result you want to fetch.
* @param maxElements The maximum number of elements to return.
* @return A {@link GetMultipleDataResult} instance that contains the result data. Empty instance if no data found.
* @see IGenericSearchDAO#search(Class, String, Map, int)
*/
<T> GetMultipleDataResult<T> search(Class<T> clazz, String searchText, Map<String, String[]> filters, String fetchContext, int from, int maxElements);
/**
* Same as {@link IGenericSearchDAO#search(Class, String, Map, int)}, but with pagination supported.
*
* @param clazz The type of data to query.
* @param searchText The search text if any.
* @param filters The filters for the search or null if no filters.
* @param fetchContext A fetch context to define a partial response.
* @param from Offset from the first result you want to fetch.
* @param maxElements The maximum number of elements to return.
* @param fieldSort field to sort on
* @param sortOrder order for the sort (false = ascending or true = descending)
* @return A {@link GetMultipleDataResult} instance that contains the result data. Empty instance if no data found.
* @see IGenericSearchDAO#search(Class, String, Map, int)
*/
<T> GetMultipleDataResult<T> search(Class<T> clazz, String searchText, Map<String, String[]> filters, FilterBuilder customFilter, String fetchContext,
int from, int maxElements, String fieldSort, boolean sortOrder);
/**
* Same as {@link IGenericSearchDAO#search(Class, String, Map, int)}, but with pagination supported.
*
* @param clazz The type of data to query.
* @param searchText The search text if any.
* @param filters The filters for the search or null if no filters.
* @param customFilter The custom defined filter
* @param fetchContext A fetch context to define a partial response.
* @param from Offset from the first result you want to fetch.
* @param maxElements The maximum number of elements to return.
* @return A {@link GetMultipleDataResult} instance that contains the result data. Empty instance if no data found.
* @see IGenericSearchDAO#search(Class, String, Map, int)
*/
<T> GetMultipleDataResult<T> search(Class<T> clazz, String searchText, Map<String, String[]> filters, FilterBuilder customFilter, String fetchContext,
int from, int maxElements);
/**
* Performs a search on the given indices
*
* @param searchIndices Indices in which to search.
* @param classes Classes to search.
* @param searchText The text to search for.
* @param from start element in the search.
* @param filters The filters for the search.
* @param fetchContext A fetch context to define a partial response.
* @param maxElements Maximum number of elements to get.
* @return A {@link GetMultipleDataResult} that contains the various elements to get.
*/
GetMultipleDataResult<Object> search(String[] searchIndices, Class<?>[] classes, String searchText, Map<String, String[]> filters, String fetchContext,
int from, int maxElements);
/**
* Performs a search on the given indices
*
* @param searchIndices Indices in which to search.
* @param classes Classes to search.
* @param searchText The text to search for.
* @param from start element in the search.
* @param filters The filters for the search.
* @param customFilter The custom defined filter.
* @param fetchContext A fetch context to define a partial response.
* @param maxElements Maximum number of elements to get.
* @return A {@link GetMultipleDataResult} that contains the various elements to get.
*/
GetMultipleDataResult<Object> search(String[] searchIndices, Class<?>[] classes, String searchText, Map<String, String[]> filters,
FilterBuilder customFilter, String fetchContext, int from, int maxElements);
/**
* Search for data and get a list of facets if any are configured.
*
* @param clazz The type of data to query.
* @param searchText The search text if any.
* @param filters The filters for the search.
* @param maxElements The maximum number of elements to return.
* @return A {@link FacetedSearchResult} instance that contains the result data and associated facets. Empty instance if no data found.
*/
<T> FacetedSearchResult facetedSearch(Class<T> clazz, String searchText, Map<String, String[]> filters, int maxElements);
/**
* Same as {@link IGenericSearchDAO#facetedSearch(Class, String, Map, int)}, but with pagination supported.
*
* @param clazz The type of data to query.
* @param searchText The search text if any.
* @param filters The filters for the search.
* @param fetchContext A fetch context to define a partial response.
* @param from Offset from the first result you want to fetch.
* @param maxElements The maximum number of elements to return.
* @return A {@link FacetedSearchResult} instance that contains the result data and associated facets. Empty instance if no data found.
* @see IGenericSearchDAO#facetedSearch(Class, String, Map, int)
*/
<T> FacetedSearchResult facetedSearch(Class<T> clazz, String searchText, Map<String, String[]> filters, String fetchContext, int from, int maxElements);
/**
* Same as {@link IGenericSearchDAO#facetedSearch(Class, String, Map, int)}, but with pagination supported.
*
* @param clazz The type of data to query.
* @param searchText The search text if any.
* @param filters The filters for the search.
* @param customFilter The custom defined filter.
* @param fetchContext A fetch context to define a partial response.
* @param from Offset from the first result you want to fetch.
* @param maxElements The maximum number of elements to return.
* @return A {@link FacetedSearchResult} instance that contains the result data and associated facets. Empty instance if no data found.
* @see IGenericSearchDAO#facetedSearch(Class, String, Map, int)
*/
<T> FacetedSearchResult facetedSearch(Class<T> clazz, String searchText, Map<String, String[]> filters, FilterBuilder customFilter, String fetchContext,
int from, int maxElements);
/**
* Same as {@link IGenericSearchDAO#facetedSearch(Class, String, Map, int)}, but with pagination supported.
*
* @param clazz The type of data to query.
* @param searchText The search text if any.
* @param filters The filters for the search.
* @param customFilter The custom defined filter.
* @param fetchContext A fetch context to define a partial response.
* @param from Offset from the first result you want to fetch.
* @param maxElements The maximum number of elements to return.
* @param fieldSort field to sort on
* @param sortOrder order for the sort (false = ascending or true = descending)
* @return A {@link FacetedSearchResult} instance that contains the result data and associated facets. Empty instance if no data found.
* @see IGenericSearchDAO#facetedSearch(Class, String, Map, int)
*/
<T> FacetedSearchResult facetedSearch(Class<T> clazz, String searchText, Map<String, String[]> filters, FilterBuilder customFilter, String fetchContext,
int from, int maxElements, String fieldSort, boolean sortOrder);
/**
* Perform a suggestion search on a specific field.
*
* @param searchIndices The indices to search for.
* @param requestedTypes The types to include in the query.
* @param suggestFieldPath The path to the field for which to manage suggestion.
* @param searchPrefix The value of the current prefix for suggestion.
* @param fetchContext The fetch context to recover only the required field (Note that this should be simplified to directly use the given field...).
* @param from The start index for suggestion (usually 0).
* @param maxElements The maximum number of elements to retrieve for suggestion.
* @return A {@link GetMultipleDataResult} that contains data matching the requested suggestion.
*/
GetMultipleDataResult<Object> suggestSearch(String[] searchIndices, Class<?>[] requestedTypes, String suggestFieldPath, String searchPrefix,
String fetchContext, int from, int maxElements);
/**
* find data matching the given type and filters.
*
* @param clazz The type of data to query.
* @param filters The filters for the search or null if no filters.
* @param maxElements The maximum number of elements to return.
* @return A {@link GetMultipleDataResult} instance that contains the result data.
*/
<T> GetMultipleDataResult<T> find(Class<T> clazz, Map<String, String[]> filters, int maxElements);
/**
* Same as {@link IGenericSearchDAO#find(Class, Map, int)}, but with pagination supported.
*
* @param clazz The type of data to query.
* @param filters The filters for the search or null if no filters.
* @param from Offset from the first result you want to fetch.
* @param maxElements The maximum number of elements to return.
* @return A {@link GetMultipleDataResult} instance that contains the result data.
* @see IGenericSearchDAO#find(Class, Map, int)
*/
<T> GetMultipleDataResult<T> find(Class<T> clazz, Map<String, String[]> filters, int from, int maxElements);
/**
* Get the Map of types to classes
*
* @return
*/
Map<String, Class<?>> getTypesToClasses();
/**
* Get the Map of types to indexes
*
* @return
*/
Map<String, String> getTypesToIndices();
/**
* Search for data. allowing filter strategy "AND, OR" when multiple values in the filter
*
* @param clazz The type of data to query.
* @param searchText The search text if any.
* @param filters The filters for the search or null if no filters.
* @param filterStrategies A map containing {@link FilterValuesStrategy}. A key correspond to a filter key. for values, see {@link FilterValuesStrategy}
* @param maxElements The maximum number of elements to return.
* @return A {@link GetMultipleDataResult} instance that contains the result data. Empty instance if no data found.
*/
<T> GetMultipleDataResult<T> search(Class<T> clazz, String searchText, Map<String, String[]> filters, Map<String, FilterValuesStrategy> filterStrategies,
int maxElements);
/**
* Find instances by id, only retrieve specific fields of the object.
*
* @param clazz The class for which to find an instance.
* @param ids array of id of the data to find.
* @param fetchContext The fetch context to recover only the required field (Note that this should be simplified to directly use the given field...).
* @return List of Objects that has the given ids or null if no object matching the request is found.
*/
<T> List<T> findByIdsWithContext(Class<T> clazz, String fetchContext, String... ids);
/**
* Select the list of value for the path
*
* @param index the index
* @param types the types
* @param queryBuilder the query to filter
* @param sortOrder sort the returned result
* @param path the path to select
* @param from offset
* @param size size
* @return the list of value for the path
*/
String[] selectPath(String index, Class<?>[] types, QueryBuilder queryBuilder, SortOrder sortOrder, String path, int from, int size);
/**
* Select the list of value for the path
*
* @param index the index
* @param types the types
* @param queryBuilder the query to filter
* @param sortOrder sort the returned result
* @param path the path to select
* @param from offset
* @param size size
* @return the list of value for the path
*/
String[] selectPath(String index, String[] types, QueryBuilder queryBuilder, SortOrder sortOrder, String path, int from, int size);
/**
* Create a query builder for the given class based on a match all query.
*
* @return an instance of IESQueryBuilderHelper for the given class.
*/
public <T> IESQueryBuilderHelper<T> buildQuery(Class<T> clazz);
/**
* Create a query builder for the given class.
*
* @return an instance of IESQueryBuilderHelper for the given class.
*/
public <T> IESQueryBuilderHelper<T> buildSearchQuery(Class<T> clazz, String searchQuery);
/**
* Create a query builder for the given class.
*
* @return an instance of IESQueryBuilderHelper for the given class.
*/
public <T> IESQueryBuilderHelper<T> buildSuggestionQuery(Class<T> clazz, String prefixField, String searchQuery);
}