mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-22 00:42:47 +08:00
✨ feat(query): 新建查询继承当前表上下文
This commit is contained in:
@@ -9,12 +9,47 @@ vi.mock('../../wailsjs/go/app/App', () => ({
|
||||
}));
|
||||
|
||||
import {
|
||||
buildContextualNewQueryTemplate,
|
||||
buildTableSelectQuery,
|
||||
extractTableSelectColumnNames,
|
||||
isElasticsearchDbType,
|
||||
resolveTableSelectQuery,
|
||||
} from './objectQueryTemplates';
|
||||
|
||||
describe('buildContextualNewQueryTemplate', () => {
|
||||
it('builds a dialect-aware select for the active table with the default template', () => {
|
||||
expect(buildContextualNewQueryTemplate({
|
||||
dbType: 'mysql',
|
||||
tableName: 'Order Items',
|
||||
customTemplate: null,
|
||||
})).toBe('SELECT * FROM `Order Items`;');
|
||||
});
|
||||
|
||||
it('appends the active table when a custom template ends with FROM', () => {
|
||||
expect(buildContextualNewQueryTemplate({
|
||||
dbType: 'postgres',
|
||||
tableName: 'public.OrderItems',
|
||||
customTemplate: 'SELECT id, total FROM ',
|
||||
})).toBe('SELECT id, total FROM public."OrderItems"');
|
||||
});
|
||||
|
||||
it('preserves custom templates that do not expose a table insertion point', () => {
|
||||
expect(buildContextualNewQueryTemplate({
|
||||
dbType: 'mysql',
|
||||
tableName: 'users',
|
||||
customTemplate: 'SELECT CURRENT_TIMESTAMP;',
|
||||
})).toBeNull();
|
||||
});
|
||||
|
||||
it('builds the native query format for an active Elasticsearch index', () => {
|
||||
expect(buildContextualNewQueryTemplate({
|
||||
dbType: 'elasticsearch',
|
||||
tableName: 'orders-v1',
|
||||
customTemplate: null,
|
||||
})).toBe('GET /orders-v1/_search\n{\n "query": {\n "match_all": {}\n }\n}\n');
|
||||
});
|
||||
});
|
||||
|
||||
describe('buildTableSelectQuery', () => {
|
||||
it('quotes uppercase postgres table names in new query templates', () => {
|
||||
expect(buildTableSelectQuery('postgres', 'public.MyTable')).toBe('SELECT * FROM public."MyTable";');
|
||||
|
||||
@@ -59,6 +59,34 @@ export const buildTableSelectQuery = (
|
||||
return `SELECT\n ${selectList}\nFROM ${quotedTable}${limitSuffix};`;
|
||||
};
|
||||
|
||||
type BuildContextualNewQueryTemplateOptions = {
|
||||
dbType: string;
|
||||
tableName: string;
|
||||
customTemplate?: string | null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Build the initial query for a new tab opened while a table-like data tab is active.
|
||||
* A custom template is only augmented when it explicitly ends at a FROM insertion point.
|
||||
*/
|
||||
export const buildContextualNewQueryTemplate = ({
|
||||
dbType,
|
||||
tableName,
|
||||
customTemplate,
|
||||
}: BuildContextualNewQueryTemplateOptions): string | null => {
|
||||
const normalizedTableName = String(tableName || '').trim();
|
||||
if (!normalizedTableName) return null;
|
||||
if (isElasticsearchDbType(dbType) || customTemplate === null || customTemplate === undefined) {
|
||||
return buildTableSelectQuery(dbType, normalizedTableName);
|
||||
}
|
||||
|
||||
const template = String(customTemplate)
|
||||
.replace(/\r\n/g, '\n')
|
||||
.replace(/\r/g, '\n');
|
||||
if (!/\bfrom\s*$/i.test(template)) return null;
|
||||
return `${template}${quoteQualifiedIdent(dbType, normalizedTableName)}`;
|
||||
};
|
||||
|
||||
type ResolveTableSelectQueryOptions = {
|
||||
dbType: string;
|
||||
tableName: string;
|
||||
|
||||
Reference in New Issue
Block a user