mirror of
https://github.com/dataease/dataease.git
synced 2026-06-16 19:33:11 +08:00
feat: jpa 改造
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user