mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-25 09:35:37 -05:00
Use column names as keys for table data in SQL cell outputs (#22688)
This commit is contained in:
@@ -8,14 +8,13 @@ import { Table } from 'sql/base/browser/ui/table/table';
|
||||
import { textFormatter } from 'sql/base/browser/ui/table/formatters';
|
||||
import { RowNumberColumn } from 'sql/base/browser/ui/table/plugins/rowNumberColumn.plugin';
|
||||
import { escape } from 'sql/base/common/strings';
|
||||
import { IDataResource } from 'sql/workbench/services/notebook/browser/sql/sqlSessionManager';
|
||||
import { IDataResource, IDataResourceRow, rowHasColumnNameKeys } from 'sql/workbench/services/notebook/browser/sql/sqlSessionManager';
|
||||
import { attachTableStyler } from 'sql/platform/theme/common/styler';
|
||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
import { MouseWheelSupport } from 'sql/base/browser/ui/table/plugins/mousewheelTableScroll.plugin';
|
||||
import { AutoColumnSize } from 'sql/base/browser/ui/table/plugins/autoSizeColumns.plugin';
|
||||
import { AdditionalKeyBindings } from 'sql/base/browser/ui/table/plugins/additionalKeyBindings.plugin';
|
||||
import { RESULTS_GRID_DEFAULTS } from 'sql/workbench/common/constants';
|
||||
import { values } from 'vs/base/common/collections';
|
||||
import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility';
|
||||
import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput';
|
||||
|
||||
@@ -88,13 +87,17 @@ export function renderDataResource(
|
||||
}
|
||||
|
||||
// SlickGrid requires columns and data to be in a very specific format; this code was adapted from tableInsight.component.ts
|
||||
export function transformData(rows: any[], columns: Slick.Column<any>[]): { [key: string]: string }[] {
|
||||
function transformData(rows: IDataResourceRow[], columns: Slick.Column<any>[]): IDataResourceRow[] {
|
||||
// Rows are either indexed by column name or ordinal number, so check for one column name to see if it uses that format
|
||||
let useColumnNameKey = rowHasColumnNameKeys(rows[0], columns.map(column => column.name));
|
||||
return rows.map(row => {
|
||||
let dataWithSchema = {};
|
||||
Object.keys(row).forEach((val, index) => {
|
||||
let displayValue = String(values(row)[index]);
|
||||
// Since the columns[0] represents the row number, start at 1
|
||||
dataWithSchema[columns[index + 1].field] = {
|
||||
let columnName = columns[index + 1].field;
|
||||
let sourceKey = useColumnNameKey ? columnName : index + 1;
|
||||
let displayValue = String(row[sourceKey]);
|
||||
dataWithSchema[columnName] = {
|
||||
displayValue: displayValue,
|
||||
ariaLabel: escape(displayValue),
|
||||
isNull: false
|
||||
@@ -104,7 +107,7 @@ export function transformData(rows: any[], columns: Slick.Column<any>[]): { [key
|
||||
});
|
||||
}
|
||||
|
||||
export function transformColumns(columns: string[]): Slick.Column<any>[] {
|
||||
function transformColumns(columns: string[]): Slick.Column<any>[] {
|
||||
return columns.map((col, index) => {
|
||||
return <Slick.Column<any>>{
|
||||
name: col,
|
||||
|
||||
@@ -608,7 +608,7 @@ export class SQLFuture extends Disposable implements FutureInternal {
|
||||
this._rowsMap.set(key, rows.concat(queryResult.rows));
|
||||
|
||||
// Convert rows to data resource and html and send to cell model to be saved
|
||||
let dataResourceRows = this.convertRowsToDataResource(queryResult.rows);
|
||||
let dataResourceRows = this.convertRowsToDataResource(resultSet.columnInfo, queryResult.rows);
|
||||
let saveData = this._dataToSaveMap.get(key);
|
||||
saveData['application/vnd.dataresource+json'].data = saveData['application/vnd.dataresource+json'].data.concat(dataResourceRows);
|
||||
let htmlRows = this.convertRowsToHtml(queryResult.rows, key);
|
||||
@@ -702,11 +702,12 @@ export class SQLFuture extends Disposable implements FutureInternal {
|
||||
return htmlTable;
|
||||
}
|
||||
|
||||
private convertRowsToDataResource(rows: ICellValue[][]): any[] {
|
||||
private convertRowsToDataResource(columns: IColumn[], rows: ICellValue[][]): IDataResourceRow[] {
|
||||
return rows.map(row => {
|
||||
let rowObject: { [key: string]: any; } = {};
|
||||
let rowObject = {};
|
||||
row.forEach((val, index) => {
|
||||
rowObject[index] = val.displayValue;
|
||||
let columnName = columns[index].columnName;
|
||||
rowObject[columnName] = val.displayValue;
|
||||
});
|
||||
return rowObject;
|
||||
});
|
||||
@@ -775,7 +776,7 @@ export class SQLFuture extends Disposable implements FutureInternal {
|
||||
|
||||
export interface IDataResource {
|
||||
schema: IDataResourceFields;
|
||||
data: any[];
|
||||
data: IDataResourceRow[];
|
||||
}
|
||||
|
||||
export interface IDataResourceFields {
|
||||
@@ -787,6 +788,20 @@ export interface IDataResourceSchema {
|
||||
type?: string;
|
||||
}
|
||||
|
||||
export interface IDataResourceRow {
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether a row from a query result set uses column name keys to access its cell data, rather than ordinal number.
|
||||
* @param row The data row to inspect.
|
||||
* @param columnNames The array of column names from the result set's column schema. Column names can be in any order.
|
||||
*/
|
||||
export function rowHasColumnNameKeys(row: IDataResourceRow, columnNames: string[]): boolean {
|
||||
let columnNameSet = new Set(columnNames);
|
||||
return Object.keys(row).every(rowKey => columnNameSet.has(rowKey));
|
||||
}
|
||||
|
||||
class ExternalScriptMagic {
|
||||
|
||||
constructor(private language: string) {
|
||||
|
||||
Reference in New Issue
Block a user