diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java index 1deadd9115..0c7157d716 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetDataManage.java @@ -90,7 +90,7 @@ public class DatasetDataManage { } BeanUtils.copyBean(datasourceSchemaDTO, coreDatasource); datasourceSchemaDTO.setSchemaAlias(String.format(SQLConstants.SCHEMA, datasourceSchemaDTO.getId())); - Provider provider = ProviderFactory.getDefaultProvider(); + Provider provider = ProviderFactory.getProvider(coreDatasource.getType()); DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDsList(Map.of(datasourceSchemaDTO.getId(), datasourceSchemaDTO)); @@ -149,9 +149,9 @@ public class DatasetDataManage { dto.setChecked(defaultStatus); dto.setType(ele.getType()); int deType = FieldUtils.transType2DeType(ele.getType()); - dto.setDeExtractType(deType); - dto.setDeType(deType); - dto.setGroupType(FieldUtils.transDeType2DQ(deType)); + dto.setDeExtractType(ObjectUtils.isEmpty(ele.getDeExtractType()) ? deType : ele.getDeExtractType()); + dto.setDeType(ObjectUtils.isEmpty(ele.getDeType()) ? deType : ele.getDeType()); + dto.setGroupType(FieldUtils.transDeType2DQ(dto.getDeType())); dto.setExtField(0); dto.setDescription(StringUtils.isNotEmpty(ele.getName()) ? ele.getName() : null); return dto; diff --git a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java index ee315bfbe0..b2af1a1974 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/manage/DatasetSQLManage.java @@ -1,13 +1,5 @@ package io.dataease.dataset.manage; -import io.dataease.extensions.datasource.dto.DatasetTableDTO; -import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; -import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; -import io.dataease.extensions.datasource.model.SQLObj; -import io.dataease.extensions.datasource.vo.DatasourceConfiguration; -import io.dataease.extensions.view.dto.ChartExtFilterDTO; -import io.dataease.extensions.view.dto.ChartExtRequest; -import io.dataease.extensions.view.dto.SqlVariableDetails; import io.dataease.api.dataset.union.*; import io.dataease.api.permissions.auth.dto.BusiPerCheckDTO; import io.dataease.commons.utils.SqlparserUtils; @@ -22,6 +14,16 @@ import io.dataease.datasource.manage.EngineManage; import io.dataease.engine.constant.ExtFieldConstant; import io.dataease.engine.constant.SQLConstants; import io.dataease.exception.DEException; +import io.dataease.extensions.datasource.dto.DatasetTableDTO; +import io.dataease.extensions.datasource.dto.DatasetTableFieldDTO; +import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; +import io.dataease.extensions.datasource.dto.DsTypeDTO; +import io.dataease.extensions.datasource.model.SQLObj; +import io.dataease.extensions.datasource.vo.DatasourceConfiguration; +import io.dataease.extensions.datasource.vo.PluginDatasourceType; +import io.dataease.extensions.view.dto.ChartExtFilterDTO; +import io.dataease.extensions.view.dto.ChartExtRequest; +import io.dataease.extensions.view.dto.SqlVariableDetails; import io.dataease.i18n.Translator; import io.dataease.system.manage.CorePermissionManage; import io.dataease.utils.BeanUtils; @@ -135,7 +137,7 @@ public class DatasetSQLManage { prefix = "`"; suffix = "`"; } else { - DatasourceConfiguration.DatasourceType datasourceType = getDatasourceType(dsMap, datasetTable.getDatasourceId()); + DsTypeDTO datasourceType = getDatasourceType(dsMap, datasetTable.getDatasourceId()); prefix = datasourceType.getPrefix(); suffix = datasourceType.getSuffix(); } @@ -188,7 +190,7 @@ public class DatasetSQLManage { tablePrefix = "`"; tableSuffix = "`"; } else { - DatasourceConfiguration.DatasourceType datasourceType = getDatasourceType(dsMap, currentDs1.getDatasourceId()); + DsTypeDTO datasourceType = getDatasourceType(dsMap, currentDs1.getDatasourceId()); tablePrefix = datasourceType.getPrefix(); tableSuffix = datasourceType.getSuffix(); } @@ -214,7 +216,7 @@ public class DatasetSQLManage { pPrefix = "`"; pSuffix = "`"; } else { - DatasourceConfiguration.DatasourceType datasourceType = getDatasourceType(dsMap, parentDs.getDatasourceId()); + DsTypeDTO datasourceType = getDatasourceType(dsMap, parentDs.getDatasourceId()); pPrefix = datasourceType.getPrefix(); pSuffix = datasourceType.getSuffix(); } @@ -226,7 +228,7 @@ public class DatasetSQLManage { cPrefix = "`"; cSuffix = "`"; } else { - DatasourceConfiguration.DatasourceType datasourceType = getDatasourceType(dsMap, currentDs1.getDatasourceId()); + DsTypeDTO datasourceType = getDatasourceType(dsMap, currentDs1.getDatasourceId()); cPrefix = datasourceType.getPrefix(); cSuffix = datasourceType.getSuffix(); } @@ -305,7 +307,7 @@ public class DatasetSQLManage { prefix = "`"; suffix = "`"; } else { - DatasourceConfiguration.DatasourceType datasourceType = getDatasourceType(dsMap, datasetTable.getDatasourceId()); + DsTypeDTO datasourceType = getDatasourceType(dsMap, datasetTable.getDatasourceId()); prefix = datasourceType.getPrefix(); suffix = datasourceType.getSuffix(); } @@ -348,7 +350,7 @@ public class DatasetSQLManage { } } - private DatasourceConfiguration.DatasourceType getDatasourceType(Map dsMap, Long datasourceId) { + private DsTypeDTO getDatasourceType(Map dsMap, Long datasourceId) { DatasourceSchemaDTO datasourceSchemaDTO = dsMap.get(datasourceId); String type; if (datasourceSchemaDTO == null) { @@ -360,7 +362,17 @@ public class DatasetSQLManage { } else { type = datasourceSchemaDTO.getType(); } - return DatasourceConfiguration.DatasourceType.valueOf(type); + if (Arrays.stream(DatasourceConfiguration.DatasourceType.values()).map(DatasourceConfiguration.DatasourceType::getType).toList().contains(type)) { + DatasourceConfiguration.DatasourceType datasourceType = DatasourceConfiguration.DatasourceType.valueOf(type); + DsTypeDTO dto = new DsTypeDTO(); + BeanUtils.copyBean(dto, datasourceType); + return dto; + } else { + PluginDatasourceType.DatasourceType datasourceType = PluginDatasourceType.DatasourceType.valueOf(type); + DsTypeDTO dto = new DsTypeDTO(); + BeanUtils.copyBean(dto, datasourceType); + return dto; + } } public String subPrefixSuffixChar(String str) { diff --git a/core/core-backend/src/main/java/io/dataease/dataset/utils/TableUtils.java b/core/core-backend/src/main/java/io/dataease/dataset/utils/TableUtils.java index d1723c8818..e1d6bd4001 100644 --- a/core/core-backend/src/main/java/io/dataease/dataset/utils/TableUtils.java +++ b/core/core-backend/src/main/java/io/dataease/dataset/utils/TableUtils.java @@ -1,8 +1,8 @@ package io.dataease.dataset.utils; import io.dataease.extensions.datasource.dto.DatasourceSchemaDTO; +import io.dataease.extensions.datasource.dto.DsTypeDTO; import io.dataease.extensions.datasource.model.SQLObj; -import io.dataease.extensions.datasource.vo.DatasourceConfiguration; import io.dataease.utils.Md5Utils; import org.apache.calcite.avatica.util.Quoting; import org.apache.commons.lang3.StringUtils; @@ -39,7 +39,7 @@ public class TableUtils { return "C_" + Md5Utils.md5(fieldName); } - public static String getTableAndAlias(SQLObj sqlObj, DatasourceConfiguration.DatasourceType datasourceType, boolean isCross) { + public static String getTableAndAlias(SQLObj sqlObj, DsTypeDTO datasourceType, boolean isCross) { String schema = ""; String prefix = ""; String suffix = ""; diff --git a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java index 5918b5d88a..d62e238420 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/provider/CalciteProvider.java @@ -11,6 +11,8 @@ import io.dataease.datasource.type.*; import io.dataease.engine.constant.SQLConstants; import io.dataease.exception.DEException; import io.dataease.extensions.datasource.dto.*; +import io.dataease.extensions.datasource.provider.DriverShim; +import io.dataease.extensions.datasource.provider.ExtendedJdbcClassLoader; import io.dataease.extensions.datasource.provider.Provider; import io.dataease.extensions.datasource.vo.DatasourceConfiguration; import io.dataease.i18n.Translator; @@ -24,7 +26,6 @@ import org.apache.calcite.adapter.jdbc.JdbcSchema; import org.apache.calcite.jdbc.CalciteConnection; import org.apache.calcite.schema.Schema; import org.apache.calcite.schema.SchemaPlus; -import org.apache.calcite.sql.SqlDialect; import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; @@ -442,6 +443,7 @@ public class CalciteProvider extends Provider { return list; } + @Override public void hidePW(DatasourceDTO datasourceDTO) { DatasourceConfiguration configuration = null; DatasourceConfiguration.DatasourceType datasourceType = DatasourceConfiguration.DatasourceType.valueOf(datasourceDTO.getType()); @@ -1047,20 +1049,6 @@ public class CalciteProvider extends Provider { } } - public Statement getStatement(Connection connection, int queryTimeout) { - if (connection == null) { - DEException.throwException("Failed to get connection!"); - } - Statement stat = null; - try { - stat = connection.createStatement(); - stat.setQueryTimeout(queryTimeout); - } catch (Exception e) { - DEException.throwException(e.getMessage()); - } - return stat; - } - protected boolean isDefaultClassLoader(String customDriver) { return StringUtils.isEmpty(customDriver) || customDriver.equalsIgnoreCase("default"); } diff --git a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java index d2f02a728f..4b857802e2 100644 --- a/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java +++ b/core/core-backend/src/main/java/io/dataease/datasource/server/DatasourceServer.java @@ -36,6 +36,7 @@ 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.DatasourceConfiguration; +import io.dataease.extensions.datasource.vo.PluginDatasourceType; import io.dataease.i18n.Translator; import io.dataease.job.schedule.CheckDsStatusJob; import io.dataease.job.schedule.ScheduleManager; @@ -575,7 +576,8 @@ public class DatasourceServer implements DatasourceApi { } } else { if (hidePw) { - calciteProvider.hidePW(datasourceDTO); + Provider provider = ProviderFactory.getProvider(datasourceDTO.getType()); + provider.hidePW(datasourceDTO); } } @@ -851,7 +853,8 @@ public class DatasourceServer implements DatasourceApi { } private void preCheckDs(DatasourceDTO datasource) throws DEException { - if (!datasourceTypes().stream().map(DatasourceConfiguration.DatasourceType::getType).toList().contains(datasource.getType())) { + if (!datasourceTypes().stream().map(DatasourceConfiguration.DatasourceType::getType).toList().contains(datasource.getType()) + && !Arrays.stream(PluginDatasourceType.DatasourceType.values()).map(PluginDatasourceType.DatasourceType::getType).toList().contains(datasource.getType())) { DEException.throwException("Datasource type not supported."); } } @@ -867,7 +870,8 @@ public class DatasourceServer implements DatasourceApi { if (coreDatasource.getType().equals("API")) { status = ApiUtils.checkStatus(datasourceRequest); } else { - status = calciteProvider.checkStatus(datasourceRequest); + Provider provider = ProviderFactory.getProvider(coreDatasource.getType()); + status = provider.checkStatus(datasourceRequest); } coreDatasource.setStatus(status); } catch (Exception e) { diff --git a/core/core-frontend/src/views/visualized/data/dataset/form/index.vue b/core/core-frontend/src/views/visualized/data/dataset/form/index.vue index f208cb6293..957c3f9de6 100644 --- a/core/core-frontend/src/views/visualized/data/dataset/form/index.vue +++ b/core/core-frontend/src/views/visualized/data/dataset/form/index.vue @@ -1200,6 +1200,21 @@ const treeProps = { return (!data.children?.length && !data.leaf) || data.extraFlag < 0 } } + +const pluginDs = ref([]) +const loadDsPlugin = data => { + pluginDs.value = data +} +const getDsIcon = data => { + if (pluginDs?.value.length === 0) return null + if (!data.leaf) return null + + const arr = pluginDs.value.filter(ele => { + return ele.type === data.type + }) + return arr && arr.length > 0 ? arr[0].icon : null +} + const getDsIconName = data => { if (!data.leaf) return 'dv-folder' return `${data.type}-ds` @@ -1280,7 +1295,10 @@ const getDsIconName = data => { diff --git a/core/core-frontend/src/views/visualized/data/datasource/form/index.vue b/core/core-frontend/src/views/visualized/data/datasource/form/index.vue index b662c737b9..ef5ac99753 100644 --- a/core/core-frontend/src/views/visualized/data/datasource/form/index.vue +++ b/core/core-frontend/src/views/visualized/data/datasource/form/index.vue @@ -2,11 +2,11 @@ import { reactive, ref, computed, watch, nextTick } from 'vue' import { ElIcon, ElMessage, ElMessageBox, ElMessageBoxOptions } from 'element-plus-secondary' import CreatDsGroup from './CreatDsGroup.vue' -import { Icon } from '@/components/icon-custom' import type { DsType } from './DsTypeList.vue' import DsTypeList from './DsTypeList.vue' import { useI18n } from '@/hooks/web/useI18n' import EditorDetail from './EditorDetail.vue' +import EditorDetailPlugin from './EditorDetailPlugin.vue' import ExcelDetail from './ExcelDetail.vue' import { save, update, validate, latestUse, isShowFinishPage, checkRepeat } from '@/api/datasource' import { Base64 } from 'js-base64' @@ -19,6 +19,9 @@ import { useEmitt } from '@/hooks/web/useEmitt' import FinishPage from '../FinishPage.vue' import { cloneDeep } from 'lodash-es' import { useCache } from '@/hooks/web/useCache' +import Icon from '@/components/icon-custom/src/Icon.vue' +import { XpackComponent, PluginComponent } from '@/components/plugin' + interface Node { name: string id: string @@ -70,6 +73,7 @@ const filterText = ref('') const currentDsType = ref('') const emits = defineEmits(['refresh']) const { emitter } = useEmitt() +const isPlugin = ref(false) const selectDsType = (type: string) => { currentDsType.value = type activeStep.value = 1 @@ -83,6 +87,7 @@ const selectDsType = (type: string) => { .some(ele => { if (ele.type === currentDsType.value) { dsTree.value.setCurrentNode(ele) + isPlugin.value = ele['isPlugin'] return true } return false @@ -93,6 +98,7 @@ const selectDsType = (type: string) => { const handleDsNodeClick = data => { if (!data.type) return selectDsType(data.type) + isPlugin.value = data['isPlugin'] } const handleNodeClick = (data: Node) => { currentType.value = data.type @@ -135,25 +141,33 @@ const getDatasourceTypes = () => { }) } getDatasourceTypes() + +const pluginDs = ref([]) const loadDsPlugin = data => { + pluginDs.value = data data.forEach(item => { const { name, category, type, icon, extraParams, staticMap } = item const node = { name, - category, + catalog: category, type, icon, extraParams, isPlugin: true, staticMap } - const index = typeList.findIndex(ele => ele === node.catalog) if (index !== -1) { - databaseList[index].push(node) + databaseList.value[index].push(node) } }) } +const getPluginStatic = type => { + const arr = pluginDs.value.filter(ele => { + return ele.type === type + }) + return arr && arr.length > 0 ? arr[0].staticMap?.index : null +} const getLatestUseTypes = () => { latestUse({}).then(res => { @@ -663,7 +677,8 @@ defineExpose({