From 3e3eb0da0a56538a24e7f8d7cb89b48bb7a41da0 Mon Sep 17 00:00:00 2001 From: Elena Tanasoiu Date: Thu, 30 Mar 2023 16:37:50 +0000 Subject: [PATCH] Re-use existing database if one for the same language is already downloaded We'd like to select an existing database for our query, if on is already downloaded and matches the query language. Previously we were re-using the database if the language and name matched (e.g. the name would be `github/codeql`). --- extensions/ql-vscode/src/local-databases.ts | 11 +++++++++ .../ql-vscode/src/skeleton-query-wizard.ts | 23 +++++++++++++++---- .../skeleton-query-wizard.test.ts | 1 + 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/extensions/ql-vscode/src/local-databases.ts b/extensions/ql-vscode/src/local-databases.ts index c1c1c7f05..97e7dd931 100644 --- a/extensions/ql-vscode/src/local-databases.ts +++ b/extensions/ql-vscode/src/local-databases.ts @@ -911,6 +911,17 @@ export class DatabaseManager extends DisposableObject { return dbs[0]; } + public async digForDatabaseWithSameLanguage( + language: string, + ): Promise { + const dbItems = this.databaseItems || []; + const dbs = dbItems.filter((db) => db.language === language); + if (dbs.length === 0) { + return undefined; + } + return dbs[0]; + } + /** * Returns the index of the workspace folder that corresponds to the source archive of `item` * if there is one, and -1 otherwise. diff --git a/extensions/ql-vscode/src/skeleton-query-wizard.ts b/extensions/ql-vscode/src/skeleton-query-wizard.ts index 54a265fbe..2cc353656 100644 --- a/extensions/ql-vscode/src/skeleton-query-wizard.ts +++ b/extensions/ql-vscode/src/skeleton-query-wizard.ts @@ -231,17 +231,30 @@ export class SkeletonQueryWizard { const databaseNwo = QUERY_LANGUAGE_TO_DATABASE_REPO[this.language]; - const databaseItem = await this.databaseManager.digForDatabaseItem( + // Check that we haven't already downloaded a database for this language + const existingDatabaseItem = await this.databaseManager.digForDatabaseItem( this.language, databaseNwo, ); - if (databaseItem) { + if (existingDatabaseItem) { // select the found database - await this.databaseManager.setCurrentDatabaseItem(databaseItem); + await this.databaseManager.setCurrentDatabaseItem(existingDatabaseItem); } else { - // download new database and select it - await this.downloadDatabase(); + const sameLanguageDatabaseItem = + await this.databaseManager.digForDatabaseWithSameLanguage( + this.language, + ); + + if (sameLanguageDatabaseItem) { + // select the found database + await this.databaseManager.setCurrentDatabaseItem( + sameLanguageDatabaseItem, + ); + } else { + // download new database and select it + await this.downloadDatabase(); + } } } } diff --git a/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts b/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts index 2202a3487..5fc7a5d79 100644 --- a/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts +++ b/extensions/ql-vscode/test/vscode-tests/cli-integration/skeleton-query-wizard.test.ts @@ -42,6 +42,7 @@ describe("SkeletonQueryWizard", () => { const mockDatabaseManager = mockedObject({ setCurrentDatabaseItem: jest.fn(), digForDatabaseItem: jest.fn(), + digForDatabaseWithSameLanguage: jest.fn(), }); const mockCli = mockedObject({ resolveLanguages: jest