feat: jpa 改造

This commit is contained in:
taojinlong
2025-08-14 17:22:02 +08:00
committed by taojinlong
parent 1cd67eba8f
commit 65a17c5032
13 changed files with 430 additions and 25 deletions

View File

@@ -127,7 +127,7 @@ public class DatasetDataManage {
Map map = JsonUtil.parseObject(datasourceSchemaDTO.getConfiguration(), Map.class);
if (!datasourceRequest.getIsCross()) {
if (ObjectUtils.isNotEmpty(map.get("schema"))) {
sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX, String.format(format, map.get("schema").toString()) );
sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX, String.format(format, map.get("schema").toString()));
} else {
sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX + "\\.", "");
}
@@ -185,6 +185,11 @@ public class DatasetDataManage {
String sql = TableUtils.tableName2Sql(datasourceSchemaDTO, tableInfoDTO.getTable()) + " LIMIT 0 OFFSET 0";
// replace schema alias, trans dialect
sql = Utils.replaceSchemaAlias(sql, datasourceRequest.getDsList());
Map map = JsonUtil.parseObject(datasourceSchemaDTO.getConfiguration(), Map.class);
if (ObjectUtils.isNotEmpty(map.get("schema"))) {
sql = sql.replaceAll(SqlPlaceholderConstants.KEYWORD_PREFIX_REGEX + datasourceSchemaDTO.getSchemaAlias() + SqlPlaceholderConstants.KEYWORD_SUFFIX_REGEX, String.format(format, map.get("schema").toString()));
}
sql = provider.transSqlDialect(sql, datasourceRequest.getDsList());
datasourceRequest.setQuery(sql);
logger.debug("calcite data table field sql: " + datasourceRequest.getQuery());

View File

@@ -537,7 +537,12 @@ public class DatasetSQLManage {
}
} else {
CoreDatasource coreDatasource = engineManage.getDeEngine();
schemaAlias = String.format(SQLConstants.SCHEMA, coreDatasource.getId());
Map map = JsonUtil.parseObject(coreDatasource.getConfiguration(), Map.class);
if (!isCross && ObjectUtils.isNotEmpty(map.get("schema"))) {
schemaAlias = (String) map.get("schema");
} else {
schemaAlias = String.format(SQLConstants.SCHEMA, coreDatasource.getId());
}
if (!dsMap.containsKey(coreDatasource.getId())) {
DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO();
BeanUtils.copyBean(datasourceSchemaDTO, coreDatasource);

View File

@@ -277,7 +277,7 @@ public class DatasourceSyncManage {
totalPage = dataList.size() / pageNumber;
}
for (int page = 1; page <= totalPage; page++) {
engineRequest.setQuery(engineProvider.insertSql(DatasourceConfiguration.DatasourceType.API.name(), datasourceRequest.getTable(), extractType, dataList, page, pageNumber, tableFields));
engineRequest.setQuery(engineProvider.insertSql(DatasourceConfiguration.DatasourceType.API.name(), datasourceRequest.getTable(), extractType, dataList, page, pageNumber, tableFields, engine));
calciteProvider.exec(engineRequest);
}
}
@@ -300,7 +300,7 @@ public class DatasourceSyncManage {
totalPage = dataList.size() / pageNumber;
}
for (int page = 1; page <= totalPage; page++) {
engineRequest.setQuery(engineProvider.insertSql(DatasourceConfiguration.DatasourceType.Excel.name(), datasourceRequest.getTable(), extractType, dataList, page, pageNumber, tableFields));
engineRequest.setQuery(engineProvider.insertSql(DatasourceConfiguration.DatasourceType.Excel.name(), datasourceRequest.getTable(), extractType, dataList, page, pageNumber, tableFields, engine));
calciteProvider.exec(engineRequest);
}
}
@@ -310,7 +310,7 @@ public class DatasourceSyncManage {
EngineRequest engineRequest = new EngineRequest();
engineRequest.setEngine(engine);
EngineProvider engineProvider = ProviderUtil.getEngineProvider(engine.getType());
String[] replaceTableSql = engineProvider.replaceTable(tableName).split(";");
String[] replaceTableSql = engineProvider.replaceTable(tableName, engine).split(";");
for (int i = 0; i < replaceTableSql.length; i++) {
if (StringUtils.isNotEmpty(replaceTableSql[i])) {
engineRequest.setQuery(replaceTableSql[i]);
@@ -344,7 +344,7 @@ public class DatasourceSyncManage {
EngineRequest engineRequest = new EngineRequest();
engineRequest.setEngine(engine);
EngineProvider engineProvider = ProviderUtil.getEngineProvider(engine.getType());
engineRequest.setQuery(engineProvider.dropTable(tableName));
engineRequest.setQuery(engineProvider.dropTable(tableName, engine));
if (engineProvider.needCheckExistTable()) {
DatasourceRequest datasourceRequest = new DatasourceRequest();
DatasourceDTO datasourceDTO = new DatasourceDTO();
@@ -353,7 +353,7 @@ public class DatasourceSyncManage {
if (calciteProvider.getTables(datasourceRequest).stream().map(DatasetTableDTO::getTableName).collect(Collectors.toList()).contains(tableName)) {
calciteProvider.exec(engineRequest);
}
}else {
} else {
calciteProvider.exec(engineRequest);
}
}

View File

@@ -270,6 +270,45 @@ public class EngineManage {
}
public static class SqlserverJdbcUrlParser implements JdbcUrlParser {
private static final Pattern PATTERN = Pattern.compile("jdbc:sqlserver://(.*):(\\d+);(.*)");
@Override
public Map<String, String> parse(String url, Environment env) {
Matcher matcher = PATTERN.matcher(url);
if (!matcher.find()) return null;
Map<String, String> config = new HashMap<>();
config.put("host", matcher.group(1));
config.put("port", matcher.group(2));
if (matcher.groupCount() == 3) {
String[] params = matcher.group(3).split(";");
String extraParams = "";
for (String s : params) {
if (s.startsWith("DatabaseName")) {
config.put("dataBase", s.split("=")[1]);
} else {
if (s.startsWith("currentSchema")) {
config.put("schema", s.split("=")[1]);
}
extraParams = extraParams + s + ";";
}
}
config.put("extraParams", extraParams);
}
if (StringUtils.isNotEmpty(env.getProperty("spring.datasource.hikari.schema"))) {
config.put("schema", env.getProperty("spring.datasource.hikari.schema"));
}
if (StringUtils.isNotEmpty(env.getProperty("spring.jpa.properties.hibernate.default_schema"))) {
config.put("schema", env.getProperty("spring.jpa.properties.hibernate.default_schema"));
}
config.put("type", "sqlServer");
config.put("username", env.getProperty("spring.datasource.username"));
config.put("password", env.getProperty("spring.datasource.password"));
return config;
}
}
/**
* Oracle JDBC URL解析器实现
* 支持两种格式的Oracle JDBC URL
@@ -354,6 +393,8 @@ public class EngineManage {
parserMap.put("jdbc:oracle:thin:@", new OracleJdbcUrlParser());
} else if (jdbcUrl.startsWith("jdbc:postgresql://")) {
parserMap.put("jdbc:postgresql://", new PgJdbcUrlParser());
} else if (jdbcUrl.startsWith("jdbc:sqlserver://")) {
parserMap.put("jdbc:sqlserver://", new SqlserverJdbcUrlParser());
}
}
}

View File

@@ -1009,6 +1009,7 @@ public class CalciteProvider extends Provider {
dataSource.setMaxTotal(configuration.getMaxPoolSize());
dataSource.setMinIdle(configuration.getMinPoolSize());
dataSource.setDefaultQueryTimeout(Integer.valueOf(configuration.getQueryTimeout()));
dataSource.setDefaultSchema(configuration.getSchema());
startSshSession(configuration, null, ds.getId());
dataSource.setUrl(configuration.getJdbc());
schema = JdbcSchema.create(rootSchema, ds.getSchemaAlias(), dataSource, null, configuration.getSchema());

View File

@@ -14,17 +14,17 @@ import java.util.List;
public abstract class EngineProvider {
public abstract String createView(String name, String viewSQL);
public abstract String dropTable(String name);
public abstract String dropTable(String name, CoreDeEngine engine);
public abstract boolean needCheckExistTable();
public abstract String dropView(String name);
public abstract String replaceTable(String name);
public abstract String replaceTable(String name, CoreDeEngine engine);
public abstract String createTableSql(String name, List<TableField> tableFields, CoreDeEngine engine);
public abstract String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List<String[]> dataList, int page, int pageNumber, List<TableField> tableFields);
public abstract String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List<String[]> dataList, int page, int pageNumber, List<TableField> tableFields, CoreDeEngine engine);
}

View File

@@ -25,7 +25,7 @@ public class H2EngineProvider extends EngineProvider {
}
@Override
public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List<String[]> dataList, int page, int pageNumber, List<TableField> tableFields) {
public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List<String[]> dataList, int page, int pageNumber, List<TableField> tableFields, CoreDeEngine engine) {
String engineTableName;
switch (extractType) {
case all_scope:
@@ -66,7 +66,7 @@ public class H2EngineProvider extends EngineProvider {
@Override
public String dropTable(String name) {
public String dropTable(String name, CoreDeEngine engine) {
return "DROP TABLE IF EXISTS `" + name + "`";
}
@@ -81,7 +81,7 @@ public class H2EngineProvider extends EngineProvider {
}
@Override
public String replaceTable(String name) {
public String replaceTable(String name, CoreDeEngine engine) {
return "ALTER TABLE `FROM_TABLE` rename to `FROM_TABLE_tmp`; ALTER TABLE `TO_TABLE` rename to `FROM_TABLE`; DROP TABLE IF EXISTS `FROM_TABLE_tmp`;".replace("FROM_TABLE", name).replace("TO_TABLE", TableUtils.tmpName(name));
}

View File

@@ -32,7 +32,7 @@ public class MysqlEngineProvider extends EngineProvider {
}
@Override
public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List<String[]> dataList, int page, int pageNumber, List<TableField> tableFields) {
public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List<String[]> dataList, int page, int pageNumber, List<TableField> tableFields, CoreDeEngine engine) {
String engineTableName;
switch (extractType) {
case all_scope:
@@ -87,7 +87,7 @@ public class MysqlEngineProvider extends EngineProvider {
@Override
public String dropTable(String name) {
public String dropTable(String name, CoreDeEngine engine) {
return "DROP TABLE IF EXISTS `" + name + "`";
}
@@ -102,7 +102,7 @@ public class MysqlEngineProvider extends EngineProvider {
}
@Override
public String replaceTable(String name) {
public String replaceTable(String name, CoreDeEngine engine) {
String replaceTableSql = "rename table `FROM_TABLE` to `FROM_TABLE_tmp`, `TO_TABLE` to `FROM_TABLE`, `FROM_TABLE_tmp` to `TO_TABLE`"
.replace("FROM_TABLE", name).replace("TO_TABLE", TableUtils.tmpName(name));
String dropTableSql = "DROP TABLE IF EXISTS `TABLE_NAME`".replace("TABLE_NAME", TableUtils.tmpName(name));

View File

@@ -32,7 +32,7 @@ public class OracleEngineProvider extends EngineProvider {
}
@Override
public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List<String[]> dataList, int page, int pageNumber, List<TableField> tableFields) {
public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List<String[]> dataList, int page, int pageNumber, List<TableField> tableFields, CoreDeEngine engine) {
String engineTableName;
switch (extractType) {
case all_scope:
@@ -86,7 +86,7 @@ public class OracleEngineProvider extends EngineProvider {
@Override
public String dropTable(String name) {
public String dropTable(String name, CoreDeEngine engine) {
return "DROP TABLE \"" + name + "\"";
}
@@ -96,7 +96,7 @@ public class OracleEngineProvider extends EngineProvider {
}
@Override
public String replaceTable(String name) {
public String replaceTable(String name, CoreDeEngine engine) {
String replaceTableSql = "rename \"FROM_TABLE\" to \"FROM_TABLE_tmp\"; rename \"TO_TABLE\" to \"FROM_TABLE\"; rename \"FROM_TABLE_tmp\" to \"TO_TABLE\"".replace("FROM_TABLE", name).replace("TO_TABLE", TableUtils.tmpName(name));
String dropTableSql = "DROP TABLE \"TABLE_NAME\"".replace("TABLE_NAME", TableUtils.tmpName(name));
return replaceTableSql + ";" + dropTableSql;

View File

@@ -0,0 +1,166 @@
package io.dataease.datasource.provider;
import io.dataease.dataset.utils.TableUtils;
import io.dataease.datasource.dao.auto.entity.CoreDeEngine;
import io.dataease.datasource.server.DatasourceServer;
import io.dataease.extensions.datasource.dto.TableField;
import io.dataease.extensions.datasource.vo.DatasourceConfiguration;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author gin
* @Date 2021/5/17 4:27 下午
*/
@Service("pgEngine")
public class PgEngineProvider extends EngineProvider {
private static final String creatTableSql =
"CREATE TABLE IF NOT EXISTS TABLE_NAME" +
"Column_Fields;";
@Override
public String createView(String name, String viewSQL) {
return "CREATE or replace view " + name + " AS (" + viewSQL + ")";
}
@Override
public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List<String[]> dataList, int page, int pageNumber, List<TableField> tableFields, CoreDeEngine engine) {
String engineTableName;
switch (extractType) {
case all_scope:
engineTableName = TableUtils.tmpName(TableUtils.tableName(tableName));
break;
default:
engineTableName = TableUtils.tableName(tableName);
break;
}
String insertSql = "INSERT INTO TABLE_NAME VALUES ".replace("TABLE_NAME", engineTableName);
StringBuffer values = new StringBuffer();
Integer realSize = page * pageNumber < dataList.size() ? page * pageNumber : dataList.size();
for (String[] strings : dataList.subList((page - 1) * pageNumber, realSize)) {
int length = 0;
String[] strings1 = new String[tableFields.stream().filter(TableField::isChecked).toList().size()];
for (int i = 0; i < strings.length; i++) {
if (tableFields.get(i).isChecked()) {
if (StringUtils.isEmpty(strings[i])) {
String type = tableFields.get(i).getType() == null ? tableFields.get(i).getFieldType() : tableFields.get(i).getType();
if (type.equals("LONG") || type.equals("DOUBLE")) {
strings1[length] = "0";
} else {
strings1[length] = null;
}
} else {
strings1[length] = strings[i].replace("\\", "\\\\").replace("'", "\\'");
}
length++;
}
}
values.append("('").append(String.join("','", Arrays.asList(strings1)))
.append("'),");
}
String insetSql = (insertSql + values.substring(0, values.length() - 1)).replaceAll("'null'", "null");
if (dsType.contains(DatasourceConfiguration.DatasourceType.API.name())) {
List<TableField> keys = tableFields.stream().filter(tableField -> tableField.isPrimaryKey() && tableField.isChecked()).toList();
List<TableField> notKeys = tableFields.stream().filter(tableField -> tableField.isChecked() && !tableField.isPrimaryKey()).toList();
if (CollectionUtils.isNotEmpty(keys) && extractType.equals(DatasourceServer.UpdateType.add_scope)) {
insetSql = insetSql + " ON CONFLICT (key) DO UPDATE SET ".replace("key", keys.stream().map(TableField::getName).collect(Collectors.joining(",")));
List<String> updateColumes = new ArrayList<>();
for (TableField notKey : notKeys) {
updateColumes.add("column = EXCLUDED.column".replace("column", notKey.getName()));
}
insetSql = insetSql + updateColumes.stream().collect(Collectors.joining(","));
}
}
return insetSql;
}
@Override
public String dropTable(String name, CoreDeEngine engine) {
return "DROP TABLE IF EXISTS " + name + "";
}
@Override
public boolean needCheckExistTable() {
return false;
}
@Override
public String dropView(String name) {
return "DROP VIEW IF EXISTS " + name + "";
}
@Override
public String replaceTable(String name, CoreDeEngine engine) {
String replaceTableSql = "ALTER table FROM_TABLE RENAME to FROM_TABLE_tmp; ALTER table TO_TABLE RENAME to FROM_TABLE; ALTER table FROM_TABLE_tmp RENAME to TO_TABLE"
.replace("FROM_TABLE", name).replace("TO_TABLE", TableUtils.tmpName(name));
String dropTableSql = "DROP TABLE IF EXISTS TABLE_NAME".replace("TABLE_NAME", TableUtils.tmpName(name));
return replaceTableSql + ";" + dropTableSql;
}
@Override
public String createTableSql(String tableName, List<TableField> tableFields, CoreDeEngine engine) {
String dorisTableColumnSql = createTableSql(tableFields);
return creatTableSql.replace("TABLE_NAME", tableName).replace("Column_Fields", dorisTableColumnSql);
}
private String createTableSql(final List<TableField> tableFields) {
StringBuilder columnFields = new StringBuilder("");
StringBuilder key = new StringBuilder();
for (TableField tableField : tableFields) {
if (!tableField.isChecked()) {
continue;
}
if (tableField.isPrimaryKey()) {
key.append("").append(tableField.getName()).append(", ");
}
columnFields.append(tableField.getName()).append(" ");
int size = tableField.getPrecision() * 4;
switch (tableField.getDeExtractType()) {
case 0:
if (StringUtils.isNotEmpty(tableField.getLength())) {
columnFields.append("varchar(length)".replace("length", tableField.getLength())).append(",");
} else {
columnFields.append("text").append(",");
}
break;
case 1:
columnFields.append("timestamp").append(",");
break;
case 2:
columnFields.append("bigint").append(",");
break;
case 3:
columnFields.append("numeric(27,8)").append(",");
break;
case 4:
columnFields.append("BOOLEAN".replace("length", String.valueOf(tableField.getPrecision()))).append(",");
break;
default:
columnFields.append("text").append(",");
break;
}
}
if (StringUtils.isEmpty(key.toString())) {
columnFields = new StringBuilder(columnFields.substring(0, columnFields.length() - 1));
} else {
key = new StringBuilder(key.substring(0, key.length() - 2));
columnFields.append(" PRIMARY KEY (PRIMARYKEY)".replace("PRIMARYKEY", key.toString()));
}
columnFields = new StringBuilder("(" + columnFields + ")");
return columnFields.toString();
}
}

View File

@@ -0,0 +1,172 @@
package io.dataease.datasource.provider;
import io.dataease.dataset.utils.TableUtils;
import io.dataease.datasource.dao.auto.entity.CoreDeEngine;
import io.dataease.datasource.server.DatasourceServer;
import io.dataease.datasource.type.Sqlserver;
import io.dataease.extensions.datasource.dto.TableField;
import io.dataease.extensions.datasource.vo.DatasourceConfiguration;
import io.dataease.utils.JsonUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author gin
* @Date 2021/5/17 4:27 下午
*/
@Service("sqlServerEngine")
public class SqlServerEngineProvider extends EngineProvider {
private static final String creatTableSql =
"CREATE TABLE TABLE_NAME" +
"Column_Fields;";
@Override
public String createView(String name, String viewSQL) {
return "CREATE or replace view " + name + " AS (" + viewSQL + ")";
}
@Override
public String insertSql(String dsType, String tableName, DatasourceServer.UpdateType extractType, List<String[]> dataList, int page, int pageNumber, List<TableField> tableFields, CoreDeEngine engine) {
Sqlserver sqlserver = JsonUtil.parseObject(engine.getConfiguration(), Sqlserver.class);
String engineTableName;
switch (extractType) {
case all_scope:
engineTableName = TableUtils.tmpName(TableUtils.tableName(tableName));
break;
default:
engineTableName = TableUtils.tableName(tableName);
break;
}
String insertSql = "INSERT INTO TABLE_NAME VALUES ".replace("TABLE_NAME", sqlserver.getSchema() + "." + engineTableName);
StringBuffer values = new StringBuffer();
Integer realSize = page * pageNumber < dataList.size() ? page * pageNumber : dataList.size();
for (String[] strings : dataList.subList((page - 1) * pageNumber, realSize)) {
int length = 0;
String[] strings1 = new String[tableFields.stream().filter(TableField::isChecked).toList().size()];
for (int i = 0; i < strings.length; i++) {
if (tableFields.get(i).isChecked()) {
if (StringUtils.isEmpty(strings[i])) {
String type = tableFields.get(i).getType() == null ? tableFields.get(i).getFieldType() : tableFields.get(i).getType();
if (type.equals("LONG") || type.equals("DOUBLE")) {
strings1[length] = "0";
} else {
strings1[length] = null;
}
} else {
strings1[length] = strings[i].replace("\\", "\\\\").replace("'", "\\'");
}
length++;
}
}
values.append("('").append(String.join("','", Arrays.asList(strings1)))
.append("'),");
}
String insetSql = (insertSql + values.substring(0, values.length() - 1)).replaceAll("'null'", "null");
if (dsType.contains(DatasourceConfiguration.DatasourceType.API.name())) {
List<TableField> keys = tableFields.stream().filter(tableField -> tableField.isPrimaryKey() && tableField.isChecked()).toList();
List<TableField> notKeys = tableFields.stream().filter(tableField -> tableField.isChecked() && !tableField.isPrimaryKey()).toList();
if (CollectionUtils.isNotEmpty(keys) && extractType.equals(DatasourceServer.UpdateType.add_scope)) {
insetSql = insetSql + " ON CONFLICT (key) DO UPDATE SET ".replace("key", keys.stream().map(TableField::getName).collect(Collectors.joining(",")));
List<String> updateColumes = new ArrayList<>();
for (TableField notKey : notKeys) {
updateColumes.add("column = EXCLUDED.column".replace("column", notKey.getName()));
}
insetSql = insetSql + updateColumes.stream().collect(Collectors.joining(","));
}
}
return insetSql;
}
@Override
public String dropTable(String name, CoreDeEngine engine) {
Sqlserver sqlserver = JsonUtil.parseObject(engine.getConfiguration(), Sqlserver.class);
return "DROP TABLE " + sqlserver.getSchema() + "." + name + "";
}
@Override
public boolean needCheckExistTable() {
return true;
}
@Override
public String dropView(String name) {
return "DROP VIEW " + name + "";
}
@Override
public String replaceTable(String name, CoreDeEngine engine) {
Sqlserver sqlserver = JsonUtil.parseObject(engine.getConfiguration(), Sqlserver.class);
String replaceTableSql = " EXEC sp_rename 'SCHEMA.FROM_TABLE', 'FROM_TABLE_tmp', 'OBJECT'; EXEC sp_rename 'SCHEMA.TO_TABLE', 'FROM_TABLE', 'OBJECT'; EXEC sp_rename 'SCHEMA.FROM_TABLE_tmp', 'TO_TABLE', 'OBJECT' "
.replace("FROM_TABLE", name).replace("TO_TABLE", TableUtils.tmpName(name)).replace("SCHEMA", sqlserver.getSchema());
String dropTableSql = "DROP TABLE TABLE_NAME".replace("TABLE_NAME", sqlserver.getSchema() + "." + TableUtils.tmpName(name));
return replaceTableSql + ";" + dropTableSql;
}
@Override
public String createTableSql(String tableName, List<TableField> tableFields, CoreDeEngine engine) {
String dorisTableColumnSql = createTableSql(tableFields);
Sqlserver sqlserver = JsonUtil.parseObject(engine.getConfiguration(), Sqlserver.class);
return creatTableSql.replace("TABLE_NAME", sqlserver.getSchema() + "." + tableName).replace("Column_Fields", dorisTableColumnSql);
}
private String createTableSql(final List<TableField> tableFields) {
StringBuilder columnFields = new StringBuilder("");
StringBuilder key = new StringBuilder();
for (TableField tableField : tableFields) {
if (!tableField.isChecked()) {
continue;
}
if (tableField.isPrimaryKey()) {
key.append("").append(tableField.getName()).append(", ");
}
columnFields.append(tableField.getName()).append(" ");
int size = tableField.getPrecision() * 4;
switch (tableField.getDeExtractType()) {
case 0:
if (StringUtils.isNotEmpty(tableField.getLength())) {
columnFields.append("varchar(length)".replace("length", tableField.getLength())).append(",");
} else {
columnFields.append("varchar(max)").append(",");
}
break;
case 1:
columnFields.append("DATETIME").append(",");
break;
case 2:
columnFields.append("bigint").append(",");
break;
case 3:
columnFields.append("DECIMAL(27,8)").append(",");
break;
case 4:
columnFields.append("TINYINT".replace("length", String.valueOf(tableField.getPrecision()))).append(",");
break;
default:
columnFields.append("varchar(max)").append(",");
break;
}
}
if (StringUtils.isEmpty(key.toString())) {
columnFields = new StringBuilder(columnFields.substring(0, columnFields.length() - 1));
} else {
key = new StringBuilder(key.substring(0, key.length() - 2));
columnFields.append(" PRIMARY KEY (PRIMARYKEY)".replace("PRIMARYKEY", key.toString()));
}
columnFields = new StringBuilder("(" + columnFields + ")");
return columnFields.toString();
}
}

View File

@@ -31,11 +31,13 @@ import io.dataease.datasource.provider.ExcelUtils;
import io.dataease.datasource.type.H2;
import io.dataease.datasource.type.Mysql;
import io.dataease.datasource.type.Oracle;
import io.dataease.datasource.type.Sqlserver;
import io.dataease.exception.DEException;
import io.dataease.extensions.datasource.api.PluginManageApi;
import io.dataease.extensions.datasource.dto.*;
import io.dataease.extensions.datasource.factory.ProviderFactory;
import io.dataease.extensions.datasource.provider.Provider;
import io.dataease.extensions.datasource.vo.Configuration;
import io.dataease.extensions.datasource.vo.DatasourceConfiguration;
import io.dataease.extensions.datasource.vo.XpackPluginsDatasourceVO;
import io.dataease.i18n.Translator;
@@ -1102,7 +1104,17 @@ public class DatasourceServer implements DatasourceApi {
if (ObjectUtils.isEmpty(tableName) || ObjectUtils.isEmpty(id)) {
return null;
}
String sql = "SELECT * FROM `" + tableName + "`";
DatasourceSchemaDTO datasourceSchemaDTO = new DatasourceSchemaDTO();
BeanUtils.copyBean(datasourceSchemaDTO, engineManage.getDeEngine());
Configuration configuration = JsonUtil.parseObject(datasourceSchemaDTO.getConfiguration(), Configuration.class);
String schema = StringUtils.isNotEmpty(configuration.getSchema()) ? configuration.getSchema() + "." : "";
String sql = "SELECT * FROM " + schema + tableName;
Provider provider = ProviderFactory.getDefaultProvider();
Map<Long, DatasourceSchemaDTO> dsMap = new HashMap<>();
datasourceSchemaDTO.setSchemaAlias(String.format(SQLConstants.SCHEMA, datasourceSchemaDTO.getId()));
dsMap.put(datasourceSchemaDTO.getId(), datasourceSchemaDTO);
sql = provider.transSqlDialect(sql, dsMap);
sql = new String(Base64.getEncoder().encode(sql.getBytes()));
PreviewSqlDTO previewSqlDTO = new PreviewSqlDTO();
previewSqlDTO.setSql(sql);
@@ -1363,7 +1375,7 @@ public class DatasourceServer implements DatasourceApi {
if (hidePw) {
Provider provider = ProviderFactory.getProvider(datasourceDTO.getType());
provider.hidePW(datasourceDTO);
}else {
} else {
switch (datasourceDTO.getType()) {
case "mysql":
datasourceDTO.setConfiguration(JsonUtil.toJSONString(JsonUtil.parseObject(datasourceDTO.getConfiguration(), Mysql.class)).toString());
@@ -1374,6 +1386,9 @@ public class DatasourceServer implements DatasourceApi {
case "oracle":
datasourceDTO.setConfiguration(JsonUtil.toJSONString(JsonUtil.parseObject(datasourceDTO.getConfiguration(), Oracle.class)).toString());
break;
case "sqlServer":
datasourceDTO.setConfiguration(JsonUtil.toJSONString(JsonUtil.parseObject(datasourceDTO.getConfiguration(), Sqlserver.class)).toString());
break;
}
}
}

View File

@@ -5,10 +5,7 @@ import io.dataease.datasource.dao.auto.entity.CoreDeEngine;
import io.dataease.datasource.dao.auto.repository.CoreDeEngineRepository;
import io.dataease.datasource.manage.EngineManage;
import io.dataease.datasource.provider.CalciteProvider;
import io.dataease.datasource.type.H2;
import io.dataease.datasource.type.Impala;
import io.dataease.datasource.type.Mysql;
import io.dataease.datasource.type.Oracle;
import io.dataease.datasource.type.*;
import io.dataease.exception.DEException;
import io.dataease.extensions.datasource.dto.DatasourceDTO;
import io.dataease.utils.*;
@@ -53,6 +50,9 @@ public class EngineServer implements EngineApi {
case "oracle":
datasourceDTO.setConfiguration(JsonUtil.toJSONString(JsonUtil.parseObject(datasourceDTO.getConfiguration(), Oracle.class)).toString());
break;
case "sqlServer":
datasourceDTO.setConfiguration(JsonUtil.toJSONString(JsonUtil.parseObject(datasourceDTO.getConfiguration(), Sqlserver.class)).toString());
break;
}
datasourceDTO.setConfiguration(RsaUtils.symmetricEncrypt(datasourceDTO.getConfiguration()));
return datasourceDTO;