add row status on status bar for queries (#1841)

This commit is contained in:
Anthony Dresser
2018-07-05 10:43:24 -07:00
committed by GitHub
parent 6c3d85cc45
commit cb060cb5db
3 changed files with 111 additions and 9 deletions

View File

@@ -0,0 +1,92 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as WorkbenchUtils from 'sql/workbench/common/sqlWorkbenchUtils';
import { IQueryModelService } from '../execution/queryModel';
import QueryRunner from 'sql/parts/query/execution/queryRunner';
import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar';
import { IDisposable, combinedDisposable, dispose } from 'vs/base/common/lifecycle';
import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService';
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IEditorCloseEvent } from 'vs/workbench/common/editor';
import { append, $, hide, show } from 'vs/base/browser/dom';
import * as nls from 'vs/nls';
export class RowCountStatusBarItem implements IStatusbarItem {
private _element: HTMLElement;
private _flavorElement: HTMLElement;
private dispose: IDisposable;
constructor(
@IWorkbenchEditorService private _editorService: IWorkbenchEditorService,
@IEditorGroupService private _editorGroupService: IEditorGroupService,
@IQueryModelService private _queryModelService: IQueryModelService
) { }
render(container: HTMLElement): IDisposable {
let disposables = [
this._editorGroupService.onEditorsChanged(this._onEditorsChanged, this),
this._editorGroupService.getStacksModel().onEditorClosed(this._onEditorClosed, this)
];
this._element = append(container, $('.query-statusbar-group'));
this._flavorElement = append(this._element, $('a.editor-status-selection'));
this._flavorElement.title = nls.localize('rowStatus', "Row Count");
hide(this._flavorElement);
this._showStatus();
return combinedDisposable(disposables);
}
private _onEditorsChanged() {
this._showStatus();
}
private _onEditorClosed(event: IEditorCloseEvent) {
hide(this._flavorElement);
}
// Show/hide query status for active editor
private _showStatus(): void {
hide(this._flavorElement);
dispose(this.dispose);
let activeEditor = this._editorService.getActiveEditor();
if (activeEditor) {
let currentUri = WorkbenchUtils.getEditorUri(activeEditor.input);
if (currentUri) {
let queryRunner = this._queryModelService.getQueryRunner(currentUri);
if (queryRunner) {
if (queryRunner.hasCompleted) {
this._displayValue(queryRunner);
} else if (queryRunner.isExecuting) {
this.dispose = queryRunner.addListener('complete', () => {
this._displayValue(queryRunner);
});
}
} else {
this.dispose = this._queryModelService.onRunQueryComplete(e => {
if (e === currentUri) {
this._displayValue(this._queryModelService.getQueryRunner(currentUri));
}
});
}
}
}
}
private _displayValue(runner: QueryRunner) {
let number = runner.batchSets.reduce((p, c) => {
return p + c.resultSetSummaries.reduce((rp, rc) => {
return rp + rc.rowCount;
}, 0);
}, 0);
this._flavorElement.innerText = nls.localize('rowCount', "{0} rows", number);
show(this._flavorElement);
}
}

View File

@@ -30,6 +30,8 @@ export const IQueryModelService = createDecorator<IQueryModelService>(SERVICE_ID
export interface IQueryModelService {
_serviceBrand: any;
getQueryRunner(uri: string): QueryRunner;
getConfig(): Promise<{ [key: string]: any }>;
getShortcuts(): Promise<any>;
getQueryRows(uri: string, rowStart: number, numberOfRows: number, batchId: number, resultId: number): Thenable<ResultSetSubset>;

View File

@@ -13,6 +13,7 @@ import { IQueryModelService } from 'sql/parts/query/execution/queryModel';
import { QueryInput } from 'sql/parts/query/common/queryInput';
import { QueryStatusbarItem } from 'sql/parts/query/execution/queryStatus';
import { SqlFlavorStatusbarItem } from 'sql/parts/query/common/flavorStatus';
import { RowCountStatusBarItem } from 'sql/parts/query/common/rowCountStatus';
import * as sqlops from 'sqlops';
import { ISlickRange } from 'angular2-slickgrid';
@@ -85,6 +86,13 @@ export class QueryModelService implements IQueryModelService {
this._onEditSessionReady = new Emitter<sqlops.EditSessionReadyParams>();
// Register Statusbar items
(<statusbar.IStatusbarRegistry>platform.Registry.as(statusbar.Extensions.Statusbar)).registerStatusbarItem(new statusbar.StatusbarItemDescriptor(
RowCountStatusBarItem,
statusbar.StatusbarAlignment.RIGHT,
100 /* Should appear to the right of the SQL editor status */
));
(<statusbar.IStatusbarRegistry>platform.Registry.as(statusbar.Extensions.Statusbar)).registerStatusbarItem(new statusbar.StatusbarItemDescriptor(
QueryStatusbarItem,
statusbar.StatusbarAlignment.RIGHT,
@@ -345,7 +353,7 @@ export class QueryModelService implements IQueryModelService {
public disposeQuery(ownerUri: string): void {
// Get existing query runner
let queryRunner = this._getQueryRunner(ownerUri);
let queryRunner = this.getQueryRunner(ownerUri);
if (queryRunner) {
queryRunner.disposeQuery();
}
@@ -437,7 +445,7 @@ export class QueryModelService implements IQueryModelService {
public disposeEdit(ownerUri: string): Thenable<void> {
// Get existing query runner
let queryRunner = this._getQueryRunner(ownerUri);
let queryRunner = this.getQueryRunner(ownerUri);
if (queryRunner) {
return queryRunner.disposeEdit(ownerUri);
}
@@ -446,7 +454,7 @@ export class QueryModelService implements IQueryModelService {
public updateCell(ownerUri: string, rowId: number, columnId: number, newValue: string): Thenable<sqlops.EditUpdateCellResult> {
// Get existing query runner
let queryRunner = this._getQueryRunner(ownerUri);
let queryRunner = this.getQueryRunner(ownerUri);
if (queryRunner) {
return queryRunner.updateCell(ownerUri, rowId, columnId, newValue).then((result) => result, error => {
this._notificationService.notify({
@@ -461,7 +469,7 @@ export class QueryModelService implements IQueryModelService {
public commitEdit(ownerUri): Thenable<void> {
// Get existing query runner
let queryRunner = this._getQueryRunner(ownerUri);
let queryRunner = this.getQueryRunner(ownerUri);
if (queryRunner) {
return queryRunner.commitEdit(ownerUri).then(() => { }, error => {
this._notificationService.notify({
@@ -476,7 +484,7 @@ export class QueryModelService implements IQueryModelService {
public createRow(ownerUri: string): Thenable<sqlops.EditCreateRowResult> {
// Get existing query runner
let queryRunner = this._getQueryRunner(ownerUri);
let queryRunner = this.getQueryRunner(ownerUri);
if (queryRunner) {
return queryRunner.createRow(ownerUri);
}
@@ -485,7 +493,7 @@ export class QueryModelService implements IQueryModelService {
public deleteRow(ownerUri: string, rowId: number): Thenable<void> {
// Get existing query runner
let queryRunner = this._getQueryRunner(ownerUri);
let queryRunner = this.getQueryRunner(ownerUri);
if (queryRunner) {
return queryRunner.deleteRow(ownerUri, rowId);
}
@@ -494,7 +502,7 @@ export class QueryModelService implements IQueryModelService {
public revertCell(ownerUri: string, rowId: number, columnId: number): Thenable<sqlops.EditRevertCellResult> {
// Get existing query runner
let queryRunner = this._getQueryRunner(ownerUri);
let queryRunner = this.getQueryRunner(ownerUri);
if (queryRunner) {
return queryRunner.revertCell(ownerUri, rowId, columnId);
}
@@ -503,7 +511,7 @@ export class QueryModelService implements IQueryModelService {
public revertRow(ownerUri: string, rowId: number): Thenable<void> {
// Get existing query runner
let queryRunner = this._getQueryRunner(ownerUri);
let queryRunner = this.getQueryRunner(ownerUri);
if (queryRunner) {
return queryRunner.revertRow(ownerUri, rowId);
}
@@ -512,7 +520,7 @@ export class QueryModelService implements IQueryModelService {
// PRIVATE METHODS //////////////////////////////////////////////////////
private _getQueryRunner(ownerUri): QueryRunner {
public getQueryRunner(ownerUri): QueryRunner {
let queryRunner: QueryRunner = undefined;
if (this._queryInfoMap.has(ownerUri)) {
let existingRunner = this._getQueryInfo(ownerUri).queryRunner;