diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/DmlSqlCopyParam.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/DmlSqlCopyParam.java new file mode 100644 index 00000000..4f372aa3 --- /dev/null +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/param/DmlSqlCopyParam.java @@ -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; +} diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/TableService.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/TableService.java index eb6afa81..b962c3ba 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/TableService.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-api/src/main/java/ai/chat2db/server/domain/api/service/TableService.java @@ -129,4 +129,12 @@ public interface TableService { * @return */ DataResult checkTableVector(TableVectorParam param); + + + /** + * Get dml template sql + * @param param table query param + * @return sql + */ + DataResult copyDmlSql(DmlSqlCopyParam param); } diff --git a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java index 49062d27..5e0282ef 100644 --- a/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java +++ b/chat2db-server/chat2db-server-domain/chat2db-server-domain-core/src/main/java/ai/chat2db/server/domain/core/impl/TableServiceImpl.java @@ -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 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 copyDmlSql(DmlSqlCopyParam param) { + List 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); + } } diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TableController.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TableController.java index a0f63acd..23a9f32e 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TableController.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TableController.java @@ -112,6 +112,12 @@ public class TableController extends EmbeddingController { return ListResult.of(tableVOS); } + @GetMapping("/copy_dml_sql") + public DataResult copyDmlSql(@Valid DmlSqlCopyRequest request) { + DmlSqlCopyParam queryParam = rdbWebConverter.dmlRequest2param(request); + return tableService.copyDmlSql(queryParam); + } + /** * Query the table index under the current DB * 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 88d50d70..f9c529a5 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 @@ -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) ; } diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/request/DmlSqlCopyRequest.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/request/DmlSqlCopyRequest.java new file mode 100644 index 00000000..6a3609f6 --- /dev/null +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/request/DmlSqlCopyRequest.java @@ -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; +} 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 237b4de4..589db131 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 @@ -81,4 +81,11 @@ public interface SqlBuilder { */ String generateSqlBasedOnResults(String tableName, List
headerList, List operations); + /** + * DML SQL + * @param table + * @param type + * @return + */ + String getTableDmlSql(Table table,String type); } diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/enums/DmlType.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/enums/DmlType.java new file mode 100644 index 00000000..170fd539 --- /dev/null +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/enums/DmlType.java @@ -0,0 +1,5 @@ +package ai.chat2db.spi.enums; + +public enum DmlType { + INSERT, UPDATE, DELETE, SELECT +} 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 d76c9ed8..722f6b5f 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 @@ -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 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 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 columnList) { + StringBuilder script = new StringBuilder(); + script.append("DELETE FROM ").append(name) + .append(" where "); + return script.toString(); + } + + private String getUpdateSql(String name, List 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 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 getPrimaryColumns(List
headerList) { if (CollectionUtils.isEmpty(headerList)) { return Lists.newArrayList(); @@ -132,7 +202,6 @@ public class DefaultSqlBuilder implements SqlBuilder { List 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
headerList, List row, MetaData metaSchema) { + private String getInsertSql(String tableName, List
headerList, List row, MetaData metaSchema) { if (CollectionUtils.isEmpty(row) || ObjectUtils.allNull(row.toArray())) { return ""; }