/
correlations.ts
107 lines (99 loc) · 4.22 KB
/
correlations.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import { Observable } from 'rxjs';
import { DataLinkTransformationConfig } from '@grafana/data';
import { getDataSourceSrv, reportInteraction } from '@grafana/runtime';
import { notifyApp } from 'app/core/actions';
import { createErrorNotification } from 'app/core/copy/appNotification';
import { CreateCorrelationParams } from 'app/features/correlations/types';
import { CorrelationData } from 'app/features/correlations/useCorrelations';
import { getCorrelationsBySourceUIDs, createCorrelation, generateDefaultLabel } from 'app/features/correlations/utils';
import { store } from 'app/store/store';
import { ThunkResult } from 'app/types';
import { saveCorrelationsAction } from './explorePane';
import { splitClose } from './main';
import { runQueries } from './query';
/**
* Creates an observable that emits correlations once they are loaded
*/
export const getCorrelations = (exploreId: string) => {
return new Observable<CorrelationData[]>((subscriber) => {
const existingCorrelations = store.getState().explore.panes[exploreId]?.correlations;
if (existingCorrelations) {
subscriber.next(existingCorrelations);
subscriber.complete();
} else {
const unsubscribe = store.subscribe(() => {
const correlations = store.getState().explore.panes[exploreId]?.correlations;
if (correlations) {
unsubscribe();
subscriber.next(correlations);
subscriber.complete();
}
});
}
});
};
function reloadCorrelations(exploreId: string): ThunkResult<Promise<void>> {
return async (dispatch, getState) => {
const pane = getState().explore!.panes[exploreId]!;
if (pane.datasourceInstance?.uid !== undefined) {
// TODO: Tie correlations with query refID for mixed datasource
let datasourceUIDs = pane.datasourceInstance.meta.mixed
? pane.queries.map((query) => query.datasource?.uid).filter((x): x is string => x !== null)
: [pane.datasourceInstance.uid];
const correlations = await getCorrelationsBySourceUIDs(datasourceUIDs);
dispatch(saveCorrelationsAction({ exploreId, correlations: correlations.correlations || [] }));
}
};
}
export function saveCurrentCorrelation(
label?: string,
description?: string,
transformations?: DataLinkTransformationConfig[]
): ThunkResult<Promise<void>> {
return async (dispatch, getState) => {
const keys = Object.keys(getState().explore?.panes);
const sourcePane = getState().explore?.panes[keys[0]];
const targetPane = getState().explore?.panes[keys[1]];
if (!sourcePane || !targetPane) {
return;
}
const sourceDatasourceRef = sourcePane.datasourceInstance?.meta.mixed
? sourcePane.queries[0].datasource
: sourcePane.datasourceInstance?.getRef();
const targetDataSourceRef = targetPane.datasourceInstance?.meta.mixed
? targetPane.queries[0].datasource
: targetPane.datasourceInstance?.getRef();
const [sourceDatasource, targetDatasource] = await Promise.all([
getDataSourceSrv().get(sourceDatasourceRef),
getDataSourceSrv().get(targetDataSourceRef),
]);
if (sourceDatasource?.uid && targetDatasource?.uid && targetPane.correlationEditorHelperData?.resultField) {
const correlation: CreateCorrelationParams = {
sourceUID: sourceDatasource.uid,
targetUID: targetDatasource.uid,
label: label || (await generateDefaultLabel(sourcePane, targetPane)),
description,
config: {
field: targetPane.correlationEditorHelperData.resultField,
target: targetPane.queries[0],
type: 'query',
transformations: transformations,
},
};
await createCorrelation(sourceDatasource.uid, correlation)
.then(async () => {
dispatch(splitClose(keys[1]));
await dispatch(reloadCorrelations(keys[0]));
await dispatch(runQueries({ exploreId: keys[0] }));
reportInteraction('grafana_explore_correlation_editor_saved', {
sourceDatasourceType: sourceDatasource.type,
targetDataSourceType: targetDatasource.type,
});
})
.catch((err) => {
dispatch(notifyApp(createErrorNotification('Error creating correlation', err)));
console.error(err);
});
}
};
}