com.kasinf.framework.rest.support.Searchable Maven / Gradle / Ivy
The newest version!
package com.kasinf.framework.rest.support;
import com.kasinf.framework.rest.exception.InvalidSearchPropertyException;
import com.kasinf.framework.rest.exception.InvalidSearchValueException;
import com.kasinf.framework.rest.exception.SearchException;
import com.kasinf.framework.rest.support.filter.SearchFilter;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* @author lkhsh
* 查询条件接口
*/
public interface Searchable {
/**
* 创建一个新的查询
*
* @return 查询实现类 {@link SearchRequest}
*/
static Searchable of() {
return new SearchRequest();
}
/**
* lambda 初始化接口
*
* @param request 函数式入参
* @return 查询实现类 {@link SearchRequest}
*/
static Searchable of(Function request){
return request.apply(new SearchRequest());
}
/**
* 创建一个新的查询,带条件
*
* @param searchParams 查询的条件
* @return 查询实现类 {@link SearchRequest}
*/
static Searchable of(final Map searchParams) throws SearchException {
return new SearchRequest(searchParams);
}
/**
* 创建一个新的查询,带条件,分页
*
* @param searchParams 查询的条件
* @param page 分页条件
* @return 查询实现类 {@link SearchRequest}
* @throws SearchException 自定义查询异常
*/
static Searchable of(final Map searchParams, final Pageable page) throws SearchException {
return new SearchRequest(searchParams, page);
}
/**
* 创建一个新的查询,带条件,排序
*
* @param searchParams 查询的条件
* @param sort 排序条件
* @return 查询实现类 {@link SearchRequest}
* @throws SearchException 自定义查询异常
*/
static Searchable of(final Map searchParams, final Sort sort) throws SearchException {
return new SearchRequest(searchParams, sort);
}
/**
* 创建一个新的查询,待条件,分页,排序
*
* @param searchParams 查询的条件
* @param page 分页条件
* @param sort 排序条件
* @return 查询实现类 {@link SearchRequest}
* @throws SearchException 自定义查询异常
*/
static Searchable of(final Map searchParams, final Pageable page, final Sort sort) {
return new SearchRequest(searchParams, page, sort);
}
/**
* 添加过滤条件 如key="parent.id_eq" value = 1
* 如果添加时不加操作符 默认是custom 即如key=parent 实际key是parent_custom
*
* @param key 如 name_like
* @param value 如果是in查询 多个值之间","分隔
* @return 查询实现类 {@link SearchRequest}
* @throws SearchException 自定义查询异常
*/
Searchable addParam(final String key, final Object value) throws SearchException;
/**
* 添加一组查询参数
*
* @param searchParams 查询条件
* @return 查询实现类 {@link SearchRequest}
* @throws SearchException 自定义查询异常
*/
Searchable addParams(final Map searchParams) throws SearchException;
/**
* 添加过滤条件
*
* @param searchProperty 查询的属性名
* @param operator 操作运算符
* @param value 值
* @return 查询实现类 {@link SearchRequest}
* @throws SearchException 自定义查询异常
*/
Searchable addFilter(final String searchProperty, final SearchOperator operator, final Object value) throws SearchException;
/**
* 添加单目运算符的条件
* @param searchProperty 查询的属性名
* @param operator 单目运算操作
* @return 查询实现类 {@link SearchRequest}
* @throws SearchException 自定义查询异常
*/
Searchable addFilter(final String searchProperty, final SearchOperator operator) throws SearchException;
/**
* 添加过滤条件
*
* @param searchFilter 查询条件{@link SearchFilter}
* @return 查询实现类 {@link SearchRequest}
*/
Searchable addFilter(final SearchFilter searchFilter);
/**
* 添加多个过滤条件
*
* @param searchFilters 过滤条件{@link SearchFilter}
* @return 查询实现类 {@link SearchRequest}
*/
Searchable addFilters(final Collection extends SearchFilter> searchFilters);
/**
* 添加多个or连接的过滤条件
*
* @param first 第一个
* @param others 其他
* @return 查询实现类 {@link SearchRequest}
*/
Searchable or(final SearchFilter first, final SearchFilter... others);
/**
* 添加多个and连接的过滤条件
*
* @param first 第一个
* @param others 其他
* @return 查询实现类 {@link SearchRequest}
*/
Searchable and(final SearchFilter first, final SearchFilter... others);
/**
* 移除指定key的过滤条件
*
* @param key 键
* @return 查询实现类 {@link SearchRequest}
*/
Searchable removeFilter(final String key);
/**
* 移除指定属性 和 操作符的过滤条件
*
* @param searchProperty 查询属性
* @param operator 操作符
* @return 查询实现类 {@link SearchRequest}
*/
Searchable removeFilter(String searchProperty, SearchOperator operator);
/**
* 把字符串类型的值转化为entity属性值
*
* @param entityClass 实体类
* @param 实体类型
* @return 查询实现类 {@link SearchRequest}
*/
Searchable convert(final Class entityClass)
throws InvalidSearchValueException, InvalidSearchPropertyException;
/**
* 转换时间类型的操作符,变成大于等于开始时间和小于等于结束时间
*/
void changeDataCondition();
/**
* 标识为已经转换过了 避免多次转换
*
* @return 查询实现类 {@link SearchRequest}
*/
Searchable markConverted();
/**
* 设置分页
*
* @param page 分页信息
* @return 查询实现类 {@link SearchRequest}
*/
Searchable setPage(final Pageable page);
/**
* 设置分页
*
* @param pageNumber 分页页码 索引从 0 开始
* @param pageSize 每页大小
* @return 查询实现类 {@link SearchRequest}
*/
Searchable setPage(final int pageNumber, final int pageSize);
/**
* 添加排序条件
*
* @param sort 排序
* @return 查询实现类 {@link SearchRequest}
*/
Searchable addSort(final Sort sort);
/**
* 添加排序条件
*
* @param direction 排序方向
* @param property 属性
* @return 查询实现类 {@link SearchRequest}
*/
Searchable addSort(final Sort.Direction direction, String property);
/**
* 获取查询过滤条件
*
* @return 查询条件集合
*/
List getSearchFilters();
/**
* 是否已经转换过了,避免多次转换
*
* @return 标识符
*/
boolean isConverted();
/**
* 是否有查询参数
*
* @return 标识符
*/
boolean hasSearchFilter();
/**
* 是否有排序
*
* @return 标识符
*/
boolean hashSort();
/**
* 移除排序
*/
void removeSort();
/**
* 是否有分页
*
* @return 标识符
*/
boolean hasPageable();
/**
* 移除分页
*/
void removePageable();
/**
* 获取分页信息
*
* @return 分页信息 {@link Pageable}
*/
Pageable getPage();
/**
* 获取排序信息
*
* @return 排序信息 {@link Sort}
*/
Sort getSort();
/**
* 是否包含要搜索的键,如 name_like,包括and和or
*
* @param key 查询条件
* @return 标识符
*/
boolean containsSearchKey(final String key);
/**
* 获取查询属性对应的值
* 不能获取or 或 and 的
* @param key 查询的键
* @param 属性值
* @return 获取的值
*/
T getValue(final String key);
/**
* 是否使用了投影
* @return 是/否
*/
boolean hasProjection();
/**
* 获取投影类型
* @return 投影
*/
Class> getProjection();
/**
* 设置投影
* @param projection 投影接口
* @return 返回自身
*/
Searchable setProjection(Class> projection);
}