Better encapsulation of LocalQueryRun

This commit is contained in:
Dave Bartolomeo
2023-03-28 13:19:04 -04:00
parent 39e7caa972
commit f247687dd9

View File

@@ -89,9 +89,11 @@ export class LocalQueryRun {
public constructor(
private readonly outputDir: QueryOutputDir,
private readonly localQueries: LocalQueries,
public readonly queryInfo: LocalQueryInfo,
private readonly queryInfo: LocalQueryInfo,
private readonly dbItem: DatabaseItem,
public readonly logger: Logger,
public readonly logger: Logger, // Public so that other clients, like the debug adapter, know where to send log output
private readonly queryHistoryManager: QueryHistoryManager,
private readonly cliServer: CodeQLCliServer,
) {}
/**
@@ -112,17 +114,23 @@ export class LocalQueryRun {
this.queryInfo.setEvaluatorLogPaths(evalLogPaths);
}
const queryWithResults = await this.getCompletedQueryInfo(results);
this.localQueries.queryHistoryManager.completeQuery(
this.queryInfo,
queryWithResults,
);
this.queryHistoryManager.completeQuery(this.queryInfo, queryWithResults);
await this.localQueries.showResultsForCompletedQuery(
this.queryInfo as CompletedLocalQueryInfo,
WebviewReveal.Forced,
);
// Note we must update the query history view after showing results as the
// display and sorting might depend on the number of results
await this.localQueries.queryHistoryManager.refreshTreeView();
await this.queryHistoryManager.refreshTreeView();
}
/**
* Updates the UI in the case where query evaluation throws an exception.
*/
public async fail(err: Error): Promise<void> {
err.message = `Error running query: ${err.message}`;
this.queryInfo.failureReason = err.message;
await this.queryHistoryManager.refreshTreeView();
}
/**
@@ -134,7 +142,7 @@ export class LocalQueryRun {
logger: BaseLogger,
): Promise<EvaluatorLogPaths | undefined> {
const evalLogPaths = await generateEvalLogSummaries(
this.localQueries.cliServer,
this.cliServer,
outputDir,
);
if (evalLogPaths !== undefined) {
@@ -166,7 +174,7 @@ export class LocalQueryRun {
): Promise<QueryWithResults> {
// Read the query metadata if possible, to use in the UI.
const metadata = await tryGetQueryMetadata(
this.localQueries.cliServer,
this.cliServer,
this.queryInfo.initialInfo.queryPath,
);
const query = new QueryEvaluationInfo(
@@ -179,12 +187,9 @@ export class LocalQueryRun {
if (results.resultType !== QueryResultType.SUCCESS) {
const message = results.message
? redactableError`${results.message}`
? redactableError`Failed to run query: ${results.message}`
: redactableError`Failed to run query`;
void extLogger.log(message.fullMessage);
void showAndLogExceptionWithTelemetry(
redactableError`Failed to run query: ${message}`,
);
void showAndLogExceptionWithTelemetry(message);
}
const message = formatResultMessage(results);
const successful = results.resultType === QueryResultType.SUCCESS;
@@ -209,9 +214,9 @@ export class LocalQueries extends DisposableObject {
public constructor(
private readonly app: App,
private readonly queryRunner: QueryRunner,
public readonly queryHistoryManager: QueryHistoryManager,
private readonly queryHistoryManager: QueryHistoryManager,
private readonly databaseManager: DatabaseManager,
public readonly cliServer: CodeQLCliServer,
private readonly cliServer: CodeQLCliServer,
private readonly databaseUI: DatabaseUI,
private readonly localQueryResultsView: ResultsView,
private readonly queryStorageDir: string,
@@ -399,7 +404,15 @@ export class LocalQueries extends DisposableObject {
this.queryHistoryManager.addQuery(queryInfo);
const logger = new TeeLogger(this.queryRunner.logger, outputDir.logPath);
return new LocalQueryRun(outputDir, this, queryInfo, dbItem, logger);
return new LocalQueryRun(
outputDir,
this,
queryInfo,
dbItem,
logger,
this.queryHistoryManager,
this.cliServer,
);
}
public async compileAndRunQuery(
@@ -478,13 +491,15 @@ export class LocalQueries extends DisposableObject {
return results;
} catch (e) {
// It's odd that we have two different ways for a query evaluation to fail: by throwing an
// exception, and by returning a result with a failure code. This is how the code worked
// before the refactoring, so it's been preserved, but we should probably figure out how
// to unify both error handling paths.
const err = asError(e);
err.message = `Error running query: ${err.message}`;
localQueryRun.queryInfo.failureReason = err.message;
await localQueryRun.fail(err);
throw e;
}
} finally {
await this.queryHistoryManager.refreshTreeView();
source.dispose();
}
}