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; 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 ai.chat2db.server.tools.base.wrapper.param.PageQueryParam;
import lombok.Data; import lombok.Data;
import lombok.Getter;
/** /**
* @author moji * @author moji
@ -23,4 +24,16 @@ public class DataSourcePageQueryParam extends PageQueryParam {
* @see ai.chat2db.server.domain.api.enums.DataSourceKindEnum * @see ai.chat2db.server.domain.api.enums.DataSourceKindEnum
*/ */
private String kind; 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; 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 ai.chat2db.server.tools.base.wrapper.param.PageQueryParam;
import lombok.Data; import lombok.Data;
import lombok.Getter;
/** /**
* page query * page query
@ -16,4 +18,15 @@ public class TeamPageQueryParam extends PageQueryParam {
*/ */
private String 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

@ -1,8 +1,10 @@
package ai.chat2db.server.domain.api.param.user; 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 ai.chat2db.server.tools.base.wrapper.param.PageQueryParam;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
@ -21,4 +23,16 @@ public class UserPageQueryParam extends PageQueryParam {
* searchKey * searchKey
*/ */
private String 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.ContextUtils;
import ai.chat2db.server.tools.common.util.EasyCollectionUtils; import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
import ai.chat2db.server.tools.common.util.EasyEnumUtils; 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.config.DriverConfig;
import ai.chat2db.spi.model.DataSourceConnect; import ai.chat2db.spi.model.DataSourceConnect;
import ai.chat2db.spi.model.Database; import ai.chat2db.spi.model.Database;
@ -187,9 +188,12 @@ public class DataSourceServiceImpl implements DataSourceService {
@Override @Override
public PageResult<DataSource> queryPageWithPermission(DataSourcePageQueryParam param, DataSourceSelector selector) { public PageResult<DataSource> queryPageWithPermission(DataSourcePageQueryParam param, DataSourceSelector selector) {
LoginUser loginUser = ContextUtils.getLoginUser(); LoginUser loginUser = ContextUtils.getLoginUser();
IPage<DataSourceDO> iPage = dataSourceCustomMapper.selectPageWithPermission( IPage<DataSourceDO> iPage = dataSourceCustomMapper.selectPageWithPermission(
new Page<>(param.getPageNo(), param.getPageSize()), 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()); List<DataSource> dataSources = dataSourceConverter.do2dto(iPage.getRecords());
fillData(dataSources, selector); 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.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.common.exception.DataAlreadyExistsBusinessException; import ai.chat2db.server.tools.common.exception.DataAlreadyExistsBusinessException;
import ai.chat2db.server.tools.common.exception.ParamBusinessException; 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.ContextUtils;
import ai.chat2db.server.tools.common.util.EasyCollectionUtils; import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -61,7 +62,7 @@ public class TeamServiceImpl implements TeamService {
@Override @Override
public PageResult<Team> pageQuery(TeamPageQueryParam param, TeamSelector selector) { public PageResult<Team> pageQuery(TeamPageQueryParam param, TeamSelector selector) {
LambdaQueryWrapper<TeamDO> queryWrapper = new LambdaQueryWrapper<>(); EasyLambdaQueryWrapper<TeamDO> queryWrapper = new EasyLambdaQueryWrapper<>();
if (StringUtils.isNotBlank(param.getSearchKey())) { if (StringUtils.isNotBlank(param.getSearchKey())) {
queryWrapper.and(wrapper -> wrapper.like(TeamDO::getCode, "%" + param.getSearchKey() + "%") queryWrapper.and(wrapper -> wrapper.like(TeamDO::getCode, "%" + param.getSearchKey() + "%")
.or() .or()
@ -69,6 +70,7 @@ public class TeamServiceImpl implements TeamService {
} }
Page<TeamDO> page = new Page<>(param.getPageNo(), param.getPageSize()); Page<TeamDO> page = new Page<>(param.getPageNo(), param.getPageSize());
page.setSearchCount(param.getEnableReturnCount()); page.setSearchCount(param.getEnableReturnCount());
queryWrapper.orderBy(param.getOrderByList());
IPage<TeamDO> iPage = teamMapper.selectPage(page, queryWrapper); IPage<TeamDO> iPage = teamMapper.selectPage(page, queryWrapper);
List<Team> list = teamConverter.do2dto(iPage.getRecords()); 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.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.common.exception.DataAlreadyExistsBusinessException; import ai.chat2db.server.tools.common.exception.DataAlreadyExistsBusinessException;
import ai.chat2db.server.tools.common.exception.ParamBusinessException; 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.ContextUtils;
import ai.chat2db.server.tools.common.util.EasyCollectionUtils; import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
import cn.hutool.crypto.digest.DigestUtil; import cn.hutool.crypto.digest.DigestUtil;
@ -74,7 +75,7 @@ public class UserServiceImpl implements UserService {
@Override @Override
public PageResult<User> pageQuery(UserPageQueryParam param, UserSelector selector) { public PageResult<User> pageQuery(UserPageQueryParam param, UserSelector selector) {
LambdaQueryWrapper<DbhubUserDO> queryWrapper = new LambdaQueryWrapper<>(); EasyLambdaQueryWrapper<DbhubUserDO> queryWrapper = new EasyLambdaQueryWrapper<>();
if (StringUtils.isNotBlank(param.getSearchKey())) { if (StringUtils.isNotBlank(param.getSearchKey())) {
queryWrapper.and(wrapper -> wrapper.like(DbhubUserDO::getUserName, "%" + param.getSearchKey() + "%") queryWrapper.and(wrapper -> wrapper.like(DbhubUserDO::getUserName, "%" + param.getSearchKey() + "%")
.or() .or()
@ -84,6 +85,7 @@ public class UserServiceImpl implements UserService {
} }
// Default not to query desktop accounts // Default not to query desktop accounts
queryWrapper.ne(DbhubUserDO::getId, RoleCodeEnum.DESKTOP.getDefaultUserId()); queryWrapper.ne(DbhubUserDO::getId, RoleCodeEnum.DESKTOP.getDefaultUserId());
queryWrapper.orderBy(param.getOrderByList());
Page<DbhubUserDO> page = new Page<>(param.getPageNo(), param.getPageSize()); Page<DbhubUserDO> page = new Page<>(param.getPageNo(), param.getPageSize());
page.setSearchCount(param.getEnableReturnCount()); page.setSearchCount(param.getEnableReturnCount());
IPage<DbhubUserDO> iPage = dbhubUserMapper.selectPage(page, queryWrapper); 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> { public interface DataSourceCustomMapper extends Mapper<DataSourceDO> {
IPage<DataSourceDO> selectPageWithPermission(IPage<DataSourceDO> page, @Param("admin") Boolean admin, 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 "> <if test="kind != null ">
and ds.kind = #{kind} and ds.kind = #{kind}
</if> </if>
<if test="orderBy != null ">
${orderBy}
</if>
</where> </where>
</select> </select>
</mapper> </mapper>

View File

@ -70,5 +70,9 @@
<groupId>org.springframework</groupId> <groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId> <artifactId>spring-context-indexer</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </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.admin.api.controller.datasource.vo.DataSourcePageQueryVO;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest; 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.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.DataSourceSelector;
import ai.chat2db.server.domain.api.param.datasource.DataSourceUpdateParam; import ai.chat2db.server.domain.api.param.datasource.DataSourceUpdateParam;
import ai.chat2db.server.domain.api.service.DataSourceService; import ai.chat2db.server.domain.api.service.DataSourceService;
@ -49,7 +51,9 @@ public class DataSourceAdminController {
*/ */
@GetMapping("/page") @GetMapping("/page")
public WebPageResult<DataSourcePageQueryVO> page(@Valid CommonPageQueryRequest request) { 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); .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.request.TeamUpdateRequest;
import ai.chat2db.server.admin.api.controller.team.vo.TeamPageQueryVO; import ai.chat2db.server.admin.api.controller.team.vo.TeamPageQueryVO;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest; 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.param.team.TeamSelector;
import ai.chat2db.server.domain.api.service.TeamService; import ai.chat2db.server.domain.api.service.TeamService;
import ai.chat2db.server.tools.base.wrapper.result.DataResult; import ai.chat2db.server.tools.base.wrapper.result.DataResult;
@ -46,7 +48,9 @@ public class TeamAdminController {
*/ */
@GetMapping("/page") @GetMapping("/page")
public WebPageResult<TeamPageQueryVO> page(@Valid CommonPageQueryRequest request) { 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); .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.request.UserUpdateRequest;
import ai.chat2db.server.admin.api.controller.user.vo.UserPageQueryVO; import ai.chat2db.server.admin.api.controller.user.vo.UserPageQueryVO;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest; 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.param.user.UserSelector;
import ai.chat2db.server.domain.api.service.UserService; import ai.chat2db.server.domain.api.service.UserService;
import ai.chat2db.server.tools.base.wrapper.result.DataResult; import ai.chat2db.server.tools.base.wrapper.result.DataResult;
@ -47,7 +49,9 @@ public class UserAdminController {
*/ */
@GetMapping("/page") @GetMapping("/page")
public WebPageResult<UserPageQueryVO> page(@Valid CommonPageQueryRequest request) { 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); .mapToWeb(userAdminConverter::dto2vo);
} }