mirror of
https://github.com/CodePhiliaX/Chat2DB.git
synced 2025-07-30 11:12:55 +08:00
Fix null point error
This commit is contained in:
@ -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;
|
||||||
|
}
|
@ -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.DlCountParam;
|
||||||
import ai.chat2db.server.domain.api.param.DlExecuteParam;
|
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.param.UpdateSelectResultParam;
|
||||||
import ai.chat2db.spi.model.ExecuteResult;
|
import ai.chat2db.spi.model.ExecuteResult;
|
||||||
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
|
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
|
||||||
@ -50,4 +51,12 @@ public interface DlTemplateService {
|
|||||||
*/
|
*/
|
||||||
DataResult<String> updateSelectResult(UpdateSelectResultParam param);
|
DataResult<String> updateSelectResult(UpdateSelectResultParam param);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param param
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
DataResult<String> getOrderBySql(OrderByParam param);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,8 @@ import java.util.Map;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
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.DbType;
|
||||||
import com.alibaba.druid.sql.PagerUtils;
|
import com.alibaba.druid.sql.PagerUtils;
|
||||||
import com.alibaba.druid.sql.SQLUtils;
|
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.ast.statement.SQLSelectStatement;
|
||||||
import com.alibaba.druid.sql.parser.ParserException;
|
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.param.operation.OperationLogCreateParam;
|
||||||
import ai.chat2db.server.domain.api.service.DlTemplateService;
|
import ai.chat2db.server.domain.api.service.DlTemplateService;
|
||||||
import ai.chat2db.server.domain.api.service.OperationLogService;
|
import ai.chat2db.server.domain.api.service.OperationLogService;
|
||||||
@ -294,6 +291,13 @@ public class DlTemplateServiceImpl implements DlTemplateService {
|
|||||||
return DataResult.of(stringBuilder.toString());
|
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) {
|
private List<String> getPrimaryColumns(UpdateSelectResultParam param) {
|
||||||
List<Header> headerList = param.getHeaderList();
|
List<Header> headerList = param.getHeaderList();
|
||||||
if (CollectionUtils.isEmpty(headerList)) {
|
if (CollectionUtils.isEmpty(headerList)) {
|
||||||
|
@ -8,6 +8,7 @@ import java.util.concurrent.Executors;
|
|||||||
|
|
||||||
import ai.chat2db.server.domain.api.model.Config;
|
import ai.chat2db.server.domain.api.model.Config;
|
||||||
import ai.chat2db.server.domain.api.param.DlExecuteParam;
|
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.param.UpdateSelectResultParam;
|
||||||
import ai.chat2db.server.domain.api.service.ConfigService;
|
import ai.chat2db.server.domain.api.service.ConfigService;
|
||||||
import ai.chat2db.server.domain.api.service.DlTemplateService;
|
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.aspect.ConnectionInfoAspect;
|
||||||
import ai.chat2db.server.web.api.controller.ai.chat2db.client.Chat2dbAIClient;
|
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.converter.RdbWebConverter;
|
||||||
import ai.chat2db.server.web.api.controller.rdb.request.DdlCountRequest;
|
import ai.chat2db.server.web.api.controller.rdb.request.*;
|
||||||
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.vo.ExecuteResultVO;
|
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.GatewayClientService;
|
||||||
import ai.chat2db.server.web.api.http.request.SqlExecuteHistoryCreateRequest;
|
import ai.chat2db.server.web.api.http.request.SqlExecuteHistoryCreateRequest;
|
||||||
@ -167,6 +165,15 @@ public class RdbDmlController {
|
|||||||
return dlTemplateService.updateSelectResult(param);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 增删改查等数据运维
|
* 增删改查等数据运维
|
||||||
*
|
*
|
||||||
|
@ -27,8 +27,8 @@ public class TriggerController {
|
|||||||
public WebPageResult<Trigger> list(@Valid TriggerPageRequest request) {
|
public WebPageResult<Trigger> list(@Valid TriggerPageRequest request) {
|
||||||
ListResult<Trigger> listResult = triggerService.triggers(request.getDatabaseName(), request.getSchemaName());
|
ListResult<Trigger> listResult = triggerService.triggers(request.getDatabaseName(), request.getSchemaName());
|
||||||
Long total = CollectionUtils.isNotEmpty(listResult.getData()) ? Long.valueOf(listResult.getData().size()) : 0L;
|
Long total = CollectionUtils.isNotEmpty(listResult.getData()) ? Long.valueOf(listResult.getData().size()) : 0L;
|
||||||
return WebPageResult.of(listResult.getData(), total, 1,
|
Integer pageSize = listResult.getData() != null ? listResult.getData().size() : 0;
|
||||||
listResult.getData().size());
|
return WebPageResult.of(listResult.getData(), total, 1, pageSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/detail")
|
@GetMapping("/detail")
|
||||||
|
@ -43,7 +43,8 @@ public class ViewController {
|
|||||||
public WebPageResult<TableVO> list(@Valid TableBriefQueryRequest request) {
|
public WebPageResult<TableVO> list(@Valid TableBriefQueryRequest request) {
|
||||||
ListResult<Table> tableDTOPageResult = viewService.views(request.getDatabaseName(), request.getSchemaName());
|
ListResult<Table> tableDTOPageResult = viewService.views(request.getDatabaseName(), request.getSchemaName());
|
||||||
List<TableVO> tableVOS = rdbWebConverter.tableDto2vo(tableDTOPageResult.getData());
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,6 +42,14 @@ public abstract class RdbWebConverter {
|
|||||||
public abstract DlExecuteParam request2param(DmlRequest request);
|
public abstract DlExecuteParam request2param(DmlRequest request);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数转换
|
||||||
|
*
|
||||||
|
* @param request
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public abstract OrderByParam request2param(OrderByRequest request);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 参数转换
|
* 参数转换
|
||||||
*
|
*
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -1,9 +1,12 @@
|
|||||||
package ai.chat2db.spi;
|
package ai.chat2db.spi;
|
||||||
|
|
||||||
import ai.chat2db.spi.model.Database;
|
import ai.chat2db.spi.model.Database;
|
||||||
|
import ai.chat2db.spi.model.OrderBy;
|
||||||
import ai.chat2db.spi.model.Schema;
|
import ai.chat2db.spi.model.Schema;
|
||||||
import ai.chat2db.spi.model.Table;
|
import ai.chat2db.spi.model.Table;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface SqlBuilder {
|
public interface SqlBuilder {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -69,4 +72,12 @@ public interface SqlBuilder {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
String buildModifySchemaSql(String oldSchemaName, String newSchemaName);
|
String buildModifySchemaSql(String oldSchemaName, String newSchemaName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param originSql
|
||||||
|
* @param orderByList
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String buildOrderBySql(String originSql, List<OrderBy> orderByList);
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,18 @@ package ai.chat2db.spi.jdbc;
|
|||||||
|
|
||||||
import ai.chat2db.spi.SqlBuilder;
|
import ai.chat2db.spi.SqlBuilder;
|
||||||
import ai.chat2db.spi.model.Database;
|
import ai.chat2db.spi.model.Database;
|
||||||
|
import ai.chat2db.spi.model.OrderBy;
|
||||||
import ai.chat2db.spi.model.Schema;
|
import ai.chat2db.spi.model.Schema;
|
||||||
import ai.chat2db.spi.model.Table;
|
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 {
|
public class DefaultSqlBuilder implements SqlBuilder {
|
||||||
|
|
||||||
@ -44,4 +54,34 @@ public class DefaultSqlBuilder implements SqlBuilder {
|
|||||||
public String buildModifySchemaSql(String oldSchemaName, String newSchemaName) {
|
public String buildModifySchemaSql(String oldSchemaName, String newSchemaName) {
|
||||||
return null;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
package ai.chat2db.spi.model;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class OrderBy {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 排序字段
|
||||||
|
*/
|
||||||
|
private String columnName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 排序方式
|
||||||
|
*/
|
||||||
|
private boolean asc;
|
||||||
|
}
|
Reference in New Issue
Block a user