Renaming query plan to execution plan (#18551)

This commit is contained in:
Aasim Khan
2022-02-25 00:49:34 -08:00
committed by GitHub
parent 8032f59d41
commit 02341088eb
165 changed files with 373 additions and 350 deletions

View File

@@ -5,9 +5,9 @@
import type * as azdata from 'azdata';
export class QueryPlan2State {
export class ExecutionPlanState {
graphs: azdata.ExecutionPlanGraph[] = [];
clearQueryPlan2State() {
clearExecutionPlanState() {
this.graphs = [];
}
}

View File

@@ -12,7 +12,7 @@ import { QueryPlanState } from 'sql/workbench/common/editor/query/queryPlanState
import { GridPanelState } from 'sql/workbench/common/editor/query/gridTableState';
import { QueryModelViewState } from 'sql/workbench/common/editor/query/modelViewState';
import { URI } from 'vs/base/common/uri';
import { QueryPlan2State } from 'sql/workbench/common/editor/query/queryPlan2State';
import { ExecutionPlanState } from 'sql/workbench/common/editor/query/executionPlanState';
export class ResultsViewState {
public readonly gridPanelState: GridPanelState = new GridPanelState();
@@ -20,7 +20,7 @@ export class ResultsViewState {
public readonly queryPlanState: QueryPlanState = new QueryPlanState();
public readonly topOperationsState = new TopOperationsState();
public readonly dynamicModelViewTabsState: Map<string, QueryModelViewState> = new Map<string, QueryModelViewState>();
public readonly queryPlan2State: QueryPlan2State = new QueryPlan2State();
public readonly executionPlanState: ExecutionPlanState = new ExecutionPlanState();
public activeTab?: string;
public readonly visibleTabs: Set<string> = new Set<string>();
@@ -29,7 +29,7 @@ export class ResultsViewState {
this.gridPanelState.dispose();
this.chartState.dispose();
this.queryPlanState.dispose();
this.queryPlan2State.clearQueryPlan2State();
this.executionPlanState.clearExecutionPlanState();
this.dynamicModelViewTabsState.forEach((state: QueryModelViewState, identifier: string) => {
state.dispose();
});

View File

@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
let imageBasePath = require.toUrl('./images/icons/');
export let queryPlanNodeIconPaths =
export let executionPlanNodeIconPaths =
{
// generic icons
iteratorCatchAll: imageBasePath + 'iterator_catch_all.png',

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import 'vs/css!./media/queryPlan2';
import 'vs/css!./media/executionPlan';
import type * as azdata from 'azdata';
import { IPanelView, IPanelTab } from 'sql/base/browser/ui/panel/panel';
import { localize } from 'vs/nls';
@@ -11,10 +11,10 @@ import { dispose } from 'vs/base/common/lifecycle';
import { ActionBar } from 'sql/base/browser/ui/taskbar/actionbar';
import * as DOM from 'vs/base/browser/dom';
import * as azdataGraphModule from 'azdataGraph';
import { customZoomIconClassNames, openPlanFileIconClassNames, openPropertiesIconClassNames, openQueryIconClassNames, queryPlanNodeIconPaths, savePlanIconClassNames, searchIconClassNames, zoomInIconClassNames, zoomOutIconClassNames, zoomToFitIconClassNames } from 'sql/workbench/contrib/queryplan2/browser/constants';
import { customZoomIconClassNames, openPlanFileIconClassNames, openPropertiesIconClassNames, openQueryIconClassNames, executionPlanNodeIconPaths, savePlanIconClassNames, searchIconClassNames, zoomInIconClassNames, zoomOutIconClassNames, zoomToFitIconClassNames } from 'sql/workbench/contrib/executionPlan/browser/constants';
import { isString } from 'vs/base/common/types';
import { PlanHeader } from 'sql/workbench/contrib/queryplan2/browser/planHeader';
import { QueryPlanPropertiesView } from 'sql/workbench/contrib/queryplan2/browser/queryPlanPropertiesView';
import { PlanHeader } from 'sql/workbench/contrib/executionPlan/browser/planHeader';
import { ExecutionPlanPropertiesView } from 'sql/workbench/contrib/executionPlan/browser/executionPlanPropertiesView';
import { Action } from 'vs/base/common/actions';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { openNewQuery } from 'sql/workbench/contrib/query/browser/queryActions';
@@ -30,9 +30,9 @@ import { formatDocumentWithSelectedProvider, FormattingMode } from 'vs/editor/co
import { Progress } from 'vs/platform/progress/common/progress';
import { CancellationToken } from 'vs/base/common/cancellation';
import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions';
import { QueryPlanWidgetController } from 'sql/workbench/contrib/queryplan2/browser/queryPlanWidgetController';
import { CustomZoomWidget } from 'sql/workbench/contrib/queryplan2/browser/widgets/customZoomWidget';
import { NodeSearchWidget } from 'sql/workbench/contrib/queryplan2/browser/widgets/nodeSearchWidget';
import { ExecutionPlanWidgetController } from 'sql/workbench/contrib/executionPlan/browser/executionPlanWidgetController';
import { CustomZoomWidget } from 'sql/workbench/contrib/executionPlan/browser/widgets/customZoomWidget';
import { NodeSearchWidget } from 'sql/workbench/contrib/executionPlan/browser/widgets/nodeSearchWidget';
import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs';
import { IFileService } from 'vs/platform/files/common/files';
import { VSBuffer } from 'vs/base/common/buffer';
@@ -56,15 +56,15 @@ export interface InternalExecutionPlanEdge extends azdata.ExecutionPlanEdge {
id?: string;
}
export class QueryPlan2Tab implements IPanelTab {
public readonly title = localize('queryPlanTitle', "Query Plan (Preview)");
public readonly identifier = 'QueryPlan2Tab';
public readonly view: QueryPlan2View;
export class ExecutionPlanTab implements IPanelTab {
public readonly title = localize('executionPlanTitle', "Query Plan (Preview)");
public readonly identifier = 'ExecutionPlan2Tab';
public readonly view: ExecutionPlanView;
constructor(
@IInstantiationService instantiationService: IInstantiationService,
) {
this.view = instantiationService.createInstance(QueryPlan2View);
this.view = instantiationService.createInstance(ExecutionPlanView);
}
public dispose() {
@@ -77,10 +77,10 @@ export class QueryPlan2Tab implements IPanelTab {
}
export class QueryPlan2View implements IPanelView {
private _qps?: QueryPlan2[] = [];
export class ExecutionPlanView implements IPanelView {
private _eps?: ExecutionPlan[] = [];
private _graphs?: azdata.ExecutionPlanGraph[] = [];
private _container = DOM.$('.qps-container');
private _container = DOM.$('.eps-container');
constructor(
@IInstantiationService private instantiationService: IInstantiationService,
@@ -93,7 +93,7 @@ export class QueryPlan2View implements IPanelView {
dispose() {
this._container.remove();
delete this._qps;
delete this._eps;
delete this._graphs;
}
@@ -101,7 +101,7 @@ export class QueryPlan2View implements IPanelView {
}
public clear() {
this._qps = [];
this._eps = [];
this._graphs = [];
DOM.clearNode(this._container);
}
@@ -109,9 +109,9 @@ export class QueryPlan2View implements IPanelView {
public addGraphs(newGraphs: azdata.ExecutionPlanGraph[] | undefined) {
if (newGraphs) {
newGraphs.forEach(g => {
const qp2 = this.instantiationService.createInstance(QueryPlan2, this._container, this._qps.length + 1);
qp2.graphModel = g;
this._qps.push(qp2);
const ep = this.instantiationService.createInstance(ExecutionPlan, this._container, this._eps.length + 1);
ep.graphModel = g;
this._eps.push(ep);
this._graphs.push(g);
this.updateRelativeCosts();
});
@@ -124,14 +124,14 @@ export class QueryPlan2View implements IPanelView {
}, 0);
if (sum > 0) {
this._qps.forEach(qp => {
qp.planHeader.relativeCost = ((qp.graphModel.root.subTreeCost + qp.graphModel.root.cost) / sum) * 100;
this._eps.forEach(ep => {
ep.planHeader.relativeCost = ((ep.graphModel.root.subTreeCost + ep.graphModel.root.cost) / sum) * 100;
});
}
}
}
export class QueryPlan2 implements ISashLayoutProvider {
export class ExecutionPlan implements ISashLayoutProvider {
private _graphModel?: azdata.ExecutionPlanGraph;
private _container: HTMLElement;
@@ -143,11 +143,11 @@ export class QueryPlan2 implements ISashLayoutProvider {
private _planContainer: HTMLElement;
private _planHeaderContainer: HTMLElement;
public propertiesView: QueryPlanPropertiesView;
public propertiesView: ExecutionPlanPropertiesView;
private _propContainer: HTMLElement;
private _planActionContainer: HTMLElement;
public planActionView: QueryPlanWidgetController;
public planActionView: ExecutionPlanWidgetController;
public azdataGraphDiagram: any;
@@ -170,9 +170,9 @@ export class QueryPlan2 implements ISashLayoutProvider {
@ITextResourcePropertiesService private readonly textResourcePropertiesService: ITextResourcePropertiesService,
) {
// parent container for query plan.
this._container = DOM.$('.query-plan');
this._container = DOM.$('.execution-plan');
this._parent.appendChild(this._container);
const sashContainer = DOM.$('.query-plan-sash');
const sashContainer = DOM.$('.execution-plan-sash');
this._parent.appendChild(sashContainer);
const sash = new Sash(sashContainer, this, { orientation: Orientation.HORIZONTAL });
@@ -227,11 +227,11 @@ export class QueryPlan2 implements ISashLayoutProvider {
// container properties
this._propContainer = DOM.$('.properties');
this._container.appendChild(this._propContainer);
this.propertiesView = new QueryPlanPropertiesView(this._propContainer, this._themeService);
this.propertiesView = new ExecutionPlanPropertiesView(this._propContainer, this._themeService);
this._planActionContainer = DOM.$('.plan-action-container');
this._planContainer.appendChild(this._planActionContainer);
this.planActionView = new QueryPlanWidgetController(this._planActionContainer);
this.planActionView = new ExecutionPlanWidgetController(this._planActionContainer);
// container that holds actionbar icons
this._actionBarContainer = DOM.$('.action-bar-container');
@@ -350,7 +350,7 @@ export class QueryPlan2 implements ISashLayoutProvider {
let graphRoot: azdata.ExecutionPlanNode = this._graphModel.root;
this.populate(graphRoot, diagramRoot);
this.azdataGraphDiagram = new azdataGraph.azdataQueryPlan(container, diagramRoot, queryPlanNodeIconPaths);
this.azdataGraphDiagram = new azdataGraph.azdataQueryPlan(container, diagramRoot, executionPlanNodeIconPaths);
this.azdataGraphDiagram.graph.setCellsMovable(false); // preventing drag and drop of graph nodes.
this.azdataGraphDiagram.graph.setCellsDisconnectable(false); // preventing graph edges to be disconnected from source and target nodes.
@@ -456,66 +456,66 @@ export class QueryPlan2 implements ISashLayoutProvider {
}
class OpenQueryAction extends Action {
public static ID = 'qp.OpenQueryAction';
public static ID = 'ep.OpenQueryAction';
public static LABEL = localize('openQueryAction', "Open Query");
constructor() {
super(OpenQueryAction.ID, OpenQueryAction.LABEL, openQueryIconClassNames);
}
public override async run(context: QueryPlan2): Promise<void> {
public override async run(context: ExecutionPlan): Promise<void> {
context.openQuery();
}
}
class PropertiesAction extends Action {
public static ID = 'qp.propertiesAction';
public static LABEL = localize('queryPlanPropertiesActionLabel', "Properties");
public static ID = 'ep.propertiesAction';
public static LABEL = localize('executionPlanPropertiesActionLabel', "Properties");
constructor() {
super(PropertiesAction.ID, PropertiesAction.LABEL, openPropertiesIconClassNames);
}
public override async run(context: QueryPlan2): Promise<void> {
public override async run(context: ExecutionPlan): Promise<void> {
context.propertiesView.toggleVisibility();
}
}
class ZoomInAction extends Action {
public static ID = 'qp.ZoomInAction';
public static LABEL = localize('queryPlanZoomInActionLabel', "Zoom In");
public static ID = 'ep.ZoomInAction';
public static LABEL = localize('executionPlanZoomInActionLabel', "Zoom In");
constructor() {
super(ZoomInAction.ID, ZoomInAction.LABEL, zoomInIconClassNames);
}
public override async run(context: QueryPlan2): Promise<void> {
public override async run(context: ExecutionPlan): Promise<void> {
context.azdataGraphDiagram.graph.zoomIn();
}
}
class ZoomOutAction extends Action {
public static ID = 'qp.ZoomOutAction';
public static LABEL = localize('queryPlanZoomOutActionLabel', "Zoom Out");
public static ID = 'ep.ZoomOutAction';
public static LABEL = localize('executionPlanZoomOutActionLabel', "Zoom Out");
constructor() {
super(ZoomOutAction.ID, ZoomOutAction.LABEL, zoomOutIconClassNames);
}
public override async run(context: QueryPlan2): Promise<void> {
public override async run(context: ExecutionPlan): Promise<void> {
context.azdataGraphDiagram.graph.zoomOut();
}
}
class ZoomToFitAction extends Action {
public static ID = 'qp.FitGraph';
public static LABEL = localize('queryPlanFitGraphLabel', "Zoom to fit");
public static ID = 'ep.FitGraph';
public static LABEL = localize('executionPlanFitGraphLabel', "Zoom to fit");
constructor() {
super(ZoomToFitAction.ID, ZoomToFitAction.LABEL, zoomToFitIconClassNames);
}
public override async run(context: QueryPlan2): Promise<void> {
public override async run(context: ExecutionPlan): Promise<void> {
context.azdataGraphDiagram.graph.fit();
context.azdataGraphDiagram.graph.view.rendering = true;
context.azdataGraphDiagram.graph.refresh();
@@ -523,14 +523,14 @@ class ZoomToFitAction extends Action {
}
class SavePlanFile extends Action {
public static ID = 'qp.saveXML';
public static LABEL = localize('queryPlanSavePlanXML', "Save Plan File");
public static ID = 'ep.saveXML';
public static LABEL = localize('executionPlanSavePlanXML', "Save Plan File");
constructor() {
super(SavePlanFile.ID, SavePlanFile.LABEL, savePlanIconClassNames);
}
public override async run(context: QueryPlan2): Promise<void> {
public override async run(context: ExecutionPlan): Promise<void> {
const workspaceFolders = await context.workspaceContextService.getWorkspace().folders;
const defaultFileName = 'plan';
let currentWorkSpaceFolder: URI;
@@ -544,7 +544,7 @@ class SavePlanFile extends Action {
filters: [
{
extensions: ['sqlplan'], //TODO: Get this extension from provider
name: localize('queryPlan.SaveFileDescription', 'Execution Plan Files') //TODO: Get the names from providers.
name: localize('executionPlan.SaveFileDescription', 'Execution Plan Files') //TODO: Get the names from providers.
}
],
defaultUri: currentWorkSpaceFolder // If no workspaces are opened this will be undefined
@@ -556,40 +556,40 @@ class SavePlanFile extends Action {
}
class CustomZoomAction extends Action {
public static ID = 'qp.customZoom';
public static LABEL = localize('queryPlanCustomZoom', "Custom Zoom");
public static ID = 'ep.customZoom';
public static LABEL = localize('executionPlanCustomZoom', "Custom Zoom");
constructor() {
super(CustomZoomAction.ID, CustomZoomAction.LABEL, customZoomIconClassNames);
}
public override async run(context: QueryPlan2): Promise<void> {
public override async run(context: ExecutionPlan): Promise<void> {
context.planActionView.toggleWidget(context._instantiationService.createInstance(CustomZoomWidget, context));
}
}
class SearchNodeAction extends Action {
public static ID = 'qp.searchNode';
public static LABEL = localize('queryPlanSearchNodeAction', "Find Node");
public static ID = 'ep.searchNode';
public static LABEL = localize('executionPlanSearchNodeAction', "Find Node");
constructor() {
super(SearchNodeAction.ID, SearchNodeAction.LABEL, searchIconClassNames);
}
public override async run(context: QueryPlan2): Promise<void> {
public override async run(context: ExecutionPlan): Promise<void> {
context.planActionView.toggleWidget(context._instantiationService.createInstance(NodeSearchWidget, context));
}
}
class OpenPlanFile extends Action {
public static ID = 'qp.openGraphFile';
public static Label = localize('queryPlanOpenGraphFile', "Show Query Plan XML"); //TODO: add a contribution point for providers to set this text
public static ID = 'ep.openGraphFile';
public static Label = localize('executionPlanOpenGraphFile', "Show Query Plan XML"); //TODO: add a contribution point for providers to set this text
constructor() {
super(OpenPlanFile.ID, OpenPlanFile.Label, openPlanFileIconClassNames);
}
public override async run(context: QueryPlan2): Promise<void> {
public override async run(context: ExecutionPlan): Promise<void> {
await context.openGraphFile();
}
}
@@ -598,7 +598,7 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) =
const recommendationsColor = theme.getColor(textLinkForeground);
if (recommendationsColor) {
collector.addRule(`
.qps-container .query-plan .plan .header .recommendations {
.eps-container .execution-plan .plan .header .recommendations {
color: ${recommendationsColor};
}
`);
@@ -606,7 +606,7 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) =
const shadow = theme.getColor(widgetShadow);
if (shadow) {
collector.addRule(`
.qps-container .query-plan .plan .plan-action-container .child {
.eps-container .execution-plan .plan .plan-action-container .child {
box-shadow: 0 0 8px 2px ${shadow};
}
`);
@@ -615,9 +615,9 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) =
const menuBackgroundColor = theme.getColor(listHoverBackground);
if (menuBackgroundColor) {
collector.addRule(`
.qps-container .query-plan .plan .header,
.qps-container .query-plan .properties .title,
.qps-container .query-plan .properties .table-action-bar {
.eps-container .execution-plan .plan .header,
.eps-container .execution-plan .properties .title,
.eps-container .execution-plan .properties .table-action-bar {
background-color: ${menuBackgroundColor};
}
`);
@@ -626,7 +626,7 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) =
const widgetBackgroundColor = theme.getColor(editorWidgetBackground);
if (widgetBackgroundColor) {
collector.addRule(`
.qps-container .query-plan .plan .plan-action-container .child,
.eps-container .execution-plan .plan .plan-action-container .child,
.mxTooltip {
background-color: ${widgetBackgroundColor};
}
@@ -636,10 +636,10 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) =
const widgetBorderColor = theme.getColor(contrastBorder);
if (widgetBorderColor) {
collector.addRule(`
.qps-container .query-plan .plan .plan-action-container .child,
.qps-container .query-plan .plan .header,
.qps-container .query-plan .properties .title,
.qps-container .query-plan .properties .table-action-bar,
.eps-container .execution-plan .plan .plan-action-container .child,
.eps-container .execution-plan .plan .header,
.eps-container .execution-plan .properties .title,
.eps-container .execution-plan .properties .table-action-bar,
.mxTooltip {
border: 1px solid ${widgetBorderColor};
}

View File

@@ -17,11 +17,11 @@ import { ActionBar } from 'sql/base/browser/ui/taskbar/actionbar';
import { ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar';
import { removeLineBreaks } from 'sql/base/common/strings';
import { isString } from 'vs/base/common/types';
import { sortAlphabeticallyIconClassNames, sortByDisplayOrderIconClassNames } from 'sql/workbench/contrib/queryplan2/browser/constants';
import { sortAlphabeticallyIconClassNames, sortByDisplayOrderIconClassNames } from 'sql/workbench/contrib/executionPlan/browser/constants';
import { textFormatter } from 'sql/base/browser/ui/table/formatters';
export class QueryPlanPropertiesView {
export class ExecutionPlanPropertiesView {
// Title bar with close button action
private _propertiesTitle!: HTMLElement;
@@ -187,7 +187,7 @@ export class QueryPlanPropertiesView {
private renderView(): void {
if (this._model.graphElement) {
const nodeName = (<azdata.ExecutionPlanNode>this._model.graphElement).name;
this._operationName.innerText = nodeName ? removeLineBreaks(nodeName) : localize('queryPlanPropertiesEdgeOperationName', "Edge"); //since edges do not have names like node, we set the operation name to 'Edge'
this._operationName.innerText = nodeName ? removeLineBreaks(nodeName) : localize('executionPlanPropertiesEdgeOperationName', "Edge"); //since edges do not have names like node, we set the operation name to 'Edge'
}
this._tableContainer.scrollTo(0, 0);
this._dataView.clear();
@@ -232,40 +232,40 @@ export interface GraphElementPropertyViewData {
}
export class ClosePropertyViewAction extends Action {
public static ID = 'qp.propertiesView.close';
public static LABEL = localize('queryPlanPropertyViewClose', "Close");
public static ID = 'ep.propertiesView.close';
public static LABEL = localize('executionPlanPropertyViewClose', "Close");
constructor() {
super(ClosePropertyViewAction.ID, ClosePropertyViewAction.LABEL, Codicon.close.classNames);
}
public override async run(context: QueryPlanPropertiesView): Promise<void> {
public override async run(context: ExecutionPlanPropertiesView): Promise<void> {
context.toggleVisibility();
}
}
export class SortPropertiesAlphabeticallyAction extends Action {
public static ID = 'qp.propertiesView.sortByAlphabet';
public static LABEL = localize('queryPlanPropertyViewSortAlphabetically', "Alphabetical");
public static ID = 'ep.propertiesView.sortByAlphabet';
public static LABEL = localize('executionPlanPropertyViewSortAlphabetically', "Alphabetical");
constructor() {
super(SortPropertiesAlphabeticallyAction.ID, SortPropertiesAlphabeticallyAction.LABEL, sortAlphabeticallyIconClassNames);
}
public override async run(context: QueryPlanPropertiesView): Promise<void> {
public override async run(context: ExecutionPlanPropertiesView): Promise<void> {
context.sortPropertiesAlphabetically();
}
}
export class SortPropertiesByDisplayOrderAction extends Action {
public static ID = 'qp.propertiesView.sortByDisplayOrder';
public static LABEL = localize('queryPlanPropertyViewSortByDisplayOrde', "Categorized");
public static ID = 'ep.propertiesView.sortByDisplayOrder';
public static LABEL = localize('executionPlanPropertyViewSortByDisplayOrder', "Categorized");
constructor() {
super(SortPropertiesByDisplayOrderAction.ID, SortPropertiesByDisplayOrderAction.LABEL, sortByDisplayOrderIconClassNames);
}
public override async run(context: QueryPlanPropertiesView): Promise<void> {
public override async run(context: ExecutionPlanPropertiesView): Promise<void> {
context.sortPropertiesByImportance();
}
}

View File

@@ -3,7 +3,7 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
export abstract class QueryPlanWidgetBase {
export abstract class ExecutionPlanWidgetBase {
/**
*
* @param container HTML Element that contains the UI for the plan action view.

View File

@@ -3,18 +3,18 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { QueryPlanWidgetBase } from 'sql/workbench/contrib/queryplan2/browser/queryPlanWidgetBase';
import { ExecutionPlanWidgetBase as ExecutionPlanWidgetBase } from 'sql/workbench/contrib/executionPlan/browser/executionPlanWidgetBase';
export class QueryPlanWidgetController {
private _queryPlanWidgetMap: Map<string, QueryPlanWidgetBase> = new Map();
export class ExecutionPlanWidgetController {
private _executionPlanWidgetMap: Map<string, ExecutionPlanWidgetBase> = new Map();
constructor(private _parentContainer: HTMLElement) {
}
private addWidget(widget: QueryPlanWidgetBase) {
if (widget.identifier && !this._queryPlanWidgetMap.has(widget.identifier)) {
this._queryPlanWidgetMap.set(widget.identifier, widget);
private addWidget(widget: ExecutionPlanWidgetBase) {
if (widget.identifier && !this._executionPlanWidgetMap.has(widget.identifier)) {
this._executionPlanWidgetMap.set(widget.identifier, widget);
if (widget.container) {
widget.container.classList.add('child');
this._parentContainer.appendChild(widget.container);
@@ -23,11 +23,11 @@ export class QueryPlanWidgetController {
}
}
public removeWidget(widget: QueryPlanWidgetBase) {
public removeWidget(widget: ExecutionPlanWidgetBase) {
if (widget.identifier) {
if (this._queryPlanWidgetMap.has(widget.identifier)) {
this._parentContainer.removeChild(this._queryPlanWidgetMap.get(widget.identifier).container);
this._queryPlanWidgetMap.delete(widget.identifier);
if (this._executionPlanWidgetMap.has(widget.identifier)) {
this._parentContainer.removeChild(this._executionPlanWidgetMap.get(widget.identifier).container);
this._executionPlanWidgetMap.delete(widget.identifier);
} else {
throw new Error('The view is not present in the container');
}
@@ -38,8 +38,8 @@ export class QueryPlanWidgetController {
* Adds or removes view from the controller.
* @param widget PlanActionView to be added.
*/
public toggleWidget(widget: QueryPlanWidgetBase) {
if (!this._queryPlanWidgetMap.has(widget.identifier)) {
public toggleWidget(widget: ExecutionPlanWidgetBase) {
if (!this._executionPlanWidgetMap.has(widget.identifier)) {
this.addWidget(widget);
} else {
this.removeWidget(widget);

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F6F6F6;fill-opacity:0;}
.st1{fill:#F6F6F6;}
.st2{fill:#424242;}
.st3{fill:#F0EFF1;}
</style>
<g id="canvas">
<path class="st0" d="M16,16H0V0h16V16z"/>
</g>
<path id="outline" class="st1" d="M16,5.8c0-3.2-2.6-5.7-5.8-5.8C7,0,4.4,2.6,4.3,5.8c0,1,0.3,2,0.8,2.9l-4.7,4.7
c-0.6,0.6-0.6,1.5,0,2.1c0.6,0.6,1.5,0.6,2.1,0l4.7-4.7c0.4,0.3,0.9,0.4,1.3,0.6l-0.8,0.8L7,16h1.4l2.4-0.8l5.2-5.1l-1-1
C15.6,8.1,16,7,16,5.8z"/>
<path id="iconBg" class="st2" d="M10.4,9.6c-0.1,0-0.2,0-0.2,0C8,9.7,6.3,8,6.3,5.8C6.3,3.7,8,2,10.2,2C12.3,2,14,3.7,14,5.8v0
c0,0.6-0.2,1.2-0.5,1.8l0.7,0.7c0.4-0.7,0.7-1.6,0.7-2.5c0-2.6-2.1-4.7-4.8-4.8v0C7.5,1,5.3,3.2,5.3,5.8c0,1.1,0.4,2.2,1.1,3
l-5.3,5.3c-0.2,0.2-0.2,0.5,0,0.7c0.2,0.2,0.5,0.2,0.7,0l5.3-5.3c0.7,0.6,1.5,0.9,2.3,1L10.4,9.6z M8.2,15l2.1-0.7l-1.6-1.6L8.2,15z
M12.3,9.2l1.6,1.6l0.7-0.7L13,8.5L12.3,9.2z M9.5,12l1.6,1.6l2.1-2.1l-1.6-1.6L9.5,12z"/>
<path id="iconFg" class="st3" d="M10.2,9.7c0.1,0,0.2,0,0.2,0L13,7.1l0.6,0.6C13.8,7.1,14,6.5,14,5.8C14,3.7,12.3,2,10.2,2
c0,0,0,0,0,0C8,2,6.3,3.7,6.3,5.8C6.3,8,8,9.7,10.2,9.7z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 846 B

After

Width:  |  Height:  |  Size: 846 B

View File

Before

Width:  |  Height:  |  Size: 851 B

After

Width:  |  Height:  |  Size: 851 B

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Some files were not shown because too many files have changed in this diff Show More