feat(datasource): 支持 DuckDB Parquet 文件模式并优化弹窗打开链路

- 统一 DuckDB 文件库与 Parquet 文件接入能力
- 补充 URI、文件选择、只读挂载与连接缓存键处理
- 去掉数据源卡片点击前的同步驱动查询,修复打开卡顿
- refs #166
This commit is contained in:
杨国锋
2026-03-08 18:42:27 +08:00
parent e521d2125f
commit b85c7529ec
14 changed files with 35 additions and 342 deletions

View File

@@ -1,7 +1,6 @@
import type { ConnectionConfig } from '../types';
import { resolveDuckDBMode } from './duckdb';
type ConnectionLike = Pick<ConnectionConfig, 'type' | 'driver' | 'duckdbMode'> | null | undefined;
type ConnectionLike = Pick<ConnectionConfig, 'type' | 'driver'> | null | undefined;
const normalizeDataSourceToken = (raw: string): string => {
const normalized = String(raw || '').trim().toLowerCase();
@@ -66,11 +65,6 @@ const COPY_INSERT_TYPES = new Set([
const QUERY_EDITOR_DISABLED_TYPES = new Set(['redis']);
const FORCE_READ_ONLY_QUERY_TYPES = new Set(['tdengine', 'clickhouse']);
const isDuckDBParquetConnection = (config: ConnectionLike): boolean => {
return resolveDataSourceType(config) === 'duckdb'
&& resolveDuckDBMode(config?.duckdbMode, '') === 'parquet';
};
export type DataSourceCapabilities = {
type: string;
supportsQueryEditor: boolean;
@@ -86,7 +80,7 @@ export const getDataSourceCapabilities = (config: ConnectionLike): DataSourceCap
supportsQueryEditor: !QUERY_EDITOR_DISABLED_TYPES.has(type),
supportsSqlQueryExport: SQL_QUERY_EXPORT_TYPES.has(type),
supportsCopyInsert: COPY_INSERT_TYPES.has(type),
forceReadOnlyQueryResult: FORCE_READ_ONLY_QUERY_TYPES.has(type) || isDuckDBParquetConnection(config),
forceReadOnlyQueryResult: FORCE_READ_ONLY_QUERY_TYPES.has(type),
};
};

View File

@@ -1,18 +0,0 @@
export type DuckDBMode = 'database' | 'parquet';
export const looksLikeDuckDBParquetPath = (raw: string): boolean => {
const text = String(raw || '').trim().toLowerCase();
return text.endsWith('.parquet') || text.endsWith('.parq');
};
export const normalizeDuckDBMode = (raw: unknown): DuckDBMode => {
return String(raw || '').trim().toLowerCase() === 'parquet' ? 'parquet' : 'database';
};
export const resolveDuckDBMode = (raw: unknown, path: string): DuckDBMode => {
const text = String(raw || '').trim().toLowerCase();
if (text === 'parquet' || text === 'database') {
return text;
}
return looksLikeDuckDBParquetPath(path) ? 'parquet' : 'database';
};