mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-29 09:35:38 -05:00
query result selection summary improvement (both perf and usability) (#23378)
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { IGridPosition, GridPosition } from 'sql/base/common/gridPosition';
|
||||
import { IRange } from 'vs/base/common/range';
|
||||
import { isNumber } from 'vs/base/common/types';
|
||||
|
||||
/**
|
||||
@@ -358,4 +359,69 @@ export class GridRange {
|
||||
public static spansMultipleLines(range: IGridRange): boolean {
|
||||
return range.endRow > range.startRow;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance of IGridRange from Slick.Range.
|
||||
*/
|
||||
public static fromSlickRange(range: Slick.Range): IGridRange {
|
||||
return {
|
||||
startRow: range.fromRow,
|
||||
endRow: range.toRow,
|
||||
startColumn: range.fromCell,
|
||||
endColumn: range.toCell
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a list IGridRange from a list of Slick.Range.
|
||||
*/
|
||||
public static fromSlickRanges(ranges: Slick.Range[]): IGridRange[] {
|
||||
return ranges.map(r => GridRange.fromSlickRange(r));
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge the ranges by row or column and return merged ranges
|
||||
* @param ranges the ranges to be merged
|
||||
* @param mergeRows whether to merge the rows or columns.
|
||||
*/
|
||||
private static mergeRanges(ranges: IGridRange[], mergeRows: boolean): IRange[] {
|
||||
let sourceRanges: IRange[] = ranges.map(r => {
|
||||
if (mergeRows) {
|
||||
return { start: r.startRow, end: r.endRow };
|
||||
} else {
|
||||
return { start: r.startColumn, end: r.endColumn };
|
||||
}
|
||||
});
|
||||
const mergedRanges: IRange[] = [];
|
||||
sourceRanges = sourceRanges.sort((s1, s2) => { return s1.start - s2.start; });
|
||||
sourceRanges.forEach(range => {
|
||||
let merged = false;
|
||||
for (let i = 0; i < mergedRanges.length; i++) {
|
||||
const mergedRange = mergedRanges[i];
|
||||
if (range.start <= mergedRange.end) {
|
||||
mergedRange.end = Math.max(range.end, mergedRange.end);
|
||||
merged = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!merged) {
|
||||
mergedRanges.push(range);
|
||||
}
|
||||
});
|
||||
return mergedRanges;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the unique row ranges.
|
||||
*/
|
||||
public static getUniqueRows(ranges: IGridRange[]): IRange[] {
|
||||
return GridRange.mergeRanges(ranges, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the unique column ranges.
|
||||
*/
|
||||
public static getUniqueColumns(ranges: IGridRange[]): IRange[] {
|
||||
return GridRange.mergeRanges(ranges, false);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user