From 5be0bb9807f20a64f67705764124e8e8fdb3490a Mon Sep 17 00:00:00 2001 From: aaaaaajie Date: Mon, 7 Apr 2025 15:29:48 +0800 Subject: [PATCH] feat: support query interface generateJsonPathExpression --- packages/core/database/src/database.ts | 1 + packages/core/database/src/helpers.ts | 1 + packages/core/database/src/mock-database.ts | 3 ++- .../src/query-interface/query-interface.ts | 4 ++++ .../src/server/__tests__/actions.test.ts | 2 +- .../src/server/sql-collection/sql-model.ts | 6 +++++- .../src/server/hooks/beforeDestoryField.ts | 15 ++++++++++++--- 7 files changed, 26 insertions(+), 6 deletions(-) diff --git a/packages/core/database/src/database.ts b/packages/core/database/src/database.ts index 11390fac72..0a6e98013a 100644 --- a/packages/core/database/src/database.ts +++ b/packages/core/database/src/database.ts @@ -105,6 +105,7 @@ export interface IDatabaseOptions extends Options { logger?: LoggerOptions | Logger; customHooks?: any; instanceId?: string; + sqlParser?: string; } export type DatabaseOptions = IDatabaseOptions; diff --git a/packages/core/database/src/helpers.ts b/packages/core/database/src/helpers.ts index 4d5f61f07b..2a5a671514 100644 --- a/packages/core/database/src/helpers.ts +++ b/packages/core/database/src/helpers.ts @@ -87,6 +87,7 @@ export async function parseDatabaseOptionsFromEnv(): Promise { tablePrefix: process.env.DB_TABLE_PREFIX, schema: process.env.DB_SCHEMA, underscored: process.env.DB_UNDERSCORED === 'true', + sqlParser: process.env.DB_DIALECT === 'mssql' ? 'TransactSQL' : undefined, }; const sslOptions = await extractSSLOptionsFromEnv(); diff --git a/packages/core/database/src/mock-database.ts b/packages/core/database/src/mock-database.ts index 524c3f9bfd..59741b01db 100644 --- a/packages/core/database/src/mock-database.ts +++ b/packages/core/database/src/mock-database.ts @@ -8,7 +8,7 @@ */ /* istanbul ignore file -- @preserve */ -import { Database, IDatabaseOptions } from '@nocobase/database'; +import { Database, IDatabaseOptions, sqlParser } from '@nocobase/database'; import { merge } from '@nocobase/utils'; import { customAlphabet } from 'nanoid'; import fetch from 'node-fetch'; @@ -42,6 +42,7 @@ export function getConfigByEnv() { underscored: process.env.DB_UNDERSCORED === 'true', schema: process.env.DB_SCHEMA !== 'public' ? process.env.DB_SCHEMA : undefined, dialectOptions: {}, + sqlParser: process.env.DB_DIALECT === 'mssql' ? 'TransactSQL' : undefined, }; if (process.env.DB_DIALECT == 'postgres') { diff --git a/packages/core/database/src/query-interface/query-interface.ts b/packages/core/database/src/query-interface/query-interface.ts index c614b48e6c..fa185f9a8d 100644 --- a/packages/core/database/src/query-interface/query-interface.ts +++ b/packages/core/database/src/query-interface/query-interface.ts @@ -166,4 +166,8 @@ export default abstract class QueryInterface { throw error; } } + + public generateJsonPathExpression(field: string, path: string) { + return `${field}.${path}`; + } } diff --git a/packages/plugins/@nocobase/plugin-collection-sql/src/server/__tests__/actions.test.ts b/packages/plugins/@nocobase/plugin-collection-sql/src/server/__tests__/actions.test.ts index 9fe3046640..50d46743cb 100644 --- a/packages/plugins/@nocobase/plugin-collection-sql/src/server/__tests__/actions.test.ts +++ b/packages/plugins/@nocobase/plugin-collection-sql/src/server/__tests__/actions.test.ts @@ -90,7 +90,7 @@ describe('sql collection', () => { expect(res.body.data.sources).toEqual(['testSqlCollection']); }); - it('sqlCollection:update', async () => { + it.only('sqlCollection:update', async () => { await agent.resource('collections').create({ values: { name: 'fakeCollection', diff --git a/packages/plugins/@nocobase/plugin-collection-sql/src/server/sql-collection/sql-model.ts b/packages/plugins/@nocobase/plugin-collection-sql/src/server/sql-collection/sql-model.ts index de2d6a5e96..d10495cfc8 100644 --- a/packages/plugins/@nocobase/plugin-collection-sql/src/server/sql-collection/sql-model.ts +++ b/packages/plugins/@nocobase/plugin-collection-sql/src/server/sql-collection/sql-model.ts @@ -41,6 +41,10 @@ export class SQLModel extends Model { const schema = process.env.DB_SCHEMA || 'public'; return `${schema}.${table}`; } + if (this.database.inDialect('mssql') && !table.includes('.')) { + const schema = process.env.DB_SCHEMA || 'dbo'; + return `${schema}.${table}`; + } return table; } @@ -76,7 +80,7 @@ export class SQLModel extends Model { table: string; columns: { name: string; as?: string }[]; }[] { - let { ast: _ast } = sqlParser.parse(this.sql); + let { ast: _ast } = sqlParser.parse(this.sql, { database: this.database.options.sqlParser }); if (Array.isArray(_ast)) { _ast = _ast[0]; } diff --git a/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts b/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts index 6621e93590..940c867eca 100644 --- a/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts +++ b/packages/plugins/@nocobase/plugin-data-source-main/src/server/hooks/beforeDestoryField.ts @@ -1,3 +1,12 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + import { Database } from '@nocobase/database'; import { FieldIsDependedOnByOtherError } from '../errors/field-is-depended-on-by-other'; @@ -14,12 +23,12 @@ export function beforeDestoryField(db: Database) { filter: { $or: [ { - ['options.sourceKey']: name, + [db.queryInterface.generateJsonPathExpression('options', 'sourceKey')]: name, collectionName, }, { - ['options.targetKey']: name, - ['options.target']: collectionName, + [db.queryInterface.generateJsonPathExpression('options', 'targetKey')]: name, + [db.queryInterface.generateJsonPathExpression('options', 'targetKey')]: collectionName, }, ], },