Skip to content

Commit a071470

Browse files
aeisenbergalexet
andauthored
QueryServer: Add support for new query-server (#1508)
* QueryServer: Add support for new query-server * Add a new canary flag to enable new query server support * Add evaluation results to query object Ensures better backwards compatibility with legacy query objects. * Fix query server command name * Add log message for new query server * Use only legacy results Co-authored-by: alexet <alexet@semmle.com>
1 parent 2104cb3 commit a071470

File tree

16 files changed

+958
-24
lines changed

16 files changed

+958
-24
lines changed

extensions/ql-vscode/src/cli.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { promisify } from 'util';
1111
import { CancellationToken, commands, Disposable, Uri } from 'vscode';
1212

1313
import { BQRSInfo, DecodedBqrsChunk } from './pure/bqrs-cli-types';
14-
import { CliConfig } from './config';
14+
import { allowCanaryQueryServer, CliConfig } from './config';
1515
import { DistributionProvider, FindDistributionResultKind } from './distribution';
1616
import { assertNever, getErrorMessage, getErrorStack } from './pure/helpers-pure';
1717
import { QueryMetadata, SortDirection } from './pure/interface-types';
@@ -1330,6 +1330,11 @@ export class CliVersionConstraint {
13301330
*/
13311331
public static CLI_VERSION_WITH_SOURCEMAP = new SemVer('2.10.3');
13321332

1333+
/**
1334+
* CLI version that supports the new query server.
1335+
*/
1336+
public static CLI_VERSION_WITH_NEW_QUERY_SERVER = new SemVer('2.11.0');
1337+
13331338
constructor(private readonly cli: CodeQLCliServer) {
13341339
/**/
13351340
}
@@ -1405,4 +1410,12 @@ export class CliVersionConstraint {
14051410
async supportsSourceMap() {
14061411
return this.isVersionAtLeast(CliVersionConstraint.CLI_VERSION_WITH_SOURCEMAP);
14071412
}
1413+
1414+
async supportsNewQueryServer() {
1415+
// TODO while under development, users _must_ opt-in to the new query server
1416+
// by setting the `codeql.canaryQueryServer` setting to `true`.
1417+
// Ignore the version check for now.
1418+
return allowCanaryQueryServer();
1419+
// return this.isVersionAtLeast(CliVersionConstraint.CLI_VERSION_WITH_NEW_QUERY_SERVER);
1420+
}
14081421
}

extensions/ql-vscode/src/config.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,17 @@ export function isCanary() {
317317
return !!CANARY_FEATURES.getValue<boolean>();
318318
}
319319

320+
/**
321+
* Enables the experimental query server
322+
*/
323+
export const CANARY_QUERY_SERVER = new Setting('canaryQueryServer', ROOT_SETTING);
324+
325+
326+
export function allowCanaryQueryServer() {
327+
return !!CANARY_QUERY_SERVER.getValue<boolean>();
328+
}
329+
330+
320331
/**
321332
* Avoids caching in the AST viewer if the user is also a canary user.
322333
*/
@@ -343,12 +354,12 @@ export async function setRemoteRepositoryLists(lists: Record<string, string[]> |
343354
}
344355

345356
/**
346-
* Path to a file that contains lists of GitHub repositories that you want to query remotely via
357+
* Path to a file that contains lists of GitHub repositories that you want to query remotely via
347358
* the "Run Variant Analysis" command.
348359
* Note: This command is only available for internal users.
349-
*
360+
*
350361
* This setting should be a path to a JSON file that contains a JSON object where each key is a
351-
* user-specified name (string), and the value is an array of GitHub repositories
362+
* user-specified name (string), and the value is an array of GitHub repositories
352363
* (of the form `<owner>/<repo>`).
353364
*/
354365
const REPO_LISTS_PATH = new Setting('repositoryListsPath', REMOTE_QUERIES_SETTING);

extensions/ql-vscode/src/extension.ts

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ import { WebviewReveal } from './interface-utils';
7373
import { ideServerLogger, logger, ProgressReporter, queryServerLogger } from './logging';
7474
import { QueryHistoryManager } from './query-history';
7575
import { CompletedLocalQueryInfo, LocalQueryInfo } from './query-results';
76-
import * as qsClient from './legacy-query-server/queryserver-client';
76+
import * as legacyQueryServer from './legacy-query-server/queryserver-client';
77+
import * as newQueryServer from './query-server/queryserver-client';
7778
import { displayQuickQuery } from './quick-query';
7879
import { QLTestAdapterFactory } from './test-adapter';
7980
import { TestUIService } from './test-ui';
@@ -103,6 +104,7 @@ import { JoinOrderScannerProvider } from './log-insights/join-order';
103104
import { LogScannerService } from './log-insights/log-scanner-service';
104105
import { createInitialQueryInfo } from './run-queries-shared';
105106
import { LegacyQueryRunner } from './legacy-query-server/legacyRunner';
107+
import { NewQueryRunner } from './query-server/query-runner';
106108
import { QueryRunner } from './queryRunner';
107109
import { VariantAnalysisView } from './remote-queries/variant-analysis-view';
108110
import { VariantAnalysisViewSerializer } from './remote-queries/variant-analysis-view-serializer';
@@ -406,6 +408,8 @@ export async function activate(ctx: ExtensionContext): Promise<CodeQLExtensionIn
406408
return codeQlExtension;
407409
}
408410

411+
const PACK_GLOBS = ['**/codeql-pack.yml', '**/qlpack.yml', '**/queries.xml', '**/codeql-pack.lock.yml', '**/qlpack.lock.yml', '.codeqlmanifest.json', 'codeql-workspace.yml'];
412+
409413
async function activateWithInstalledDistribution(
410414
ctx: ExtensionContext,
411415
distributionManager: DistributionManager,
@@ -436,6 +440,15 @@ async function activateWithInstalledDistribution(
436440
void logger.log('Initializing query server client.');
437441
const qs = await createQueryServer(qlConfigurationListener, cliServer, ctx);
438442

443+
444+
for (const glob of PACK_GLOBS) {
445+
const fsWatcher = workspace.createFileSystemWatcher(glob);
446+
ctx.subscriptions.push(fsWatcher);
447+
fsWatcher.onDidChange(async (_uri) => {
448+
await qs.clearPackCache();
449+
});
450+
}
451+
439452
void logger.log('Initializing database manager.');
440453
const dbm = new DatabaseManager(ctx, qs, cliServer, logger);
441454
ctx.subscriptions.push(dbm);
@@ -1199,15 +1212,28 @@ async function createQueryServer(qlConfigurationListener: QueryServerConfigListe
11991212
{ title: 'CodeQL query server', location: ProgressLocation.Window },
12001213
task
12011214
);
1202-
const qs = new qsClient.QueryServerClient(
1203-
qlConfigurationListener,
1204-
cliServer,
1205-
qsOpts,
1206-
progressCallback
1207-
);
1208-
ctx.subscriptions.push(qs);
1209-
await qs.startQueryServer();
1210-
return new LegacyQueryRunner(qs);
1215+
if (await cliServer.cliConstraints.supportsNewQueryServer()) {
1216+
const qs = new newQueryServer.QueryServerClient(
1217+
qlConfigurationListener,
1218+
cliServer,
1219+
qsOpts,
1220+
progressCallback
1221+
);
1222+
ctx.subscriptions.push(qs);
1223+
await qs.startQueryServer();
1224+
return new NewQueryRunner(qs);
1225+
1226+
} else {
1227+
const qs = new legacyQueryServer.QueryServerClient(
1228+
qlConfigurationListener,
1229+
cliServer,
1230+
qsOpts,
1231+
progressCallback
1232+
);
1233+
ctx.subscriptions.push(qs);
1234+
await qs.startQueryServer();
1235+
return new LegacyQueryRunner(qs);
1236+
}
12111237
}
12121238

12131239
function getContextStoragePath(ctx: ExtensionContext) {

extensions/ql-vscode/src/legacy-query-server/legacyRunner.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,10 @@ export class LegacyQueryRunner extends QueryRunner {
5656
async upgradeDatabaseExplicit(dbItem: DatabaseItem, progress: ProgressCallback, token: CancellationToken): Promise<void> {
5757
await upgradeDatabaseExplicit(this.qs, dbItem, progress, token);
5858
}
59+
60+
async clearPackCache(): Promise<void> {
61+
/**
62+
* Nothing needs to be done
63+
*/
64+
}
5965
}

extensions/ql-vscode/src/legacy-query-server/run-queries.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,11 +497,19 @@ function createSyntheticResult(
497497
return {
498498
query: query.queryEvalInfo,
499499
message,
500+
result:{
501+
evaluationTime:0,
502+
queryId: 0,
503+
resultType: messages.QueryResultType.OTHER_ERROR,
504+
message,
505+
runId: 0,
506+
},
500507
sucessful: false,
501508
dispose: () => { /**/ },
502509
};
503510
}
504511

512+
505513
function createSimpleTemplates(templates: Record<string, string> | undefined): messages.TemplateDefinitions | undefined {
506514
if (!templates) {
507515
return undefined;

extensions/ql-vscode/src/legacy-query-server/upgrades.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { getOnDiskWorkspaceFolders, showAndLogErrorMessage, tmpDir } from '../he
33
import { ProgressCallback, UserCancellationException } from '../commandRunner';
44
import { logger } from '../logging';
55
import * as messages from '../pure/legacy-messages';
6-
import * as qsClient from '../legacy-query-server/queryserver-client';
6+
import * as qsClient from './queryserver-client';
77
import * as tmp from 'tmp-promise';
88
import * as path from 'path';
99
import { DatabaseItem } from '../databases';

0 commit comments

Comments
 (0)