mirror of
https://github.com/tencentmusic/supersonic.git
synced 2026-04-26 10:14:19 +08:00
Compare commits
5 Commits
v0.9.10
...
9b2be8cc33
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9b2be8cc33 | ||
|
|
978ae53fb3 | ||
|
|
e04bc3cce8 | ||
|
|
bd7e322e24 | ||
|
|
9e06177fb0 |
@@ -9,7 +9,8 @@ public enum EngineType {
|
|||||||
POSTGRESQL(6, "POSTGRESQL"),
|
POSTGRESQL(6, "POSTGRESQL"),
|
||||||
OTHER(7, "OTHER"),
|
OTHER(7, "OTHER"),
|
||||||
DUCKDB(8, "DUCKDB"),
|
DUCKDB(8, "DUCKDB"),
|
||||||
HANADB(9, "HANADB");
|
HANADB(9, "HANADB"),
|
||||||
|
STARROCKS(10, "STARROCKS"),;
|
||||||
|
|
||||||
private Integer code;
|
private Integer code;
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,20 @@ import java.util.List;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public abstract class BaseDbAdaptor implements DbAdaptor {
|
public abstract class BaseDbAdaptor implements DbAdaptor {
|
||||||
|
|
||||||
public List<String> getDBs(ConnectInfo connectionInfo) throws SQLException {
|
@Override
|
||||||
|
public List<String> getCatalogs(ConnectInfo connectInfo) throws SQLException {
|
||||||
|
// Apart from supporting multiple catalog types of data sources, other types will return an
|
||||||
|
// empty set by default.
|
||||||
|
return List.of();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getDBs(ConnectInfo connectionInfo, String catalog) throws SQLException {
|
||||||
|
// Except for special types implemented separately, the generic logic catalog does not take
|
||||||
|
// effect.
|
||||||
|
return getDBs(connectionInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<String> getDBs(ConnectInfo connectionInfo) throws SQLException {
|
||||||
List<String> dbs = Lists.newArrayList();
|
List<String> dbs = Lists.newArrayList();
|
||||||
DatabaseMetaData metaData = getDatabaseMetaData(connectionInfo);
|
DatabaseMetaData metaData = getDatabaseMetaData(connectionInfo);
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -14,7 +14,9 @@ public interface DbAdaptor {
|
|||||||
|
|
||||||
String rewriteSql(String sql);
|
String rewriteSql(String sql);
|
||||||
|
|
||||||
List<String> getDBs(ConnectInfo connectInfo) throws SQLException;
|
List<String> getCatalogs(ConnectInfo connectInfo) throws SQLException;
|
||||||
|
|
||||||
|
List<String> getDBs(ConnectInfo connectInfo, String catalog) throws SQLException;
|
||||||
|
|
||||||
List<String> getTables(ConnectInfo connectInfo, String schemaName) throws SQLException;
|
List<String> getTables(ConnectInfo connectInfo, String schemaName) throws SQLException;
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ public class DbAdaptorFactory {
|
|||||||
dbAdaptorMap.put(EngineType.OTHER.getName(), new DefaultDbAdaptor());
|
dbAdaptorMap.put(EngineType.OTHER.getName(), new DefaultDbAdaptor());
|
||||||
dbAdaptorMap.put(EngineType.DUCKDB.getName(), new DuckdbAdaptor());
|
dbAdaptorMap.put(EngineType.DUCKDB.getName(), new DuckdbAdaptor());
|
||||||
dbAdaptorMap.put(EngineType.HANADB.getName(), new HanadbAdaptor());
|
dbAdaptorMap.put(EngineType.HANADB.getName(), new HanadbAdaptor());
|
||||||
|
dbAdaptorMap.put(EngineType.STARROCKS.getName(), new StarrocksAdaptor());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DbAdaptor getEngineAdaptor(String engineType) {
|
public static DbAdaptor getEngineAdaptor(String engineType) {
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package com.tencent.supersonic.headless.core.adaptor.db;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.tencent.supersonic.headless.core.pojo.ConnectInfo;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
import java.sql.*;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
public class StarrocksAdaptor extends MysqlAdaptor {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getCatalogs(ConnectInfo connectInfo) throws SQLException {
|
||||||
|
List<String> catalogs = Lists.newArrayList();
|
||||||
|
try (Connection con = DriverManager.getConnection(connectInfo.getUrl(),
|
||||||
|
connectInfo.getUserName(), connectInfo.getPassword());
|
||||||
|
Statement st = con.createStatement();
|
||||||
|
ResultSet rs = st.executeQuery("SHOW CATALOGS")) {
|
||||||
|
while (rs.next()) {
|
||||||
|
catalogs.add(rs.getString(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return catalogs;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getDBs(ConnectInfo connectionInfo, String catalog) throws SQLException {
|
||||||
|
Assert.hasText(catalog, "StarRocks type catalog can not be null or empty");
|
||||||
|
List<String> dbs = Lists.newArrayList();
|
||||||
|
try (Connection con = DriverManager.getConnection(connectionInfo.getUrl(),
|
||||||
|
connectionInfo.getUserName(), connectionInfo.getPassword());
|
||||||
|
Statement st = con.createStatement();
|
||||||
|
ResultSet rs = st.executeQuery("SHOW DATABASES IN " + catalog)) {
|
||||||
|
while (rs.next()) {
|
||||||
|
dbs.add(rs.getString(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dbs;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@ public class DbParameterFactory {
|
|||||||
parametersBuilder.put(EngineType.MYSQL.getName(), new MysqlParametersBuilder());
|
parametersBuilder.put(EngineType.MYSQL.getName(), new MysqlParametersBuilder());
|
||||||
parametersBuilder.put(EngineType.POSTGRESQL.getName(), new PostgresqlParametersBuilder());
|
parametersBuilder.put(EngineType.POSTGRESQL.getName(), new PostgresqlParametersBuilder());
|
||||||
parametersBuilder.put(EngineType.HANADB.getName(), new HanadbParametersBuilder());
|
parametersBuilder.put(EngineType.HANADB.getName(), new HanadbParametersBuilder());
|
||||||
|
parametersBuilder.put(EngineType.STARROCKS.getName(), new StarrocksParametersBuilder());
|
||||||
parametersBuilder.put(EngineType.OTHER.getName(), new OtherParametersBuilder());
|
parametersBuilder.put(EngineType.OTHER.getName(), new OtherParametersBuilder());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.tencent.supersonic.headless.server.pojo;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Slf4j
|
||||||
|
public class StarrocksParametersBuilder extends DefaultParametersBuilder {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DatabaseParameter> build() {
|
||||||
|
return super.build();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -76,9 +76,15 @@ public class DatabaseController {
|
|||||||
return databaseService.executeSql(sqlExecuteReq, user);
|
return databaseService.executeSql(sqlExecuteReq, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/getCatalogs")
|
||||||
|
public List<String> getCatalogs(@RequestParam("id") Long databaseId) throws SQLException {
|
||||||
|
return databaseService.getCatalogs(databaseId);
|
||||||
|
}
|
||||||
|
|
||||||
@RequestMapping("/getDbNames")
|
@RequestMapping("/getDbNames")
|
||||||
public List<String> getDbNames(@RequestParam("id") Long databaseId) throws SQLException {
|
public List<String> getDbNames(@RequestParam("id") Long databaseId,
|
||||||
return databaseService.getDbNames(databaseId);
|
@RequestParam(value = "catalog", required = false) String catalog) throws SQLException {
|
||||||
|
return databaseService.getDbNames(databaseId, catalog);
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/getTables")
|
@RequestMapping("/getTables")
|
||||||
|
|||||||
@@ -36,7 +36,9 @@ public interface DatabaseService {
|
|||||||
|
|
||||||
void deleteDatabase(Long databaseId);
|
void deleteDatabase(Long databaseId);
|
||||||
|
|
||||||
List<String> getDbNames(Long id) throws SQLException;
|
List<String> getCatalogs(Long id) throws SQLException;
|
||||||
|
|
||||||
|
List<String> getDbNames(Long id, String catalog) throws SQLException;
|
||||||
|
|
||||||
List<String> getTables(Long id, String db) throws SQLException;
|
List<String> getTables(Long id, String db) throws SQLException;
|
||||||
|
|
||||||
|
|||||||
@@ -200,10 +200,17 @@ public class DatabaseServiceImpl extends ServiceImpl<DatabaseDOMapper, DatabaseD
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<String> getDbNames(Long id) throws SQLException {
|
public List<String> getCatalogs(Long id) throws SQLException {
|
||||||
DatabaseResp databaseResp = getDatabase(id);
|
DatabaseResp databaseResp = getDatabase(id);
|
||||||
DbAdaptor dbAdaptor = DbAdaptorFactory.getEngineAdaptor(databaseResp.getType());
|
DbAdaptor dbAdaptor = DbAdaptorFactory.getEngineAdaptor(databaseResp.getType());
|
||||||
return dbAdaptor.getDBs(DatabaseConverter.getConnectInfo(databaseResp));
|
return dbAdaptor.getCatalogs(DatabaseConverter.getConnectInfo(databaseResp));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getDbNames(Long id, String catalog) throws SQLException {
|
||||||
|
DatabaseResp databaseResp = getDatabase(id);
|
||||||
|
DbAdaptor dbAdaptor = DbAdaptorFactory.getEngineAdaptor(databaseResp.getType());
|
||||||
|
return dbAdaptor.getDBs(DatabaseConverter.getConnectInfo(databaseResp), catalog);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -209,5 +209,6 @@
|
|||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16"
|
"node": ">=16"
|
||||||
}
|
},
|
||||||
}
|
"packageManager": "pnpm@9.12.3+sha512.cce0f9de9c5a7c95bef944169cc5dfe8741abfb145078c0d508b868056848a87c81e626246cb60967cbd7fd29a6c062ef73ff840d96b3c86c40ac92cf4a813ee"
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import {
|
|||||||
RangeValue,
|
RangeValue,
|
||||||
SimilarQuestionType,
|
SimilarQuestionType,
|
||||||
} from '../../common/type';
|
} from '../../common/type';
|
||||||
import { createContext, useEffect, useRef, useState } from 'react';
|
import { createContext, useEffect, useState } from 'react';
|
||||||
import { chatExecute, chatParse, queryData, deleteQuery, switchEntity } from '../../service';
|
import { chatExecute, chatParse, queryData, deleteQuery, switchEntity } from '../../service';
|
||||||
import { PARSE_ERROR_TIP, PREFIX_CLS, SEARCH_EXCEPTION_TIP } from '../../common/constants';
|
import { PARSE_ERROR_TIP, PREFIX_CLS, SEARCH_EXCEPTION_TIP } from '../../common/constants';
|
||||||
import { message, Spin } from 'antd';
|
import { message, Spin } from 'antd';
|
||||||
@@ -490,9 +490,7 @@ const ChatItem: React.FC<Props> = ({
|
|||||||
onSwitchEntity={onSwitchEntity}
|
onSwitchEntity={onSwitchEntity}
|
||||||
onFiltersChange={onFiltersChange}
|
onFiltersChange={onFiltersChange}
|
||||||
onDateInfoChange={onDateInfoChange}
|
onDateInfoChange={onDateInfoChange}
|
||||||
onRefresh={() => {
|
onRefresh={onRefresh}
|
||||||
onRefresh();
|
|
||||||
}}
|
|
||||||
handlePresetClick={handlePresetClick}
|
handlePresetClick={handlePresetClick}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -40,6 +40,12 @@ const BarChart: React.FC<Props> = ({
|
|||||||
}) => {
|
}) => {
|
||||||
const chartRef = useRef<any>();
|
const chartRef = useRef<any>();
|
||||||
const instanceRef = useRef<ECharts>();
|
const instanceRef = useRef<ECharts>();
|
||||||
|
const { downloadChartAsImage } = useExportByEcharts({
|
||||||
|
instanceRef,
|
||||||
|
question,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { register } = useContext(ChartItemContext);
|
||||||
|
|
||||||
const { queryColumns, queryResults, entityInfo } = data;
|
const { queryColumns, queryResults, entityInfo } = data;
|
||||||
|
|
||||||
@@ -189,13 +195,6 @@ const BarChart: React.FC<Props> = ({
|
|||||||
|
|
||||||
const prefixCls = `${PREFIX_CLS}-bar`;
|
const prefixCls = `${PREFIX_CLS}-bar`;
|
||||||
|
|
||||||
const { downloadChartAsImage } = useExportByEcharts({
|
|
||||||
instanceRef,
|
|
||||||
question,
|
|
||||||
});
|
|
||||||
|
|
||||||
const { register } = useContext(ChartItemContext);
|
|
||||||
|
|
||||||
register('downloadChartAsImage', downloadChartAsImage);
|
register('downloadChartAsImage', downloadChartAsImage);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -93,7 +93,9 @@ export const getFormattedValue = (value: number | string, remainZero?: boolean)
|
|||||||
|
|
||||||
export const formatNumberWithCN = (num: number) => {
|
export const formatNumberWithCN = (num: number) => {
|
||||||
if (isNaN(num)) return '-';
|
if (isNaN(num)) return '-';
|
||||||
if (num >= 10000) {
|
if (num >= 100000000) {
|
||||||
|
return (num / 100000000).toFixed(1) + '亿';
|
||||||
|
} else if (num >= 10000) {
|
||||||
return (num / 10000).toFixed(1) + '万';
|
return (num / 10000).toFixed(1) + '万';
|
||||||
} else {
|
} else {
|
||||||
return formatByDecimalPlaces(num, 2);
|
return formatByDecimalPlaces(num, 2);
|
||||||
|
|||||||
@@ -4,5 +4,9 @@ export default {
|
|||||||
target: 'http://127.0.0.1:9080',
|
target: 'http://127.0.0.1:9080',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
},
|
},
|
||||||
|
'/aibi/api/': {
|
||||||
|
target: 'http://127.0.0.1:9080',
|
||||||
|
changeOrigin: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { Form, Input, Spin, Select, message } from 'antd';
|
import { Form, Input, Spin, Select, message } from 'antd';
|
||||||
import type { FormInstance } from 'antd/lib/form';
|
import type { FormInstance } from 'antd/lib/form';
|
||||||
import { getDbNames, getTables, getDimensionList } from '../../service';
|
import {getDbNames, getTables, getDimensionList, getCatalogs} from '../../service';
|
||||||
import { ISemantic } from '../../data';
|
import { ISemantic } from '../../data';
|
||||||
import FormItemTitle from '@/components/FormHelper/FormItemTitle';
|
import FormItemTitle from '@/components/FormHelper/FormItemTitle';
|
||||||
|
|
||||||
@@ -20,13 +20,16 @@ const ModelBasicForm: React.FC<Props> = ({
|
|||||||
isEdit,
|
isEdit,
|
||||||
modelItem,
|
modelItem,
|
||||||
databaseConfigList,
|
databaseConfigList,
|
||||||
|
form,
|
||||||
mode = 'normal',
|
mode = 'normal',
|
||||||
}) => {
|
}) => {
|
||||||
const [currentDbLinkConfigId, setCurrentDbLinkConfigId] = useState<number>();
|
const [currentDbLinkConfigId, setCurrentDbLinkConfigId] = useState<number>();
|
||||||
|
const [catalogList, setCatalogList] = useState<string[]>([]);
|
||||||
const [dbNameList, setDbNameList] = useState<string[]>([]);
|
const [dbNameList, setDbNameList] = useState<string[]>([]);
|
||||||
const [tableNameList, setTableNameList] = useState<any[]>([]);
|
const [tableNameList, setTableNameList] = useState<any[]>([]);
|
||||||
const [loading, setLoading] = useState<boolean>(false);
|
const [loading, setLoading] = useState<boolean>(false);
|
||||||
const [dimensionOptions, setDimensionOptions] = useState<{ label: string; value: number }[]>([]);
|
const [dimensionOptions, setDimensionOptions] = useState<{ label: string; value: number }[]>([]);
|
||||||
|
const [catalogSelectOpen, setCatalogSelectOpen] = useState<boolean>(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (modelItem?.id) {
|
if (modelItem?.id) {
|
||||||
@@ -50,9 +53,49 @@ const ModelBasicForm: React.FC<Props> = ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const queryDbNameList = async (databaseId: number) => {
|
const onDatabaseSelect = (databaseId: number, type: string) => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
const { code, data, msg } = await getDbNames(databaseId);
|
if (type === 'STARROCKS') {
|
||||||
|
queryCatalogList(databaseId)
|
||||||
|
setCatalogSelectOpen(true);
|
||||||
|
setDbNameList([]);
|
||||||
|
} else {
|
||||||
|
queryDbNameList(databaseId, "");
|
||||||
|
setCatalogSelectOpen(false);
|
||||||
|
setCatalogList([]);
|
||||||
|
}
|
||||||
|
form.setFieldsValue({
|
||||||
|
catalog: undefined,
|
||||||
|
dbName: undefined,
|
||||||
|
tableName: undefined,
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
const queryCatalogList = async (databaseId: number) => {
|
||||||
|
setLoading(true);
|
||||||
|
const { code, data, msg } = await getCatalogs(databaseId);
|
||||||
|
setLoading(false)
|
||||||
|
if (code === 200) {
|
||||||
|
const list = data || [];
|
||||||
|
setCatalogList(list);
|
||||||
|
} else {
|
||||||
|
message.error(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const onCatalogSelect = (catalog: string) => {
|
||||||
|
if (currentDbLinkConfigId) {
|
||||||
|
queryDbNameList(currentDbLinkConfigId, catalog);
|
||||||
|
}
|
||||||
|
form.setFieldsValue({
|
||||||
|
dbName: undefined,
|
||||||
|
tableName: undefined,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const queryDbNameList = async (databaseId: number, catalog: string) => {
|
||||||
|
setLoading(true);
|
||||||
|
const { code, data, msg } = await getDbNames(databaseId, catalog);
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
if (code === 200) {
|
if (code === 200) {
|
||||||
const list = data || [];
|
const list = data || [];
|
||||||
@@ -61,6 +104,7 @@ const ModelBasicForm: React.FC<Props> = ({
|
|||||||
message.error(msg);
|
message.error(msg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const queryTableNameList = async (databaseName: string) => {
|
const queryTableNameList = async (databaseName: string) => {
|
||||||
if (!currentDbLinkConfigId) {
|
if (!currentDbLinkConfigId) {
|
||||||
return;
|
return;
|
||||||
@@ -89,18 +133,37 @@ const ModelBasicForm: React.FC<Props> = ({
|
|||||||
showSearch
|
showSearch
|
||||||
placeholder="请选择数据库连接"
|
placeholder="请选择数据库连接"
|
||||||
disabled={isEdit}
|
disabled={isEdit}
|
||||||
onChange={(dbLinkConfigId: number) => {
|
onSelect={(dbLinkConfigId: number, option) => {
|
||||||
queryDbNameList(dbLinkConfigId);
|
onDatabaseSelect(dbLinkConfigId, option.type);
|
||||||
setCurrentDbLinkConfigId(dbLinkConfigId);
|
setCurrentDbLinkConfigId(dbLinkConfigId);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{databaseConfigList.map((item) => (
|
{databaseConfigList.map((item) => (
|
||||||
<Select.Option key={item.id} value={item.id} disabled={!item.hasUsePermission}>
|
<Select.Option key={item.id} value={item.id} disabled={!item.hasUsePermission} type={item.type}>
|
||||||
{item.name}
|
{item.name}
|
||||||
</Select.Option>
|
</Select.Option>
|
||||||
))}
|
))}
|
||||||
</Select>
|
</Select>
|
||||||
</FormItem>
|
</FormItem>
|
||||||
|
<FormItem
|
||||||
|
name="catalog"
|
||||||
|
label="Catalog"
|
||||||
|
rules={[{ required: true, message: '请选择Catalog' }]}
|
||||||
|
hidden={!catalogSelectOpen}
|
||||||
|
>
|
||||||
|
<Select
|
||||||
|
showSearch
|
||||||
|
placeholder="请选择Catalog"
|
||||||
|
disabled={isEdit}
|
||||||
|
onSelect={onCatalogSelect}
|
||||||
|
>
|
||||||
|
{catalogList.map((item) => (
|
||||||
|
<Select.Option key={item} value={item}>
|
||||||
|
{item}
|
||||||
|
</Select.Option>
|
||||||
|
))}
|
||||||
|
</Select>
|
||||||
|
</FormItem>
|
||||||
<FormItem
|
<FormItem
|
||||||
name="dbName"
|
name="dbName"
|
||||||
label="数据库名"
|
label="数据库名"
|
||||||
@@ -110,8 +173,11 @@ const ModelBasicForm: React.FC<Props> = ({
|
|||||||
showSearch
|
showSearch
|
||||||
placeholder="请先选择一个数据库连接"
|
placeholder="请先选择一个数据库连接"
|
||||||
disabled={isEdit}
|
disabled={isEdit}
|
||||||
onChange={(dbName: string) => {
|
onSelect={(dbName: string) => {
|
||||||
queryTableNameList(dbName);
|
queryTableNameList(dbName);
|
||||||
|
form.setFieldsValue({
|
||||||
|
tableName: undefined,
|
||||||
|
})
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{dbNameList.map((item) => (
|
{dbNameList.map((item) => (
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import { ISemantic } from '../../data';
|
|||||||
import { ColumnsConfig } from '../../components/TableColumnRender';
|
import { ColumnsConfig } from '../../components/TableColumnRender';
|
||||||
import ViewSearchFormModal from './ViewSearchFormModal';
|
import ViewSearchFormModal from './ViewSearchFormModal';
|
||||||
import { toDatasetEditPage } from '@/pages/SemanticModel/utils';
|
import { toDatasetEditPage } from '@/pages/SemanticModel/utils';
|
||||||
|
import UploadFile from './UploadFile';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
// dataSetList: ISemantic.IDatasetItem[];
|
// dataSetList: ISemantic.IDatasetItem[];
|
||||||
@@ -92,9 +93,6 @@ const DataSetTable: React.FC<Props> = ({ disabledEdit = false }) => {
|
|||||||
<a
|
<a
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
toDatasetEditPage(record.domainId, record.id, 'relation');
|
toDatasetEditPage(record.domainId, record.id, 'relation');
|
||||||
// setEditFormStep(1);
|
|
||||||
// setViewItem(record);
|
|
||||||
// setCreateDataSourceModalOpen(true);
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{name}
|
{name}
|
||||||
@@ -146,9 +144,6 @@ const DataSetTable: React.FC<Props> = ({ disabledEdit = false }) => {
|
|||||||
key="metricEditBtn"
|
key="metricEditBtn"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
toDatasetEditPage(record.domainId, record.id);
|
toDatasetEditPage(record.domainId, record.id);
|
||||||
// setEditFormStep(0);
|
|
||||||
// setViewItem(record);
|
|
||||||
// setCreateDataSourceModalOpen(true);
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
编辑
|
编辑
|
||||||
@@ -189,6 +184,12 @@ const DataSetTable: React.FC<Props> = ({ disabledEdit = false }) => {
|
|||||||
启用
|
启用
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
|
<UploadFile
|
||||||
|
key="uploadFile"
|
||||||
|
buttonType="link"
|
||||||
|
domainId={record.domainId}
|
||||||
|
datasetId={record.id}
|
||||||
|
/>
|
||||||
<Popconfirm
|
<Popconfirm
|
||||||
title="确认删除?"
|
title="确认删除?"
|
||||||
okText="是"
|
okText="是"
|
||||||
@@ -229,6 +230,13 @@ const DataSetTable: React.FC<Props> = ({ disabledEdit = false }) => {
|
|||||||
disabledEdit
|
disabledEdit
|
||||||
? [<></>]
|
? [<></>]
|
||||||
: [
|
: [
|
||||||
|
<UploadFile
|
||||||
|
key="uploadFile"
|
||||||
|
domainId={selectDomainId}
|
||||||
|
onFileUploaded={() => {
|
||||||
|
queryDataSetList();
|
||||||
|
}}
|
||||||
|
/>,
|
||||||
<Button
|
<Button
|
||||||
key="create"
|
key="create"
|
||||||
type="primary"
|
type="primary"
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
import { getToken } from '@/utils/utils';
|
||||||
|
import { UploadOutlined } from '@ant-design/icons';
|
||||||
|
import type { UploadProps } from 'antd';
|
||||||
|
import { Button, message, Upload } from 'antd';
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
buttonType?: string;
|
||||||
|
domainId?: number;
|
||||||
|
datasetId?: string;
|
||||||
|
onFileUploaded?: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const UploadFile = ({ buttonType, domainId, datasetId, onFileUploaded }: Props) => {
|
||||||
|
const props: UploadProps = {
|
||||||
|
name: 'multipartFile',
|
||||||
|
action: `/aibi/api/data/file/uploadFileNew?type=DATASET&domainId=${domainId}${
|
||||||
|
datasetId ? `&dataSetId=${datasetId}` : ''
|
||||||
|
}`,
|
||||||
|
showUploadList: false,
|
||||||
|
onChange(info) {
|
||||||
|
if (info.file.status !== 'uploading') {
|
||||||
|
console.log(info.file, info.fileList);
|
||||||
|
}
|
||||||
|
if (info.file.status === 'done') {
|
||||||
|
message.success('导入成功');
|
||||||
|
onFileUploaded?.();
|
||||||
|
} else if (info.file.status === 'error') {
|
||||||
|
message.error('导入失败');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Upload {...props}>
|
||||||
|
{buttonType === 'link' ? (
|
||||||
|
<a>导入文件</a>
|
||||||
|
) : (
|
||||||
|
<Button icon={<UploadOutlined />}>导入文件</Button>
|
||||||
|
)}
|
||||||
|
</Upload>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default UploadFile;
|
||||||
@@ -379,11 +379,21 @@ export async function listColumnsBySql(data: { databaseId: number; sql: string }
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getDbNames(dbId: number): Promise<any> {
|
export function getCatalogs(dbId: number): Promise<any> {
|
||||||
|
return request(`${process.env.API_BASE_URL}database/getCatalogs`, {
|
||||||
|
method: 'GET',
|
||||||
|
params: {
|
||||||
|
id: dbId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getDbNames(dbId: number, catalog: string): Promise<any> {
|
||||||
return request(`${process.env.API_BASE_URL}database/getDbNames`, {
|
return request(`${process.env.API_BASE_URL}database/getDbNames`, {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
params: {
|
params: {
|
||||||
id: dbId,
|
id: dbId,
|
||||||
|
catalog: catalog,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
28637
webapp/pnpm-lock.yaml
generated
28637
webapp/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user