Adds functionality to open execution plans from DB tables and DMVs. (#20377)

* Adds functionality to open execution plans from DB tables and DMVs.

* Code review changes

* Renames method to getProviderFromUri
This commit is contained in:
Lewis Sanchez
2022-08-17 19:24:23 -07:00
committed by GitHub
parent 2a94ce3afb
commit 7de5ee0427
14 changed files with 177 additions and 21 deletions

View File

@@ -70,7 +70,12 @@ export class ExecutionPlanEditorOverrideContribution extends Disposable implemen
},
{},
(editorInput, group) => {
const executionPlanInput = this._instantiationService.createInstance(ExecutionPlanInput, editorInput.resource);
const executionPlanGraphInfo = {
graphFileContent: undefined,
graphFileType: undefined
};
const executionPlanInput = this._instantiationService.createInstance(ExecutionPlanInput, editorInput.resource, executionPlanGraphInfo);
return { editor: executionPlanInput, options: editorInput.options, group: group };
}
);

View File

@@ -5,23 +5,41 @@
import * as path from 'vs/base/common/path';
import { URI } from 'vs/base/common/uri';
import { localize } from 'vs/nls';
import { EditorInput } from 'vs/workbench/common/editor/editorInput';
import { EditorModel } from 'vs/workbench/common/editor/editorModel';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import * as azdata from 'azdata';
export class ExecutionPlanInput extends EditorInput {
public static ID: string = 'workbench.editorinputs.executionplan';
public static SCHEMA: string = 'executionplan';
private readonly editorNamePrefix = localize('epCompare.executionPlanEditorName', 'ExecutionPlan');
private _editorName: string;
private _content?: string;
public _executionPlanFileViewUUID: string;
constructor(
private _uri: URI,
private _uri: URI | undefined,
private executionPlanGraphinfo: azdata.executionPlan.ExecutionPlanGraphInfo,
@ITextFileService private readonly _fileService: ITextFileService,
@IEditorService private readonly _editorService: IEditorService
) {
super();
if (this._uri === undefined && !!this.executionPlanGraphinfo.graphFileContent && !!this.executionPlanGraphinfo.graphFileType) {
const existingNames = this._editorService.editors.map(editor => editor.getName());
let i = 0;
this._editorName = `${this.editorNamePrefix}${i}.${this.executionPlanGraphinfo.graphFileType}`;
while (existingNames.includes(this._editorName)) {
i++;
this._editorName = `${this.editorNamePrefix}${i}.${this.executionPlanGraphinfo.graphFileType}`;
}
this._uri = URI.parse(this._editorName);
}
}
public get executionPlanFileViewUUID(): string {
@@ -37,14 +55,18 @@ export class ExecutionPlanInput extends EditorInput {
}
public override getName(): string {
if (this._editorName) {
return this._editorName;
}
return path.basename(this._uri.fsPath);
}
public async content(): Promise<string> {
if (!this._content) {
this._content = (await this._fileService.read(this._uri, { acceptTextOnly: true })).value;
if (!this.executionPlanGraphinfo.graphFileContent) {
this.executionPlanGraphinfo.graphFileContent = (await this._fileService.read(this._uri, { acceptTextOnly: true })).value;
}
return this._content;
return this.executionPlanGraphinfo.graphFileContent;
}
public getUri(): string {
@@ -60,8 +82,8 @@ export class ExecutionPlanInput extends EditorInput {
}
public override async resolve(refresh?: boolean): Promise<EditorModel | undefined> {
if (!this._content) {
this._content = (await this._fileService.read(this._uri, { acceptTextOnly: true })).value;
if (!this.executionPlanGraphinfo.graphFileContent) {
this.executionPlanGraphinfo.graphFileContent = (await this._fileService.read(this._uri, { acceptTextOnly: true })).value;
}
return undefined;
}