query result selection summary improvement (both perf and usability) (#23378)

This commit is contained in:
Alan Ren
2023-06-12 20:07:11 -07:00
committed by GitHub
parent e58f3ff277
commit d983355374
10 changed files with 256 additions and 112 deletions

View File

@@ -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);
}
}