Fix null point error

This commit is contained in:
SwallowGG
2023-12-28 19:10:04 +08:00
parent 80142e3cc5
commit 358a23da20
11 changed files with 179 additions and 12 deletions

View File

@ -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<OrderBy> orderByList;
}

View File

@ -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<String> updateSelectResult(UpdateSelectResultParam param);
/**
*
* @param param
* @return
*/
DataResult<String> getOrderBySql(OrderByParam param);
}

View File

@ -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<String> getOrderBySql(OrderByParam param) {
SqlBuilder sqlBuilder = Chat2DBContext.getSqlBuilder();
String orderSql = sqlBuilder.buildOrderBySql(param.getOriginSql(),param.getOrderByList());
return DataResult.of(orderSql);
}
private List<String> getPrimaryColumns(UpdateSelectResultParam param) {
List<Header> headerList = param.getHeaderList();
if (CollectionUtils.isEmpty(headerList)) {

View File

@ -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<String> getOrderBySql(@RequestBody OrderByRequest request) {
OrderByParam param = rdbWebConverter.request2param(request);
return dlTemplateService.getOrderBySql(param);
}
/**
* 增删改查等数据运维
*

View File

@ -27,8 +27,8 @@ public class TriggerController {
public WebPageResult<Trigger> list(@Valid TriggerPageRequest request) {
ListResult<Trigger> 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")

View File

@ -43,7 +43,8 @@ public class ViewController {
public WebPageResult<TableVO> list(@Valid TableBriefQueryRequest request) {
ListResult<Table> tableDTOPageResult = viewService.views(request.getDatabaseName(), request.getSchemaName());
List<TableVO> 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);
}

View File

@ -42,6 +42,14 @@ public abstract class RdbWebConverter {
public abstract DlExecuteParam request2param(DmlRequest request);
/**
* 参数转换
*
* @param request
* @return
*/
public abstract OrderByParam request2param(OrderByRequest request);
/**
* 参数转换
*

View File

@ -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<OrderBy> orderByList;
}

View File

@ -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<OrderBy> orderByList);
}

View File

@ -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<OrderBy> 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<OrderByElement> 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;
}
}

View File

@ -0,0 +1,17 @@
package ai.chat2db.spi.model;
import lombok.Data;
@Data
public class OrderBy {
/**
* 排序字段
*/
private String columnName;
/**
* 排序方式
*/
private boolean asc;
}