From 2f8e2f3132b324d0755c64e01b46a5fc1c57c263 Mon Sep 17 00:00:00 2001 From: Aditya Bist Date: Thu, 12 Aug 2021 12:28:55 -0700 Subject: [PATCH] Synapse query editor dropdown fix (#16684) * formatting * update comment * format doc * fix connection test * remove unused imports * test server info mock * try with mocks * add server info check for tests * added logic for corner case --- .../platform/connection/common/constants.ts | 4 +++ .../common/testConnectionManagementService.ts | 2 +- .../contrib/query/browser/queryActions.ts | 31 +++++++++++++++++++ .../query/test/browser/queryActions.test.ts | 6 +++- 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/sql/platform/connection/common/constants.ts b/src/sql/platform/connection/common/constants.ts index 1eea8bf4ed..6bb3d1ee3e 100644 --- a/src/sql/platform/connection/common/constants.ts +++ b/src/sql/platform/connection/common/constants.ts @@ -32,3 +32,7 @@ export const dstsAuth = 'dstsAuth'; export const cmsProviderName = 'MSSQL-CMS'; export const UNSAVED_GROUP_ID = 'unsaved'; + +/* Server Type Constants */ +export const sqlDataWarehouse = 'Azure SQL Data Warehouse'; +export const gen3Version = 12; diff --git a/src/sql/platform/connection/test/common/testConnectionManagementService.ts b/src/sql/platform/connection/test/common/testConnectionManagementService.ts index c73999fcba..b317d06d1d 100644 --- a/src/sql/platform/connection/test/common/testConnectionManagementService.ts +++ b/src/sql/platform/connection/test/common/testConnectionManagementService.ts @@ -267,7 +267,7 @@ export class TestConnectionManagementService implements IConnectionManagementSer } getServerInfo(profileId: string): azdata.ServerInfo { - return undefined!; + return undefined; } getConnectionString(connectionId: string): Thenable { diff --git a/src/sql/workbench/contrib/query/browser/queryActions.ts b/src/sql/workbench/contrib/query/browser/queryActions.ts index ccaaef6477..9fa32c576c 100644 --- a/src/sql/workbench/contrib/query/browser/queryActions.ts +++ b/src/sql/workbench/contrib/query/browser/queryActions.ts @@ -46,6 +46,7 @@ import { ILogService } from 'vs/platform/log/common/log'; import { IRange } from 'vs/editor/common/core/range'; import { getErrorMessage, onUnexpectedError } from 'vs/base/common/errors'; import { IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; +import { gen3Version, sqlDataWarehouse } from 'sql/platform/connection/common/constants'; /** * Action class that query-based Actions will extend. This base class automatically handles activating and @@ -720,6 +721,33 @@ export class ListDatabasesActionItem extends Disposable implements IActionViewIt }); } + /** + * + * @param id profile id + * @returns boolean saying if the server connection is a Gen 3 DW server + */ + private isDWGen3Database(id: string): boolean { + const serverInfo = this.connectionManagementService.getServerInfo(id); + if (serverInfo) { + return serverInfo.serverEdition === sqlDataWarehouse && + serverInfo.serverMajorVersion === gen3Version; + } + return false; + } + + /** + * + * @param dbName database name + * @returns updated database name after stripping the pool name, if any + */ + private removePoolInstanceName(dbName: string): string { + if (dbName.includes('@')) { + const lastIndex = dbName.lastIndexOf('@'); + dbName = dbName.slice(0, lastIndex); + } + return dbName; + } + private getCurrentDatabaseName(): string | undefined { if (!this._editor.input) { this.logService.error('editor input was null'); @@ -730,6 +758,9 @@ export class ListDatabasesActionItem extends Disposable implements IActionViewIt if (uri) { let profile = this.connectionManagementService.getConnectionProfile(uri); if (profile) { + if (this.isDWGen3Database(profile.id)) { + return this.removePoolInstanceName(profile.databaseName); + } return profile.databaseName; } } diff --git a/src/sql/workbench/contrib/query/test/browser/queryActions.test.ts b/src/sql/workbench/contrib/query/test/browser/queryActions.test.ts index 0d4506dfc8..20555ef7a2 100644 --- a/src/sql/workbench/contrib/query/test/browser/queryActions.test.ts +++ b/src/sql/workbench/contrib/query/test/browser/queryActions.test.ts @@ -33,6 +33,7 @@ import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/u import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; import { IRange } from 'vs/editor/common/core/range'; +import { ServerInfo } from 'azdata'; suite('SQL QueryAction Tests', () => { @@ -463,6 +464,7 @@ suite('SQL QueryAction Tests', () => { // ... Mock "isConnected" in ConnectionManagementService connectionManagementService.setup(x => x.isConnected(TypeMoq.It.isAnyString())).returns(() => isConnected); + connectionManagementService.setup(x => x.getServerInfo(TypeMoq.It.isAny())).returns(() => { serverMajorVersion: 12, serverEdition: 'Test' }); connectionManagementService.setup(x => x.onConnectionChanged).returns(() => Event.None); connectionManagementService.setup(x => x.getConnectionProfile(TypeMoq.It.isAny())).returns(() => { databaseName: databaseName @@ -495,9 +497,10 @@ suite('SQL QueryAction Tests', () => { // ... Create event emitter we can use to trigger db changed event let dbChangedEmitter = new Emitter(); - // ... Create mock connection management service + // ... Create mock connection management service and server info let databaseName = 'foobar'; connectionManagementService.setup(x => x.onConnectionChanged).returns(() => dbChangedEmitter.event); + connectionManagementService.setup(x => x.getServerInfo(TypeMoq.It.isAny())).returns(() => { serverMajorVersion: 12, serverEdition: 'Test' }); connectionManagementService.setup(x => x.getConnectionProfile(TypeMoq.It.isAny())).returns(() => { databaseName: databaseName }); connectionManagementService.setup(x => x.changeDatabase(TypeMoq.It.isAnyString(), TypeMoq.It.isAnyString())).returns(() => Promise.resolve(true)); @@ -521,6 +524,7 @@ suite('SQL QueryAction Tests', () => { // ... Create mock connection management service that will not claim it's connected let databaseName = 'foobar'; connectionManagementService.setup(x => x.onConnectionChanged).returns(() => dbChangedEmitter.event); + connectionManagementService.setup(x => x.getServerInfo(TypeMoq.It.isAny())).returns(() => { serverMajorVersion: 12, serverEdition: 'Test' }); connectionManagementService.setup(x => x.getConnectionProfile(TypeMoq.It.isAny())).returns(() => { databaseName: databaseName }); connectionManagementService.setup(x => x.changeDatabase(TypeMoq.It.isAnyString(), TypeMoq.It.isAnyString())).returns(() => Promise.resolve(true));