Add order by

This commit is contained in:
JiaJu Zhuang
2023-08-26 20:46:29 +08:00
parent fd76f4f75c
commit 93a1c12777
14 changed files with 154 additions and 10 deletions

View File

@ -1,8 +1,9 @@
package ai.chat2db.server.domain.api.param.datasource;
import ai.chat2db.server.tools.base.wrapper.param.OrderBy;
import ai.chat2db.server.tools.base.wrapper.param.PageQueryParam;
import lombok.Data;
import lombok.Getter;
/**
* @author moji
@ -23,4 +24,16 @@ public class DataSourcePageQueryParam extends PageQueryParam {
* @see ai.chat2db.server.domain.api.enums.DataSourceKindEnum
*/
private String kind;
@Getter
public enum OrderCondition implements ai.chat2db.server.tools.base.wrapper.param.OrderCondition {
ID_DESC(OrderBy.desc("id")),
;
final OrderBy orderBy;
OrderCondition(OrderBy orderBy) {
this.orderBy = orderBy;
}
}
}

View File

@ -1,7 +1,9 @@
package ai.chat2db.server.domain.api.param.team;
import ai.chat2db.server.tools.base.wrapper.param.OrderBy;
import ai.chat2db.server.tools.base.wrapper.param.PageQueryParam;
import lombok.Data;
import lombok.Getter;
/**
* page query
@ -16,4 +18,15 @@ public class TeamPageQueryParam extends PageQueryParam {
*/
private String searchKey;
@Getter
public enum OrderCondition implements ai.chat2db.server.tools.base.wrapper.param.OrderCondition {
ID_DESC(OrderBy.desc("id")),
;
final OrderBy orderBy;
OrderCondition(OrderBy orderBy) {
this.orderBy = orderBy;
}
}
}

View File

@ -1,8 +1,10 @@
package ai.chat2db.server.domain.api.param.user;
import ai.chat2db.server.tools.base.wrapper.param.OrderBy;
import ai.chat2db.server.tools.base.wrapper.param.PageQueryParam;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@ -21,4 +23,16 @@ public class UserPageQueryParam extends PageQueryParam {
* searchKey
*/
private String searchKey;
@Getter
public enum OrderCondition implements ai.chat2db.server.tools.base.wrapper.param.OrderCondition {
ID_DESC(OrderBy.desc("id")),
;
final OrderBy orderBy;
OrderCondition(OrderBy orderBy) {
this.orderBy = orderBy;
}
}
}

View File

@ -32,6 +32,7 @@ import ai.chat2db.server.tools.common.model.LoginUser;
import ai.chat2db.server.tools.common.util.ContextUtils;
import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
import ai.chat2db.server.tools.common.util.EasyEnumUtils;
import ai.chat2db.server.tools.common.util.EasySqlUtils;
import ai.chat2db.spi.config.DriverConfig;
import ai.chat2db.spi.model.DataSourceConnect;
import ai.chat2db.spi.model.Database;
@ -187,9 +188,12 @@ public class DataSourceServiceImpl implements DataSourceService {
@Override
public PageResult<DataSource> queryPageWithPermission(DataSourcePageQueryParam param, DataSourceSelector selector) {
LoginUser loginUser = ContextUtils.getLoginUser();
IPage<DataSourceDO> iPage = dataSourceCustomMapper.selectPageWithPermission(
new Page<>(param.getPageNo(), param.getPageSize()),
BooleanUtils.isTrue(loginUser.getAdmin()), loginUser.getId(), param.getSearchKey(),param.getKind());
BooleanUtils.isTrue(loginUser.getAdmin()), loginUser.getId(), param.getSearchKey(),param.getKind(),
EasySqlUtils.orderBy(param.getOrderByList()));
List<DataSource> dataSources = dataSourceConverter.do2dto(iPage.getRecords());
fillData(dataSources, selector);

View File

@ -19,6 +19,7 @@ import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.common.exception.DataAlreadyExistsBusinessException;
import ai.chat2db.server.tools.common.exception.ParamBusinessException;
import ai.chat2db.server.tools.common.model.EasyLambdaQueryWrapper;
import ai.chat2db.server.tools.common.util.ContextUtils;
import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -61,7 +62,7 @@ public class TeamServiceImpl implements TeamService {
@Override
public PageResult<Team> pageQuery(TeamPageQueryParam param, TeamSelector selector) {
LambdaQueryWrapper<TeamDO> queryWrapper = new LambdaQueryWrapper<>();
EasyLambdaQueryWrapper<TeamDO> queryWrapper = new EasyLambdaQueryWrapper<>();
if (StringUtils.isNotBlank(param.getSearchKey())) {
queryWrapper.and(wrapper -> wrapper.like(TeamDO::getCode, "%" + param.getSearchKey() + "%")
.or()
@ -69,6 +70,7 @@ public class TeamServiceImpl implements TeamService {
}
Page<TeamDO> page = new Page<>(param.getPageNo(), param.getPageSize());
page.setSearchCount(param.getEnableReturnCount());
queryWrapper.orderBy(param.getOrderByList());
IPage<TeamDO> iPage = teamMapper.selectPage(page, queryWrapper);
List<Team> list = teamConverter.do2dto(iPage.getRecords());

View File

@ -20,6 +20,7 @@ import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.common.exception.DataAlreadyExistsBusinessException;
import ai.chat2db.server.tools.common.exception.ParamBusinessException;
import ai.chat2db.server.tools.common.model.EasyLambdaQueryWrapper;
import ai.chat2db.server.tools.common.util.ContextUtils;
import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
import cn.hutool.crypto.digest.DigestUtil;
@ -74,7 +75,7 @@ public class UserServiceImpl implements UserService {
@Override
public PageResult<User> pageQuery(UserPageQueryParam param, UserSelector selector) {
LambdaQueryWrapper<DbhubUserDO> queryWrapper = new LambdaQueryWrapper<>();
EasyLambdaQueryWrapper<DbhubUserDO> queryWrapper = new EasyLambdaQueryWrapper<>();
if (StringUtils.isNotBlank(param.getSearchKey())) {
queryWrapper.and(wrapper -> wrapper.like(DbhubUserDO::getUserName, "%" + param.getSearchKey() + "%")
.or()
@ -84,6 +85,7 @@ public class UserServiceImpl implements UserService {
}
// Default not to query desktop accounts
queryWrapper.ne(DbhubUserDO::getId, RoleCodeEnum.DESKTOP.getDefaultUserId());
queryWrapper.orderBy(param.getOrderByList());
Page<DbhubUserDO> page = new Page<>(param.getPageNo(), param.getPageSize());
page.setSearchCount(param.getEnableReturnCount());
IPage<DbhubUserDO> iPage = dbhubUserMapper.selectPage(page, queryWrapper);

View File

@ -12,6 +12,6 @@ import org.apache.ibatis.annotations.Param;
*/
public interface DataSourceCustomMapper extends Mapper<DataSourceDO> {
IPage<DataSourceDO> selectPageWithPermission(IPage<DataSourceDO> page, @Param("admin") Boolean admin,
@Param("userId") Long userId, @Param("searchKey") String searchKey, @Param("kind") String kind);
@Param("userId") Long userId, @Param("searchKey") String searchKey, @Param("kind") String kind, @Param("orderBy") String orderBy);
}

View File

@ -36,6 +36,9 @@
<if test="kind != null ">
and ds.kind = #{kind}
</if>
<if test="orderBy != null ">
${orderBy}
</if>
</where>
</select>
</mapper>

View File

@ -70,5 +70,9 @@
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,27 @@
package ai.chat2db.server.tools.common.model;
import java.util.List;
import ai.chat2db.server.tools.base.wrapper.param.OrderBy;
import ai.chat2db.server.tools.common.util.EasySqlUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.collections4.CollectionUtils;
import static com.baomidou.mybatisplus.core.enums.SqlKeyword.ORDER_BY;
/**
* Custom query wrapper
*
* @author Jiaju Zhuang
*/
public class EasyLambdaQueryWrapper<T> extends LambdaQueryWrapper<T> {
public void orderBy(List<OrderBy> orderByList) {
if (CollectionUtils.isEmpty(orderByList)) {
return;
}
for (OrderBy orderBy : orderByList) {
appendSqlSegments(ORDER_BY, EasySqlUtils.columnToSqlSegment(orderBy.getOrderConditionName()),
EasySqlUtils.parseOrderBy(orderBy.getDirection()));
}
}
}

View File

@ -0,0 +1,50 @@
package ai.chat2db.server.tools.common.util;
import java.util.Arrays;
import java.util.List;
import ai.chat2db.server.tools.base.enums.OrderByDirectionEnum;
import ai.chat2db.server.tools.base.wrapper.param.OrderBy;
import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
import com.baomidou.mybatisplus.core.conditions.segments.ColumnSegment;
import com.baomidou.mybatisplus.core.conditions.segments.OrderBySegmentList;
import com.baomidou.mybatisplus.core.enums.SqlKeyword;
import org.apache.commons.collections4.CollectionUtils;
import static com.baomidou.mybatisplus.core.enums.SqlKeyword.ASC;
import static com.baomidou.mybatisplus.core.enums.SqlKeyword.DESC;
/**
* sql utils
*
* @author Jiaju Zhuang
*/
public class EasySqlUtils {
public static String orderBy(List<OrderBy> orderByList) {
if (CollectionUtils.isEmpty(orderByList)) {
return null;
}
OrderBySegmentList orderBySegmentList = new OrderBySegmentList();
for (OrderBy orderBy : orderByList) {
orderBySegmentList.addAll(
Arrays.asList(SqlKeyword.ORDER_BY, columnToSqlSegment(orderBy.getOrderConditionName()),
parseOrderBy(orderBy.getDirection())));
}
return orderBySegmentList.getSqlSegment();
}
/**
* 获取 columnName
*/
public static ColumnSegment columnToSqlSegment(String column) {
return () -> column;
}
public static ISqlSegment parseOrderBy(OrderByDirectionEnum direction) {
if (direction == OrderByDirectionEnum.ASC) {
return ASC;
}
return DESC;
}
}

View File

@ -8,6 +8,8 @@ import ai.chat2db.server.admin.api.controller.datasource.request.DataSourceUpdat
import ai.chat2db.server.admin.api.controller.datasource.vo.DataSourcePageQueryVO;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.domain.api.param.datasource.DataSourceCreateParam;
import ai.chat2db.server.domain.api.param.datasource.DataSourcePageQueryParam;
import ai.chat2db.server.domain.api.param.datasource.DataSourcePageQueryParam.OrderCondition;
import ai.chat2db.server.domain.api.param.datasource.DataSourceSelector;
import ai.chat2db.server.domain.api.param.datasource.DataSourceUpdateParam;
import ai.chat2db.server.domain.api.service.DataSourceService;
@ -49,7 +51,9 @@ public class DataSourceAdminController {
*/
@GetMapping("/page")
public WebPageResult<DataSourcePageQueryVO> page(@Valid CommonPageQueryRequest request) {
return dataSourceService.queryPageWithPermission(dataSourceAdminConverter.request2param(request), DATA_SOURCE_SELECTOR)
DataSourcePageQueryParam param = dataSourceAdminConverter.request2param(request);
param.orderBy(OrderCondition.ID_DESC);
return dataSourceService.queryPageWithPermission(param, DATA_SOURCE_SELECTOR)
.mapToWeb(dataSourceAdminConverter::dto2vo);
}

View File

@ -6,6 +6,8 @@ import ai.chat2db.server.admin.api.controller.team.request.TeamCreateRequest;
import ai.chat2db.server.admin.api.controller.team.request.TeamUpdateRequest;
import ai.chat2db.server.admin.api.controller.team.vo.TeamPageQueryVO;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.domain.api.param.team.TeamPageQueryParam;
import ai.chat2db.server.domain.api.param.team.TeamPageQueryParam.OrderCondition;
import ai.chat2db.server.domain.api.param.team.TeamSelector;
import ai.chat2db.server.domain.api.service.TeamService;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
@ -46,7 +48,9 @@ public class TeamAdminController {
*/
@GetMapping("/page")
public WebPageResult<TeamPageQueryVO> page(@Valid CommonPageQueryRequest request) {
return teamService.pageQuery(teamAdminConverter.request2param(request), TEAM_SELECTOR)
TeamPageQueryParam param = teamAdminConverter.request2param(request);
param.orderBy(OrderCondition.ID_DESC);
return teamService.pageQuery(param, TEAM_SELECTOR)
.mapToWeb(teamAdminConverter::dto2vo);
}

View File

@ -6,6 +6,8 @@ import ai.chat2db.server.admin.api.controller.user.request.UserCreateRequest;
import ai.chat2db.server.admin.api.controller.user.request.UserUpdateRequest;
import ai.chat2db.server.admin.api.controller.user.vo.UserPageQueryVO;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.domain.api.param.team.TeamPageQueryParam.OrderCondition;
import ai.chat2db.server.domain.api.param.user.UserPageQueryParam;
import ai.chat2db.server.domain.api.param.user.UserSelector;
import ai.chat2db.server.domain.api.service.UserService;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
@ -47,7 +49,9 @@ public class UserAdminController {
*/
@GetMapping("/page")
public WebPageResult<UserPageQueryVO> page(@Valid CommonPageQueryRequest request) {
return userService.pageQuery(userAdminConverter.request2param(request), USER_SELECTOR)
UserPageQueryParam param = userAdminConverter.request2param(request);
param.orderBy(OrderCondition.ID_DESC);
return userService.pageQuery(param, USER_SELECTOR)
.mapToWeb(userAdminConverter::dto2vo);
}