1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- import { RelativeTimeRange } from '@grafana/data';
- import { AlertQuery } from 'app/types/unified-alerting-dto';
- import { ExpressionQuery, ExpressionQueryType } from '../../../expressions/types';
- const FALL_BACK_TIME_RANGE = { from: 21600, to: 0 };
- export const getTimeRangeForExpression = (query: ExpressionQuery, queries: AlertQuery[]): RelativeTimeRange => {
- const referencedRefIds: string[] | undefined = getReferencedIds(query, queries);
- if (!referencedRefIds) {
- return FALL_BACK_TIME_RANGE;
- }
- const { from, to } = getTimeRanges(referencedRefIds, queries);
- if (!from.length && !to.length) {
- return FALL_BACK_TIME_RANGE;
- }
- return {
- from: Math.max(...from),
- to: Math.min(...to),
- };
- };
- const getReferencedIds = (model: ExpressionQuery, queries: AlertQuery[]): string[] | undefined => {
- switch (model.type) {
- case ExpressionQueryType.classic:
- return getReferencedIdsForClassicCondition(model);
- case ExpressionQueryType.math:
- return getReferencedIdsForMath(model, queries);
- case ExpressionQueryType.resample:
- case ExpressionQueryType.reduce:
- return getReferencedIdsForReduce(model);
- }
- };
- const getReferencedIdsForClassicCondition = (model: ExpressionQuery) => {
- return model.conditions?.map((condition) => {
- return condition.query.params[0];
- });
- };
- const getTimeRanges = (referencedRefIds: string[], queries: AlertQuery[]) => {
- let from: number[] = [];
- let to = [FALL_BACK_TIME_RANGE.to];
- for (const referencedRefIdsKey of referencedRefIds) {
- const query = queries.find((query) => query.refId === referencedRefIdsKey);
- if (!query || !query.relativeTimeRange) {
- continue;
- }
- from.push(query.relativeTimeRange.from);
- to.push(query.relativeTimeRange.to);
- }
- return {
- from,
- to,
- };
- };
- const getReferencedIdsForMath = (model: ExpressionQuery, queries: AlertQuery[]) => {
- return (
- queries
- // filter queries of type query and filter expression on if it includes any refIds
- .filter((q) => q.queryType === 'query' && model.expression?.includes(q.refId))
- .map((q) => {
- return q.refId;
- })
- );
- };
- const getReferencedIdsForReduce = (model: ExpressionQuery) => {
- return model.expression ? [model.expression] : undefined;
- };
|