mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-06-15 19:19:35 +08:00
- 同步引擎新增查询结果集同步分支,支持单目标表差异分析、预览与执行 - 数据同步工作台增加 SQL 结果集模式,并补充目标表与查询校验 - 补充后端同步链路与前端请求构造回归测试,并更新 backlog 记录 Fixes #321
86 lines
2.2 KiB
TypeScript
86 lines
2.2 KiB
TypeScript
export type SourceDatasetMode = 'table' | 'query';
|
|
|
|
type SyncContent = 'data' | 'schema' | 'both';
|
|
type TargetTableStrategy = 'existing_only' | 'auto_create_if_missing' | 'smart';
|
|
|
|
type BuildDataSyncRequestParams = {
|
|
sourceConfig: any;
|
|
targetConfig: any;
|
|
selectedTables: string[];
|
|
sourceDatasetMode: SourceDatasetMode;
|
|
sourceQuery: string;
|
|
syncContent: SyncContent;
|
|
syncMode: string;
|
|
autoAddColumns: boolean;
|
|
targetTableStrategy: TargetTableStrategy;
|
|
createIndexes: boolean;
|
|
mongoCollectionName: string;
|
|
jobId?: string;
|
|
tableOptions?: Record<string, any>;
|
|
};
|
|
|
|
type ValidateDataSyncSelectionParams = {
|
|
sourceDatasetMode: SourceDatasetMode;
|
|
selectedTables: string[];
|
|
sourceQuery: string;
|
|
syncContent: SyncContent;
|
|
};
|
|
|
|
export const validateDataSyncSelection = ({
|
|
sourceDatasetMode,
|
|
selectedTables,
|
|
sourceQuery,
|
|
syncContent,
|
|
}: ValidateDataSyncSelectionParams): string | null => {
|
|
if (sourceDatasetMode === 'query') {
|
|
if (!String(sourceQuery || '').trim()) {
|
|
return '请输入源查询 SQL';
|
|
}
|
|
if (selectedTables.length !== 1) {
|
|
return 'SQL 结果集同步需要选择一个目标表';
|
|
}
|
|
if (syncContent !== 'data') {
|
|
return 'SQL 结果集同步仅支持仅同步数据';
|
|
}
|
|
return null;
|
|
}
|
|
|
|
if (selectedTables.length === 0) {
|
|
return '请选择至少一张表';
|
|
}
|
|
return null;
|
|
};
|
|
|
|
export const buildDataSyncRequest = ({
|
|
sourceConfig,
|
|
targetConfig,
|
|
selectedTables,
|
|
sourceDatasetMode,
|
|
sourceQuery,
|
|
syncContent,
|
|
syncMode,
|
|
autoAddColumns,
|
|
targetTableStrategy,
|
|
createIndexes,
|
|
mongoCollectionName,
|
|
jobId,
|
|
tableOptions,
|
|
}: BuildDataSyncRequestParams) => {
|
|
const isQueryMode = sourceDatasetMode === 'query';
|
|
|
|
return {
|
|
sourceConfig,
|
|
targetConfig,
|
|
tables: selectedTables,
|
|
sourceQuery: isQueryMode ? String(sourceQuery || '').trim() : undefined,
|
|
content: isQueryMode ? 'data' : syncContent,
|
|
mode: syncMode,
|
|
autoAddColumns: isQueryMode ? false : autoAddColumns,
|
|
targetTableStrategy: isQueryMode ? 'existing_only' : targetTableStrategy,
|
|
createIndexes: isQueryMode ? false : createIndexes,
|
|
mongoCollectionName: String(mongoCollectionName || '').trim(),
|
|
...(jobId ? { jobId } : {}),
|
|
...(tableOptions ? { tableOptions } : {}),
|
|
};
|
|
};
|