feat:copy sql

This commit is contained in:
SwallowGG
2024-03-07 10:30:28 +08:00
parent 9fdc97a2d1
commit e4dae07b54
9 changed files with 146 additions and 12 deletions

View File

@ -0,0 +1,15 @@
package ai.chat2db.server.domain.api.param;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class DmlSqlCopyParam extends TableQueryParam{
private String type;
}

View File

@ -129,4 +129,12 @@ public interface TableService {
* @return
*/
DataResult<Boolean> checkTableVector(TableVectorParam param);
/**
* Get dml template sql
* @param param table query param
* @return sql
*/
DataResult<String> copyDmlSql(DmlSqlCopyParam param);
}

View File

@ -69,7 +69,6 @@ public class TableServiceImpl implements TableService {
private TableConverter tableConverter;
private TableCacheVersionMapper getVersionMapper() {
return Dbutils.getMapper(TableCacheVersionMapper.class);
}
@ -251,7 +250,7 @@ public class TableServiceImpl implements TableService {
keyIndex.setSchemaName(newTable.getSchemaName());
keyIndex.setDatabaseName(newTable.getDatabaseName());
keyIndex.setEditStatus(status);
if(!EditStatus.ADD.name().equals(status)){
if (!EditStatus.ADD.name().equals(status)) {
keyIndex.setOldName(keyIndex.getName());
}
indexes.add(keyIndex);
@ -321,7 +320,7 @@ public class TableServiceImpl implements TableService {
long total = 0;
long version = 0L;
if (param.isRefresh() || versionDO == null) {
total = addCache(param,versionDO);
total = addCache(param, versionDO);
} else {
if ("2".equals(versionDO.getStatus())) {
version = versionDO.getVersion() - 1;
@ -350,7 +349,7 @@ public class TableServiceImpl implements TableService {
return PageResult.of(tables, total, param);
}
private long addCache(TablePageQueryParam param,TableCacheVersionDO versionDO){
private long addCache(TablePageQueryParam param, TableCacheVersionDO versionDO) {
LambdaQueryWrapper<TableCacheVersionDO> queryWrapper = new LambdaQueryWrapper<>();
String key = getTableKey(param.getDataSourceId(), param.getDatabaseName(), param.getSchemaName());
queryWrapper.eq(TableCacheVersionDO::getKey, key);
@ -388,7 +387,7 @@ public class TableServiceImpl implements TableService {
queryWrapper.eq(TableCacheVersionDO::getKey, key);
TableCacheVersionDO versionDO = getVersionMapper().selectOne(queryWrapper);
if (versionDO == null) {
addCache(param,versionDO);
addCache(param, versionDO);
versionDO = getVersionMapper().selectOne(queryWrapper);
}
long version = "2".equals(versionDO.getStatus()) ? versionDO.getVersion() - 1 : versionDO.getVersion();
@ -598,4 +597,13 @@ public class TableServiceImpl implements TableService {
}
return DataResult.of(false);
}
@Override
public DataResult<String> copyDmlSql(DmlSqlCopyParam param) {
List<TableColumn> columns = queryColumns(param);
SqlBuilder sqlBuilder = Chat2DBContext.getSqlBuilder();
Table table = Table.builder().name(param.getTableName()).columnList(columns).build();
String sql = sqlBuilder.getTableDmlSql(table, param.getType());
return DataResult.of(sql);
}
}

View File

@ -112,6 +112,12 @@ public class TableController extends EmbeddingController {
return ListResult.of(tableVOS);
}
@GetMapping("/copy_dml_sql")
public DataResult<String> copyDmlSql(@Valid DmlSqlCopyRequest request) {
DmlSqlCopyParam queryParam = rdbWebConverter.dmlRequest2param(request);
return tableService.copyDmlSql(queryParam);
}
/**
* Query the table index under the current DB
*

View File

@ -254,4 +254,6 @@ public abstract class RdbWebConverter {
public abstract EsTableSchemaRequest req2req(TableBriefQueryRequest request);
public abstract TablePageQueryParam schemaReq2page(EsTableSchemaRequest request);
public abstract DmlSqlCopyParam dmlRequest2param(DmlSqlCopyRequest request) ;
}

View File

@ -0,0 +1,14 @@
package ai.chat2db.server.web.api.controller.rdb.request;
import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequest;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
public class DmlSqlCopyRequest extends DataSourceBaseRequest {
@NotNull
private String tableName;
private String type;
}

View File

@ -81,4 +81,11 @@ public interface SqlBuilder {
*/
String generateSqlBasedOnResults(String tableName, List<Header> headerList, List<ResultOperation> operations);
/**
* DML SQL
* @param table
* @param type
* @return
*/
String getTableDmlSql(Table table,String type);
}

View File

@ -0,0 +1,5 @@
package ai.chat2db.spi.enums;
public enum DmlType {
INSERT, UPDATE, DELETE, SELECT
}

View File

@ -1,8 +1,8 @@
package ai.chat2db.spi.jdbc;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.spi.MetaData;
import ai.chat2db.spi.SqlBuilder;
import ai.chat2db.spi.enums.DmlType;
import ai.chat2db.spi.model.*;
import ai.chat2db.spi.sql.Chat2DBContext;
import ai.chat2db.spi.util.SqlUtils;
@ -101,13 +101,13 @@ public class DefaultSqlBuilder implements SqlBuilder {
List<String> odlRow = operation.getOldDataList();
String sql = "";
if ("UPDATE".equalsIgnoreCase(operation.getType())) {
sql = getUpdateSql(tableName,headerList, row, odlRow, metaSchema, keyColumns, false);
sql = getUpdateSql(tableName, headerList, row, odlRow, metaSchema, keyColumns, false);
} else if ("CREATE".equalsIgnoreCase(operation.getType())) {
sql = getInsertSql(tableName,headerList, row, metaSchema);
sql = getInsertSql(tableName, headerList, row, metaSchema);
} else if ("DELETE".equalsIgnoreCase(operation.getType())) {
sql = getDeleteSql(tableName,headerList, odlRow, metaSchema, keyColumns);
sql = getDeleteSql(tableName, headerList, odlRow, metaSchema, keyColumns);
} else if ("UPDATE_COPY".equalsIgnoreCase(operation.getType())) {
sql = getUpdateSql(tableName,headerList, row, row, metaSchema, keyColumns, true);
sql = getUpdateSql(tableName, headerList, row, row, metaSchema, keyColumns, true);
}
stringBuilder.append(sql + ";\n");
@ -115,6 +115,76 @@ public class DefaultSqlBuilder implements SqlBuilder {
return stringBuilder.toString();
}
@Override
public String getTableDmlSql(Table table, String type) {
if (table == null || CollectionUtils.isEmpty(table.getColumnList()) || StringUtils.isBlank(type)) {
return "";
}
if(DmlType.INSERT.name().equalsIgnoreCase(type)) {
return getInsertSql(table.getName(), table.getColumnList());
} else if(DmlType.UPDATE.name().equalsIgnoreCase(type)) {
return getUpdateSql(table.getName(), table.getColumnList());
} else if(DmlType.DELETE.name().equalsIgnoreCase(type)) {
return getDeleteSql(table.getName(), table.getColumnList());
}else if(DmlType.SELECT.name().equalsIgnoreCase(type)) {
return getSelectSql(table.getName(), table.getColumnList());
}
return "";
}
private String getSelectSql(String name, List<TableColumn> columnList) {
StringBuilder script = new StringBuilder();
script.append("SELECT ");
for (TableColumn column : columnList) {
script.append(column.getName())
.append(",");
}
script.deleteCharAt(script.length() - 1);
script.append(" FROM where").append(name);
return script.toString();
}
private String getDeleteSql(String name, List<TableColumn> columnList) {
StringBuilder script = new StringBuilder();
script.append("DELETE FROM ").append(name)
.append(" where ");
return script.toString();
}
private String getUpdateSql(String name, List<TableColumn> columnList) {
StringBuilder script = new StringBuilder();
script.append("UPDATE ").append(name)
.append(" set ");
for (TableColumn column : columnList) {
script.append(column.getName())
.append(" = ")
.append(" ")
.append(",");
}
script.deleteCharAt(script.length() - 1);
script.append(" where ");
return script.toString();
}
private String getInsertSql(String name, List<TableColumn> columnList) {
StringBuilder script = new StringBuilder();
script.append("INSERT INTO ").append(name)
.append(" (");
for (TableColumn column : columnList) {
script.append(column.getName())
.append(",");
}
script.deleteCharAt(script.length() - 1);
script.append(") VALUES (");
for (TableColumn column : columnList) {
script.append(" ")
.append(",");
}
script.deleteCharAt(script.length() - 1);
script.append(")");
return script.toString();
}
private List<String> getPrimaryColumns(List<Header> headerList) {
if (CollectionUtils.isEmpty(headerList)) {
return Lists.newArrayList();
@ -132,7 +202,6 @@ public class DefaultSqlBuilder implements SqlBuilder {
List<String> keyColumns) {
StringBuilder script = new StringBuilder();
script.append("DELETE FROM ").append(tableName).append("");
script.append(buildWhere(headerList, row, metaSchema, keyColumns));
return script.toString();
}
@ -178,7 +247,7 @@ public class DefaultSqlBuilder implements SqlBuilder {
return script.toString();
}
private String getInsertSql(String tableName, List<Header> headerList, List<String> row, MetaData metaSchema) {
private String getInsertSql(String tableName, List<Header> headerList, List<String> row, MetaData metaSchema) {
if (CollectionUtils.isEmpty(row) || ObjectUtils.allNull(row.toArray())) {
return "";
}