From 358a23da20fc678c05be460aa2823d35856df9f7 Mon Sep 17 00:00:00 2001 From: SwallowGG <1558143046@qq.com> Date: Thu, 28 Dec 2023 19:10:04 +0800 Subject: [PATCH] Fix null point error --- .../server/domain/api/param/OrderByParam.java | 47 +++++++++++++++++++ .../domain/api/service/DlTemplateService.java | 9 ++++ .../core/impl/DlTemplateServiceImpl.java | 14 ++++-- .../api/controller/rdb/RdbDmlController.java | 15 ++++-- .../api/controller/rdb/TriggerController.java | 4 +- .../api/controller/rdb/ViewController.java | 3 +- .../rdb/converter/RdbWebConverter.java | 8 ++++ .../rdb/request/OrderByRequest.java | 23 +++++++++ .../main/java/ai/chat2db/spi/SqlBuilder.java | 11 +++++ .../chat2db/spi/jdbc/DefaultSqlBuilder.java | 40 ++++++++++++++++ .../java/ai/chat2db/spi/model/OrderBy.java | 17 +++++++ 11 files changed, 179 insertions(+), 12 deletions(-) create mode 100644 chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/OrderByParam.java create mode 100644 chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/request/OrderByRequest.java create mode 100644 chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/OrderBy.java diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/OrderByParam.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/OrderByParam.java new file mode 100644 index 00000000..8110677b --- /dev/null +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/OrderByParam.java @@ -0,0 +1,47 @@ +package ai.chat2db.server.domain.api.param; + +import ai.chat2db.spi.model.OrderBy; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + + +@Data +public class OrderByParam { + + /** + * 控制台id + */ + @NotNull + private Long consoleId; + + /** + * 数据源id + */ + @NotNull + private Long dataSourceId; + + /** + * DB名称 + */ + private String databaseName; + + + /** + * schema名称 + */ + private String schemaName; + + + /** + * origin sql + */ + private String originSql; + + + /** + * 排序字段 + */ + private List orderByList; +} diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/DlTemplateService.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/DlTemplateService.java index 2195c55a..cfee4cd1 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/DlTemplateService.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/DlTemplateService.java @@ -2,6 +2,7 @@ package ai.chat2db.server.domain.api.service; import ai.chat2db.server.domain.api.param.DlCountParam; import ai.chat2db.server.domain.api.param.DlExecuteParam; +import ai.chat2db.server.domain.api.param.OrderByParam; import ai.chat2db.server.domain.api.param.UpdateSelectResultParam; import ai.chat2db.spi.model.ExecuteResult; import ai.chat2db.server.tools.base.wrapper.result.DataResult; @@ -50,4 +51,12 @@ public interface DlTemplateService { */ DataResult updateSelectResult(UpdateSelectResultParam param); + + /** + * + * @param param + * @return + */ + DataResult getOrderBySql(OrderByParam param); + } diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java index 1cbdd17d..3e6aff9e 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/DlTemplateServiceImpl.java @@ -10,6 +10,8 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; +import ai.chat2db.server.domain.api.param.*; +import ai.chat2db.spi.SqlBuilder; import com.alibaba.druid.DbType; import com.alibaba.druid.sql.PagerUtils; import com.alibaba.druid.sql.SQLUtils; @@ -17,11 +19,6 @@ import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.parser.ParserException; -import ai.chat2db.server.domain.api.param.DlCountParam; -import ai.chat2db.server.domain.api.param.DlExecuteParam; -import ai.chat2db.server.domain.api.param.SelectResultOperation; -import ai.chat2db.server.domain.api.param.TableQueryParam; -import ai.chat2db.server.domain.api.param.UpdateSelectResultParam; import ai.chat2db.server.domain.api.param.operation.OperationLogCreateParam; import ai.chat2db.server.domain.api.service.DlTemplateService; import ai.chat2db.server.domain.api.service.OperationLogService; @@ -294,6 +291,13 @@ public class DlTemplateServiceImpl implements DlTemplateService { return DataResult.of(stringBuilder.toString()); } + @Override + public DataResult getOrderBySql(OrderByParam param) { + SqlBuilder sqlBuilder = Chat2DBContext.getSqlBuilder(); + String orderSql = sqlBuilder.buildOrderBySql(param.getOriginSql(),param.getOrderByList()); + return DataResult.of(orderSql); + } + private List getPrimaryColumns(UpdateSelectResultParam param) { List
headerList = param.getHeaderList(); if (CollectionUtils.isEmpty(headerList)) { diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/RdbDmlController.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/RdbDmlController.java index f214fa95..65e8c230 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/RdbDmlController.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/RdbDmlController.java @@ -8,6 +8,7 @@ import java.util.concurrent.Executors; import ai.chat2db.server.domain.api.model.Config; import ai.chat2db.server.domain.api.param.DlExecuteParam; +import ai.chat2db.server.domain.api.param.OrderByParam; import ai.chat2db.server.domain.api.param.UpdateSelectResultParam; import ai.chat2db.server.domain.api.service.ConfigService; import ai.chat2db.server.domain.api.service.DlTemplateService; @@ -17,10 +18,7 @@ import ai.chat2db.server.tools.base.wrapper.result.ListResult; import ai.chat2db.server.web.api.aspect.ConnectionInfoAspect; import ai.chat2db.server.web.api.controller.ai.chat2db.client.Chat2dbAIClient; import ai.chat2db.server.web.api.controller.rdb.converter.RdbWebConverter; -import ai.chat2db.server.web.api.controller.rdb.request.DdlCountRequest; -import ai.chat2db.server.web.api.controller.rdb.request.DmlRequest; -import ai.chat2db.server.web.api.controller.rdb.request.DmlTableRequest; -import ai.chat2db.server.web.api.controller.rdb.request.SelectResultUpdateRequest; +import ai.chat2db.server.web.api.controller.rdb.request.*; import ai.chat2db.server.web.api.controller.rdb.vo.ExecuteResultVO; import ai.chat2db.server.web.api.http.GatewayClientService; import ai.chat2db.server.web.api.http.request.SqlExecuteHistoryCreateRequest; @@ -167,6 +165,15 @@ public class RdbDmlController { return dlTemplateService.updateSelectResult(param); } + + @RequestMapping(value = "/get_order_by_sql", method = {RequestMethod.POST, RequestMethod.PUT}) + public DataResult getOrderBySql(@RequestBody OrderByRequest request) { + + OrderByParam param = rdbWebConverter.request2param(request); + + return dlTemplateService.getOrderBySql(param); + } + /** * 增删改查等数据运维 * diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TriggerController.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TriggerController.java index 03524568..9ba1d306 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TriggerController.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TriggerController.java @@ -27,8 +27,8 @@ public class TriggerController { public WebPageResult list(@Valid TriggerPageRequest request) { ListResult listResult = triggerService.triggers(request.getDatabaseName(), request.getSchemaName()); Long total = CollectionUtils.isNotEmpty(listResult.getData()) ? Long.valueOf(listResult.getData().size()) : 0L; - return WebPageResult.of(listResult.getData(), total, 1, - listResult.getData().size()); + Integer pageSize = listResult.getData() != null ? listResult.getData().size() : 0; + return WebPageResult.of(listResult.getData(), total, 1, pageSize); } @GetMapping("/detail") diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/ViewController.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/ViewController.java index 7fdf01d2..3475f33b 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/ViewController.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/ViewController.java @@ -43,7 +43,8 @@ public class ViewController { public WebPageResult list(@Valid TableBriefQueryRequest request) { ListResult tableDTOPageResult = viewService.views(request.getDatabaseName(), request.getSchemaName()); List tableVOS = rdbWebConverter.tableDto2vo(tableDTOPageResult.getData()); - return WebPageResult.of(tableVOS, Long.valueOf(tableVOS.size()), 1, tableVOS.size()); + Integer pageSize = tableDTOPageResult.getData() != null ? tableDTOPageResult.getData().size() : 0; + return WebPageResult.of(tableVOS, Long.valueOf(tableVOS.size()), 1, pageSize); } diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/converter/RdbWebConverter.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/converter/RdbWebConverter.java index 788a814c..b04663dc 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/converter/RdbWebConverter.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/converter/RdbWebConverter.java @@ -42,6 +42,14 @@ public abstract class RdbWebConverter { public abstract DlExecuteParam request2param(DmlRequest request); + /** + * 参数转换 + * + * @param request + * @return + */ + public abstract OrderByParam request2param(OrderByRequest request); + /** * 参数转换 * diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/request/OrderByRequest.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/request/OrderByRequest.java new file mode 100644 index 00000000..e48b5a0b --- /dev/null +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/request/OrderByRequest.java @@ -0,0 +1,23 @@ +package ai.chat2db.server.web.api.controller.rdb.request; + +import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequest; +import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequestInfo; +import ai.chat2db.spi.model.OrderBy; +import lombok.Data; + +import java.util.List; + +@Data +public class OrderByRequest extends DataSourceBaseRequest implements DataSourceBaseRequestInfo { + + /** + * origin sql + */ + private String originSql; + + /** + * 排序字段 + */ + private List orderByList; + +} diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/SqlBuilder.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/SqlBuilder.java index 967ee086..a76ed607 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/SqlBuilder.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/SqlBuilder.java @@ -1,9 +1,12 @@ package ai.chat2db.spi; import ai.chat2db.spi.model.Database; +import ai.chat2db.spi.model.OrderBy; import ai.chat2db.spi.model.Schema; import ai.chat2db.spi.model.Table; +import java.util.List; + public interface SqlBuilder { /** @@ -69,4 +72,12 @@ public interface SqlBuilder { * @return */ String buildModifySchemaSql(String oldSchemaName, String newSchemaName); + + /** + * + * @param originSql + * @param orderByList + * @return + */ + String buildOrderBySql(String originSql, List orderByList); } diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultSqlBuilder.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultSqlBuilder.java index dd957f72..dc4627c3 100644 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultSqlBuilder.java +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultSqlBuilder.java @@ -2,8 +2,18 @@ package ai.chat2db.spi.jdbc; import ai.chat2db.spi.SqlBuilder; import ai.chat2db.spi.model.Database; +import ai.chat2db.spi.model.OrderBy; import ai.chat2db.spi.model.Schema; import ai.chat2db.spi.model.Table; +import net.sf.jsqlparser.parser.CCJSqlParserUtil; +import net.sf.jsqlparser.statement.Statement; +import net.sf.jsqlparser.statement.select.OrderByElement; +import net.sf.jsqlparser.statement.select.PlainSelect; +import net.sf.jsqlparser.statement.select.Select; +import org.apache.commons.collections4.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; public class DefaultSqlBuilder implements SqlBuilder { @@ -44,4 +54,34 @@ public class DefaultSqlBuilder implements SqlBuilder { public String buildModifySchemaSql(String oldSchemaName, String newSchemaName) { return null; } + + @Override + public String buildOrderBySql(String originSql, List orderByList) { + if(CollectionUtils.isEmpty(orderByList)){ + return originSql; + } + try { + Statement statement = CCJSqlParserUtil.parse(originSql); + if (statement instanceof Select) { + Select selectStatement = (Select) statement; + PlainSelect plainSelect = (PlainSelect) selectStatement.getSelectBody(); + + // 创建新的 ORDER BY 子句 + List orderByElements = new ArrayList<>(); + + for (OrderBy orderBy : orderByList) { + OrderByElement orderByElement = new OrderByElement(); + orderByElement.setExpression(CCJSqlParserUtil.parseExpression(orderBy.getColumnName())); + orderByElement.setAsc(orderBy.isAsc()); // 设置为升序,使用 setAsc(false) 设置为降序 + orderByElements.add(orderByElement); + } + // 替换原有的 ORDER BY 子句 + plainSelect.setOrderByElements(orderByElements); + // 输出修改后的 SQL + return plainSelect.toString(); + } + } catch (Exception e) { + } + return originSql; + } } diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/OrderBy.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/OrderBy.java new file mode 100644 index 00000000..fc90c4da --- /dev/null +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/OrderBy.java @@ -0,0 +1,17 @@ +package ai.chat2db.spi.model; + +import lombok.Data; + +@Data +public class OrderBy { + + /** + * 排序字段 + */ + private String columnName; + + /** + * 排序方式 + */ + private boolean asc; +}