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.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);
} }

View File

@ -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)) {

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.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);
}
/** /**
* 增删改查等数据运维 * 增删改查等数据运维
* *

View File

@ -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")

View File

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

View File

@ -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);
/** /**
* 参数转换 * 参数转换
* *

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; 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);
} }

View File

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

View File

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