mirror of
https://github.com/CodePhiliaX/Chat2DB.git
synced 2025-07-31 11:42:41 +08:00
feat:copy sql
This commit is contained in:
@ -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;
|
||||||
|
}
|
@ -129,4 +129,12 @@ public interface TableService {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
DataResult<Boolean> checkTableVector(TableVectorParam param);
|
DataResult<Boolean> checkTableVector(TableVectorParam param);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get dml template sql
|
||||||
|
* @param param table query param
|
||||||
|
* @return sql
|
||||||
|
*/
|
||||||
|
DataResult<String> copyDmlSql(DmlSqlCopyParam param);
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,6 @@ public class TableServiceImpl implements TableService {
|
|||||||
private TableConverter tableConverter;
|
private TableConverter tableConverter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private TableCacheVersionMapper getVersionMapper() {
|
private TableCacheVersionMapper getVersionMapper() {
|
||||||
return Dbutils.getMapper(TableCacheVersionMapper.class);
|
return Dbutils.getMapper(TableCacheVersionMapper.class);
|
||||||
}
|
}
|
||||||
@ -251,7 +250,7 @@ public class TableServiceImpl implements TableService {
|
|||||||
keyIndex.setSchemaName(newTable.getSchemaName());
|
keyIndex.setSchemaName(newTable.getSchemaName());
|
||||||
keyIndex.setDatabaseName(newTable.getDatabaseName());
|
keyIndex.setDatabaseName(newTable.getDatabaseName());
|
||||||
keyIndex.setEditStatus(status);
|
keyIndex.setEditStatus(status);
|
||||||
if(!EditStatus.ADD.name().equals(status)){
|
if (!EditStatus.ADD.name().equals(status)) {
|
||||||
keyIndex.setOldName(keyIndex.getName());
|
keyIndex.setOldName(keyIndex.getName());
|
||||||
}
|
}
|
||||||
indexes.add(keyIndex);
|
indexes.add(keyIndex);
|
||||||
@ -321,7 +320,7 @@ public class TableServiceImpl implements TableService {
|
|||||||
long total = 0;
|
long total = 0;
|
||||||
long version = 0L;
|
long version = 0L;
|
||||||
if (param.isRefresh() || versionDO == null) {
|
if (param.isRefresh() || versionDO == null) {
|
||||||
total = addCache(param,versionDO);
|
total = addCache(param, versionDO);
|
||||||
} else {
|
} else {
|
||||||
if ("2".equals(versionDO.getStatus())) {
|
if ("2".equals(versionDO.getStatus())) {
|
||||||
version = versionDO.getVersion() - 1;
|
version = versionDO.getVersion() - 1;
|
||||||
@ -350,7 +349,7 @@ public class TableServiceImpl implements TableService {
|
|||||||
return PageResult.of(tables, total, param);
|
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<>();
|
LambdaQueryWrapper<TableCacheVersionDO> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
String key = getTableKey(param.getDataSourceId(), param.getDatabaseName(), param.getSchemaName());
|
String key = getTableKey(param.getDataSourceId(), param.getDatabaseName(), param.getSchemaName());
|
||||||
queryWrapper.eq(TableCacheVersionDO::getKey, key);
|
queryWrapper.eq(TableCacheVersionDO::getKey, key);
|
||||||
@ -388,7 +387,7 @@ public class TableServiceImpl implements TableService {
|
|||||||
queryWrapper.eq(TableCacheVersionDO::getKey, key);
|
queryWrapper.eq(TableCacheVersionDO::getKey, key);
|
||||||
TableCacheVersionDO versionDO = getVersionMapper().selectOne(queryWrapper);
|
TableCacheVersionDO versionDO = getVersionMapper().selectOne(queryWrapper);
|
||||||
if (versionDO == null) {
|
if (versionDO == null) {
|
||||||
addCache(param,versionDO);
|
addCache(param, versionDO);
|
||||||
versionDO = getVersionMapper().selectOne(queryWrapper);
|
versionDO = getVersionMapper().selectOne(queryWrapper);
|
||||||
}
|
}
|
||||||
long version = "2".equals(versionDO.getStatus()) ? versionDO.getVersion() - 1 : versionDO.getVersion();
|
long version = "2".equals(versionDO.getStatus()) ? versionDO.getVersion() - 1 : versionDO.getVersion();
|
||||||
@ -598,4 +597,13 @@ public class TableServiceImpl implements TableService {
|
|||||||
}
|
}
|
||||||
return DataResult.of(false);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,6 +112,12 @@ public class TableController extends EmbeddingController {
|
|||||||
return ListResult.of(tableVOS);
|
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
|
* Query the table index under the current DB
|
||||||
*
|
*
|
||||||
|
@ -254,4 +254,6 @@ public abstract class RdbWebConverter {
|
|||||||
public abstract EsTableSchemaRequest req2req(TableBriefQueryRequest request);
|
public abstract EsTableSchemaRequest req2req(TableBriefQueryRequest request);
|
||||||
|
|
||||||
public abstract TablePageQueryParam schemaReq2page(EsTableSchemaRequest request);
|
public abstract TablePageQueryParam schemaReq2page(EsTableSchemaRequest request);
|
||||||
|
|
||||||
|
public abstract DmlSqlCopyParam dmlRequest2param(DmlSqlCopyRequest request) ;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
@ -81,4 +81,11 @@ public interface SqlBuilder {
|
|||||||
*/
|
*/
|
||||||
String generateSqlBasedOnResults(String tableName, List<Header> headerList, List<ResultOperation> operations);
|
String generateSqlBasedOnResults(String tableName, List<Header> headerList, List<ResultOperation> operations);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DML SQL
|
||||||
|
* @param table
|
||||||
|
* @param type
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
String getTableDmlSql(Table table,String type);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
package ai.chat2db.spi.enums;
|
||||||
|
|
||||||
|
public enum DmlType {
|
||||||
|
INSERT, UPDATE, DELETE, SELECT
|
||||||
|
}
|
@ -1,8 +1,8 @@
|
|||||||
package ai.chat2db.spi.jdbc;
|
package ai.chat2db.spi.jdbc;
|
||||||
|
|
||||||
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
|
|
||||||
import ai.chat2db.spi.MetaData;
|
import ai.chat2db.spi.MetaData;
|
||||||
import ai.chat2db.spi.SqlBuilder;
|
import ai.chat2db.spi.SqlBuilder;
|
||||||
|
import ai.chat2db.spi.enums.DmlType;
|
||||||
import ai.chat2db.spi.model.*;
|
import ai.chat2db.spi.model.*;
|
||||||
import ai.chat2db.spi.sql.Chat2DBContext;
|
import ai.chat2db.spi.sql.Chat2DBContext;
|
||||||
import ai.chat2db.spi.util.SqlUtils;
|
import ai.chat2db.spi.util.SqlUtils;
|
||||||
@ -101,13 +101,13 @@ public class DefaultSqlBuilder implements SqlBuilder {
|
|||||||
List<String> odlRow = operation.getOldDataList();
|
List<String> odlRow = operation.getOldDataList();
|
||||||
String sql = "";
|
String sql = "";
|
||||||
if ("UPDATE".equalsIgnoreCase(operation.getType())) {
|
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())) {
|
} else if ("CREATE".equalsIgnoreCase(operation.getType())) {
|
||||||
sql = getInsertSql(tableName,headerList, row, metaSchema);
|
sql = getInsertSql(tableName, headerList, row, metaSchema);
|
||||||
} else if ("DELETE".equalsIgnoreCase(operation.getType())) {
|
} 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())) {
|
} 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");
|
stringBuilder.append(sql + ";\n");
|
||||||
@ -115,6 +115,76 @@ public class DefaultSqlBuilder implements SqlBuilder {
|
|||||||
return stringBuilder.toString();
|
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) {
|
private List<String> getPrimaryColumns(List<Header> headerList) {
|
||||||
if (CollectionUtils.isEmpty(headerList)) {
|
if (CollectionUtils.isEmpty(headerList)) {
|
||||||
return Lists.newArrayList();
|
return Lists.newArrayList();
|
||||||
@ -132,7 +202,6 @@ public class DefaultSqlBuilder implements SqlBuilder {
|
|||||||
List<String> keyColumns) {
|
List<String> keyColumns) {
|
||||||
StringBuilder script = new StringBuilder();
|
StringBuilder script = new StringBuilder();
|
||||||
script.append("DELETE FROM ").append(tableName).append("");
|
script.append("DELETE FROM ").append(tableName).append("");
|
||||||
|
|
||||||
script.append(buildWhere(headerList, row, metaSchema, keyColumns));
|
script.append(buildWhere(headerList, row, metaSchema, keyColumns));
|
||||||
return script.toString();
|
return script.toString();
|
||||||
}
|
}
|
||||||
@ -178,7 +247,7 @@ public class DefaultSqlBuilder implements SqlBuilder {
|
|||||||
return script.toString();
|
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())) {
|
if (CollectionUtils.isEmpty(row) || ObjectUtils.allNull(row.toArray())) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user