mirror of
https://github.com/grafana/grafana.git
synced 2025-02-12 08:35:43 -06:00
* Component that can cache and extract variable dependencies * Component that can cache and extract variable dependencies * Updates * Refactoring * Lots of refactoring and iterations of supporting both re-rendering and query re-execution * Updated SceneCanvasText * Updated name of file * Updated * Refactoring a bit * Added back getName * Added comment * minor fix * Minor fix * Merge fixes * Scene variable interpolation progress * Merge fixes * Added all format registeries * Progress on multi value support * Progress on multi value support * Updates * Progress on scoped vars * Fixed circular dependency * Updates * Some review fixes * Updated comment * Added forceRender function * Add back fail on console log * Update public/app/features/scenes/variables/interpolation/sceneInterpolator.test.ts * Moving functions from SceneObjectBase * fixing tests * Fixed e2e Co-authored-by: Dominik Prokop <dominik.prokop@grafana.com>
80 lines
1.8 KiB
TypeScript
80 lines
1.8 KiB
TypeScript
export interface TreeNode {
|
|
name: string;
|
|
children: TreeNode[];
|
|
}
|
|
|
|
/*
|
|
* Builds a nested tree like
|
|
* [
|
|
* {
|
|
* name: 'A',
|
|
* children: [
|
|
* { name: 'AA', children: [] },
|
|
* { name: 'AB', children: [] },
|
|
* ]
|
|
* }
|
|
* ]
|
|
*/
|
|
function buildMetricTree(parent: string, depth: number): TreeNode[] {
|
|
const chars = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'];
|
|
const children: TreeNode[] = [];
|
|
|
|
if (depth > 5) {
|
|
return [];
|
|
}
|
|
|
|
for (const letter of chars) {
|
|
const nodeName = `${parent}${letter}`;
|
|
children.push({
|
|
name: nodeName,
|
|
children: buildMetricTree(nodeName, depth + 1),
|
|
});
|
|
}
|
|
|
|
return children;
|
|
}
|
|
|
|
function queryTree(children: TreeNode[], query: string[], queryIndex: number): TreeNode[] {
|
|
if (queryIndex >= query.length) {
|
|
return children;
|
|
}
|
|
|
|
if (query[queryIndex] === '*') {
|
|
return children;
|
|
}
|
|
|
|
const nodeQuery = query[queryIndex];
|
|
let result: TreeNode[] = [];
|
|
let namesToMatch = [nodeQuery];
|
|
|
|
// handle glob queries
|
|
if (nodeQuery.startsWith('{')) {
|
|
namesToMatch = nodeQuery.replace(/\{|\}/g, '').split(',');
|
|
}
|
|
|
|
for (const node of children) {
|
|
for (const nameToMatch of namesToMatch) {
|
|
if (nameToMatch.indexOf('*') !== -1) {
|
|
const pattern = nameToMatch.replace('*', '');
|
|
const regex = new RegExp(`^${pattern}.*`, 'gi');
|
|
if (regex.test(node.name)) {
|
|
result = result.concat(queryTree([node], query, queryIndex + 1));
|
|
}
|
|
} else if (node.name === nameToMatch) {
|
|
result = result.concat(queryTree(node.children, query, queryIndex + 1));
|
|
}
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
export function queryMetricTree(query: string): TreeNode[] {
|
|
if (query.indexOf('value') === 0) {
|
|
return [{ name: query, children: [] }];
|
|
}
|
|
|
|
const children = buildMetricTree('', 0);
|
|
return queryTree(children, query.split('.'), 0);
|
|
}
|