forked from github/dataease
feat: 支持集群(doris)
This commit is contained in:
parent
301b5155c0
commit
1fa8fae237
@ -8,4 +8,7 @@ import lombok.Setter;
|
|||||||
public class DorisConfiguration extends MysqlConfiguration {
|
public class DorisConfiguration extends MysqlConfiguration {
|
||||||
|
|
||||||
private Integer httpPort;
|
private Integer httpPort;
|
||||||
|
|
||||||
|
private Integer replicationNum = 1;
|
||||||
|
private Integer bucketNum = 10;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package io.dataease.provider;
|
package io.dataease.provider;
|
||||||
|
|
||||||
import io.dataease.base.domain.DatasetTableField;
|
import io.dataease.base.domain.DatasetTableField;
|
||||||
|
import io.dataease.base.domain.Datasource;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -17,7 +18,7 @@ public abstract class DDLProvider {
|
|||||||
|
|
||||||
public abstract String replaceTable(String name);
|
public abstract String replaceTable(String name);
|
||||||
|
|
||||||
public abstract String createTableSql(String name, List<DatasetTableField> datasetTableFields);
|
public abstract String createTableSql(String name, List<DatasetTableField> datasetTableFields, Datasource engine);
|
||||||
|
|
||||||
public abstract String insertSql(String name, List<String[]> dataList, int page, int pageNumber);
|
public abstract String insertSql(String name, List<String[]> dataList, int page, int pageNumber);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package io.dataease.provider;
|
package io.dataease.provider;
|
||||||
|
|
||||||
import io.dataease.base.domain.DatasetTableField;
|
import io.dataease.base.domain.DatasetTableField;
|
||||||
|
import io.dataease.base.domain.Datasource;
|
||||||
import io.dataease.commons.utils.Md5Utils;
|
import io.dataease.commons.utils.Md5Utils;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -28,7 +29,7 @@ public class DDLProviderImpl extends DDLProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createTableSql(String name, List<DatasetTableField> datasetTableFields) {
|
public String createTableSql(String name, List<DatasetTableField> datasetTableFields, Datasource engine) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
package io.dataease.provider.engine.doris;
|
package io.dataease.provider.engine.doris;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
import io.dataease.base.domain.DatasetTableField;
|
import io.dataease.base.domain.DatasetTableField;
|
||||||
|
import io.dataease.base.domain.Datasource;
|
||||||
import io.dataease.commons.utils.TableUtils;
|
import io.dataease.commons.utils.TableUtils;
|
||||||
|
import io.dataease.dto.datasource.DorisConfiguration;
|
||||||
|
import io.dataease.dto.datasource.JdbcConfiguration;
|
||||||
|
import io.dataease.dto.datasource.MysqlConfiguration;
|
||||||
import io.dataease.provider.DDLProviderImpl;
|
import io.dataease.provider.DDLProviderImpl;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
@ -16,8 +21,8 @@ public class DorisDDLProvider extends DDLProviderImpl {
|
|||||||
private static final String creatTableSql = "CREATE TABLE IF NOT EXISTS `TABLE_NAME`" +
|
private static final String creatTableSql = "CREATE TABLE IF NOT EXISTS `TABLE_NAME`" +
|
||||||
"Column_Fields" +
|
"Column_Fields" +
|
||||||
"UNIQUE KEY(dataease_uuid)\n" +
|
"UNIQUE KEY(dataease_uuid)\n" +
|
||||||
"DISTRIBUTED BY HASH(dataease_uuid) BUCKETS 10\n" +
|
"DISTRIBUTED BY HASH(dataease_uuid) BUCKETS BUCKETS_NUM\n" +
|
||||||
"PROPERTIES(\"replication_num\" = \"1\");";
|
"PROPERTIES(\"replication_num\" = \"ReplicationNum\");";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createView(String name, String viewSQL) {
|
public String createView(String name, String viewSQL) {
|
||||||
@ -41,9 +46,12 @@ public class DorisDDLProvider extends DDLProviderImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createTableSql(String tableName, List<DatasetTableField> datasetTableFields) {
|
public String createTableSql(String tableName, List<DatasetTableField> datasetTableFields, Datasource engine) {
|
||||||
|
DorisConfiguration dorisConfiguration = new Gson().fromJson(engine.getConfiguration(), DorisConfiguration.class);
|
||||||
String dorisTableColumnSql = createDorisTableColumnSql(datasetTableFields);
|
String dorisTableColumnSql = createDorisTableColumnSql(datasetTableFields);
|
||||||
return creatTableSql.replace("TABLE_NAME", tableName).replace("Column_Fields", dorisTableColumnSql);
|
return creatTableSql.replace("TABLE_NAME", tableName).replace("Column_Fields", dorisTableColumnSql)
|
||||||
|
.replace("BUCKETS_NUM", dorisConfiguration.getBucketNum().toString())
|
||||||
|
.replace("ReplicationNum", dorisConfiguration.getReplicationNum().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private String createDorisTableColumnSql(final List<DatasetTableField> datasetTableFields) {
|
private String createDorisTableColumnSql(final List<DatasetTableField> datasetTableFields) {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package io.dataease.provider.engine.mysql;
|
package io.dataease.provider.engine.mysql;
|
||||||
|
|
||||||
import io.dataease.base.domain.DatasetTableField;
|
import io.dataease.base.domain.DatasetTableField;
|
||||||
|
import io.dataease.base.domain.Datasource;
|
||||||
import io.dataease.commons.utils.TableUtils;
|
import io.dataease.commons.utils.TableUtils;
|
||||||
import io.dataease.provider.DDLProviderImpl;
|
import io.dataease.provider.DDLProviderImpl;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -43,7 +44,7 @@ public class MysqlDDLProvider extends DDLProviderImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String createTableSql(String tableName, List<DatasetTableField> datasetTableFields) {
|
public String createTableSql(String tableName, List<DatasetTableField> datasetTableFields, Datasource engine) {
|
||||||
String dorisTableColumnSql = createDorisTableColumnSql(datasetTableFields);
|
String dorisTableColumnSql = createDorisTableColumnSql(datasetTableFields);
|
||||||
return creatTableSql.replace("TABLE_NAME", tableName).replace("Column_Fields", dorisTableColumnSql);
|
return creatTableSql.replace("TABLE_NAME", tableName).replace("Column_Fields", dorisTableColumnSql);
|
||||||
}
|
}
|
||||||
|
@ -605,7 +605,7 @@ public class ExtractDataService {
|
|||||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||||
datasourceRequest.setDatasource(engine);
|
datasourceRequest.setDatasource(engine);
|
||||||
DDLProvider ddlProvider = ProviderFactory.getDDLProvider(engine.getType());
|
DDLProvider ddlProvider = ProviderFactory.getDDLProvider(engine.getType());
|
||||||
datasourceRequest.setQuery(ddlProvider.createTableSql(tableName, datasetTableFields));
|
datasourceRequest.setQuery(ddlProvider.createTableSql(tableName, datasetTableFields, engine));
|
||||||
jdbcProvider.exec(datasourceRequest);
|
jdbcProvider.exec(datasourceRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,6 +59,11 @@ public class DatasourceService {
|
|||||||
|
|
||||||
@DeCleaner(DePermissionType.DATASOURCE)
|
@DeCleaner(DePermissionType.DATASOURCE)
|
||||||
public Datasource addDatasource(Datasource datasource) throws Exception{
|
public Datasource addDatasource(Datasource datasource) throws Exception{
|
||||||
|
try{
|
||||||
|
DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasource.getType());
|
||||||
|
}catch (Exception e){
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
checkName(datasource);
|
checkName(datasource);
|
||||||
long currentTimeMillis = System.currentTimeMillis();
|
long currentTimeMillis = System.currentTimeMillis();
|
||||||
datasource.setId(UUID.randomUUID().toString());
|
datasource.setId(UUID.randomUUID().toString());
|
||||||
|
@ -9,6 +9,7 @@ import io.dataease.commons.utils.BeanUtils;
|
|||||||
import io.dataease.controller.ResultHolder;
|
import io.dataease.controller.ResultHolder;
|
||||||
import io.dataease.controller.request.datasource.DatasourceRequest;
|
import io.dataease.controller.request.datasource.DatasourceRequest;
|
||||||
import io.dataease.dto.DatasourceDTO;
|
import io.dataease.dto.DatasourceDTO;
|
||||||
|
import io.dataease.listener.util.CacheUtils;
|
||||||
import io.dataease.provider.ProviderFactory;
|
import io.dataease.provider.ProviderFactory;
|
||||||
import io.dataease.provider.datasource.DatasourceProvider;
|
import io.dataease.provider.datasource.DatasourceProvider;
|
||||||
import io.dataease.service.datasource.DatasourceService;
|
import io.dataease.service.datasource.DatasourceService;
|
||||||
@ -31,8 +32,6 @@ public class EngineService {
|
|||||||
private DeEngineMapper deEngineMapper;
|
private DeEngineMapper deEngineMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private DatasourceService datasource;
|
private DatasourceService datasource;
|
||||||
static private Datasource ds = null;
|
|
||||||
|
|
||||||
|
|
||||||
public Boolean isLocalMode(){
|
public Boolean isLocalMode(){
|
||||||
return env.getProperty("engine_mode", "local").equalsIgnoreCase("local");
|
return env.getProperty("engine_mode", "local").equalsIgnoreCase("local");
|
||||||
@ -51,7 +50,13 @@ public class EngineService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public DeEngine info(){
|
public DeEngine info(){
|
||||||
List<DeEngine> deEngines = deEngineMapper.selectByExampleWithBLOBs(new DeEngineExample());
|
DeEngineExample deEngineExample = new DeEngineExample();
|
||||||
|
if(isClusterMode()){
|
||||||
|
deEngineExample.createCriteria().andTypeEqualTo("engine_doris");
|
||||||
|
}else {
|
||||||
|
deEngineExample.createCriteria().andTypeEqualTo("engine_mysql");
|
||||||
|
}
|
||||||
|
List<DeEngine> deEngines = deEngineMapper.selectByExampleWithBLOBs(deEngineExample);
|
||||||
if(CollectionUtils.isEmpty(deEngines)){
|
if(CollectionUtils.isEmpty(deEngines)){
|
||||||
return new DeEngine();
|
return new DeEngine();
|
||||||
}
|
}
|
||||||
@ -69,7 +74,7 @@ public class EngineService {
|
|||||||
datasourceProvider.checkStatus(datasourceRequest);
|
datasourceProvider.checkStatus(datasourceRequest);
|
||||||
return ResultHolder.success(datasource);
|
return ResultHolder.success(datasource);
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
return ResultHolder.error("Datasource is invalid: " + e.getMessage());
|
return ResultHolder.error("Engine is invalid: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,26 +84,23 @@ public class EngineService {
|
|||||||
deEngineMapper.insert(engine);
|
deEngineMapper.insert(engine);
|
||||||
}else {
|
}else {
|
||||||
deEngineMapper.updateByPrimaryKeyWithBLOBs(engine);
|
deEngineMapper.updateByPrimaryKeyWithBLOBs(engine);
|
||||||
|
datasource.handleConnectionPool(getDeEngine(), "delete");
|
||||||
}
|
}
|
||||||
datasource.handleConnectionPool(this.ds, "delete");
|
|
||||||
setDs(engine);
|
setDs(engine);
|
||||||
datasource.handleConnectionPool(this.ds, "add");
|
datasource.handleConnectionPool(getDeEngine(), "add");
|
||||||
return ResultHolder.success(engine);
|
return ResultHolder.success(engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setDs(DeEngine engine){
|
private void setDs(DeEngine engine){
|
||||||
if(this.ds == null){
|
CacheUtils.put("ENGINE", "engine", engine, null, null);
|
||||||
this.ds = new Datasource();
|
|
||||||
BeanUtils.copyBean(this.ds, engine);
|
|
||||||
}else {
|
|
||||||
BeanUtils.copyBean(this.ds, engine);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Datasource getDeEngine() throws Exception{
|
public Datasource getDeEngine() throws Exception{
|
||||||
if (this.ds != null) {
|
Object catcheEngine = CacheUtils.get("ENGINE", "engine");
|
||||||
return this.ds;
|
if(catcheEngine != null){
|
||||||
|
return (Datasource) catcheEngine;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isLocalMode()){
|
if(isLocalMode()){
|
||||||
JSONObject jsonObject = new JSONObject();
|
JSONObject jsonObject = new JSONObject();
|
||||||
jsonObject.put("dataSourceType", "jdbc");
|
jsonObject.put("dataSourceType", "jdbc");
|
||||||
@ -123,12 +125,7 @@ public class EngineService {
|
|||||||
}
|
}
|
||||||
setDs(deEngines.get(0));
|
setDs(deEngines.get(0));
|
||||||
}
|
}
|
||||||
// if(isSimpleMode()){
|
return getDeEngine();
|
||||||
//
|
|
||||||
// }
|
|
||||||
|
|
||||||
//TODO cluster mode
|
|
||||||
return this.ds;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1301,6 +1301,7 @@ export default {
|
|||||||
user_name: '用户名',
|
user_name: '用户名',
|
||||||
password: '密码',
|
password: '密码',
|
||||||
host: '主机名/IP地址',
|
host: '主机名/IP地址',
|
||||||
|
doris_host: 'Doris 地址',
|
||||||
port: '端口',
|
port: '端口',
|
||||||
datasource_url: '地址',
|
datasource_url: '地址',
|
||||||
please_input_datasource_url: '请输入 Elasticsearch 地址,如: http://es_host:es_port',
|
please_input_datasource_url: '请输入 Elasticsearch 地址,如: http://es_host:es_port',
|
||||||
@ -1332,6 +1333,10 @@ export default {
|
|||||||
initial_pool_size: '初始连接数',
|
initial_pool_size: '初始连接数',
|
||||||
min_pool_size: '最小连接数',
|
min_pool_size: '最小连接数',
|
||||||
max_pool_size: '最大连接数',
|
max_pool_size: '最大连接数',
|
||||||
|
bucket_num: 'Bucket 数量',
|
||||||
|
replication_num: '副本数量',
|
||||||
|
please_input_bucket_num: '请输入 Bucket 数量',
|
||||||
|
please_input_replication_num: '请输入副本数量',
|
||||||
max_idle_time: '最大空闲(秒)',
|
max_idle_time: '最大空闲(秒)',
|
||||||
acquire_increment: '增长数',
|
acquire_increment: '增长数',
|
||||||
connect_timeout: '连接超时(秒)',
|
connect_timeout: '连接超时(秒)',
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<!--邮件表单-->
|
|
||||||
<el-form ref="form" v-loading="loading"
|
<el-form ref="form" v-loading="loading"
|
||||||
:model="form"
|
:model="form"
|
||||||
:rules="rules"
|
:rules="rules"
|
||||||
|
@ -30,6 +30,10 @@
|
|||||||
<simple-mode />
|
<simple-mode />
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
|
|
||||||
|
<el-tab-pane v-if="engineMode==='cluster'" :lazy="true" :label="$t('system_parameter_setting.engine_mode_setting')" name="six">
|
||||||
|
<cluster-mode />
|
||||||
|
</el-tab-pane>
|
||||||
|
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</layout-content>
|
</layout-content>
|
||||||
</template>
|
</template>
|
||||||
@ -37,13 +41,14 @@
|
|||||||
import BasicSetting from './BasicSetting'
|
import BasicSetting from './BasicSetting'
|
||||||
import EmailSetting from './EmailSetting'
|
import EmailSetting from './EmailSetting'
|
||||||
import SimpleMode from './SimpleModeSetting'
|
import SimpleMode from './SimpleModeSetting'
|
||||||
|
import ClusterMode from './ClusterModeSetting'
|
||||||
import LayoutContent from '@/components/business/LayoutContent'
|
import LayoutContent from '@/components/business/LayoutContent'
|
||||||
import PluginCom from '@/views/system/plugin/PluginCom'
|
import PluginCom from '@/views/system/plugin/PluginCom'
|
||||||
import { pluginLoaded } from '@/api/user'
|
import { pluginLoaded } from '@/api/user'
|
||||||
import { engineMode } from '@/api/system/engine'
|
import { engineMode } from '@/api/system/engine'
|
||||||
export default {
|
export default {
|
||||||
|
|
||||||
components: { BasicSetting, EmailSetting, LayoutContent, PluginCom, SimpleMode},
|
components: { BasicSetting, EmailSetting, LayoutContent, PluginCom, SimpleMode, ClusterMode},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
activeName: 'zero',
|
activeName: 'zero',
|
||||||
|
Loading…
Reference in New Issue
Block a user