mirror of
https://github.com/grafana/grafana.git
synced 2025-02-20 11:48:34 -06:00
35 lines
1.0 KiB
TypeScript
35 lines
1.0 KiB
TypeScript
|
import { ExpressionDatasourceUID } from 'app/features/expressions/ExpressionDatasource';
|
||
|
import { AlertQuery } from 'app/types/unified-alerting-dto';
|
||
|
|
||
|
export const hasCyclicalReferences = (queries: AlertQuery[]) => {
|
||
|
try {
|
||
|
JSON.stringify(queries);
|
||
|
return false;
|
||
|
} catch (e) {
|
||
|
return true;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
export const findDataSourceFromExpressionRecursive = (
|
||
|
queries: AlertQuery[],
|
||
|
alertQuery: AlertQuery
|
||
|
): AlertQuery | null | undefined => {
|
||
|
//Check if this is not cyclical structre
|
||
|
if (hasCyclicalReferences(queries)) {
|
||
|
return null;
|
||
|
}
|
||
|
// We have the data source in this dataQuery
|
||
|
if (alertQuery.datasourceUid !== ExpressionDatasourceUID) {
|
||
|
return alertQuery;
|
||
|
}
|
||
|
// alertQuery it's an expression, we have to traverse all the tree up to the data source
|
||
|
else {
|
||
|
const alertQueryReferenced = queries.find((alertQuery_) => alertQuery_.refId === alertQuery.model.expression);
|
||
|
if (alertQueryReferenced) {
|
||
|
return findDataSourceFromExpressionRecursive(queries, alertQueryReferenced);
|
||
|
} else {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
};
|