mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* add history links for monaco completion provider folder * add history links for monaco query field folder * add history links for components folder * add history links for configuration folder * add history links for dashboard json folder * add history links for gcopypaste folder * add history link for variableMigration * add history link for querybuilder/components/metrics-modal folder * add history link for querybuilder/components/promqail folder * add history links for querybuilder/components folder * add history links for querybuilder/hooks folder * add history links for querybuilder/shared folder * add history links for querybuilder folder * add history links for querycache folder * add history links for src folder * use frontend package and custom auth in module.ts * remove files and fix import issues * remove usePrometheusFrontendPackage * remove extra files * update betterer * remove extra files after rebase * fix betterer for rebase * fix e2e flakiness
95 lines
3.0 KiB
TypeScript
95 lines
3.0 KiB
TypeScript
// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/features/live/data/amendTimeSeries.ts
|
|
import { closestIdx } from '@grafana/data';
|
|
|
|
export type Table = [times: number[], ...values: any[][]];
|
|
|
|
// prevTable and nextTable are assumed sorted ASC on reference [0] arrays
|
|
// nextTable is assumed to be contiguous, only edges are checked for overlap
|
|
// ...so prev: [1,2,5] + next: [3,4,6] -> [1,2,3,4,6]
|
|
export function amendTable(prevTable: Table, nextTable: Table): Table {
|
|
let [prevTimes] = prevTable;
|
|
let [nextTimes] = nextTable;
|
|
|
|
let pLen = prevTimes.length;
|
|
let pStart = prevTimes[0];
|
|
let pEnd = prevTimes[pLen - 1];
|
|
|
|
let nLen = nextTimes.length;
|
|
let nStart = nextTimes[0];
|
|
let nEnd = nextTimes[nLen - 1];
|
|
|
|
let outTable: Table;
|
|
|
|
if (pLen) {
|
|
if (nLen) {
|
|
// append, no overlap
|
|
if (nStart > pEnd) {
|
|
outTable = prevTable.map((_, i) => prevTable[i].concat(nextTable[i])) as Table;
|
|
}
|
|
// prepend, no overlap
|
|
else if (nEnd < pStart) {
|
|
outTable = nextTable.map((_, i) => nextTable[i].concat(prevTable[i])) as Table;
|
|
}
|
|
// full replace
|
|
else if (nStart <= pStart && nEnd >= pEnd) {
|
|
outTable = nextTable;
|
|
}
|
|
// partial replace
|
|
else if (nStart > pStart && nEnd < pEnd) {
|
|
}
|
|
// append, with overlap
|
|
else if (nStart >= pStart) {
|
|
let idx = closestIdx(nStart, prevTimes);
|
|
idx = prevTimes[idx] < nStart ? idx - 1 : idx;
|
|
outTable = prevTable.map((_, i) => prevTable[i].slice(0, idx).concat(nextTable[i])) as Table;
|
|
}
|
|
// prepend, with overlap
|
|
else if (nEnd >= pStart) {
|
|
let idx = closestIdx(nEnd, prevTimes);
|
|
idx = prevTimes[idx] < nEnd ? idx : idx + 1;
|
|
outTable = nextTable.map((_, i) => nextTable[i].concat(prevTable[i].slice(idx))) as Table;
|
|
}
|
|
} else {
|
|
outTable = prevTable;
|
|
}
|
|
} else {
|
|
if (nLen) {
|
|
outTable = nextTable;
|
|
} else {
|
|
outTable = [[]];
|
|
}
|
|
}
|
|
|
|
return outTable!;
|
|
}
|
|
|
|
export function trimTable(table: Table, fromTime: number, toTime: number): Table {
|
|
let [times, ...vals] = table;
|
|
let fromIdx: number | undefined;
|
|
let toIdx: number | undefined;
|
|
|
|
// trim to bounds
|
|
if (times[0] < fromTime) {
|
|
fromIdx = closestIdx(fromTime, times);
|
|
|
|
if (times[fromIdx] < fromTime) {
|
|
fromIdx++;
|
|
}
|
|
}
|
|
|
|
if (times[times.length - 1] > toTime) {
|
|
toIdx = closestIdx(toTime, times);
|
|
|
|
if (times[toIdx] > toTime) {
|
|
toIdx--;
|
|
}
|
|
}
|
|
|
|
if (fromIdx != null || toIdx != null) {
|
|
times = times.slice(fromIdx ?? 0, toIdx);
|
|
vals = vals.map(vals2 => vals2.slice(fromIdx ?? 0, toIdx));
|
|
}
|
|
|
|
return [times, ...vals];
|
|
}
|