@grafana/scenes 6.12.0--canary.1121.15045230319.0 → 6.12.0--canary.1122.15063334499.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +10 -0
- package/dist/esm/components/SceneApp/SceneApp.js +2 -2
- package/dist/esm/components/SceneApp/SceneApp.js.map +1 -1
- package/dist/esm/components/SceneApp/SceneAppPage.js +18 -2
- package/dist/esm/components/SceneApp/SceneAppPage.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanel.js +2 -2
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/core/SceneScopesBridge.js +93 -0
- package/dist/esm/core/SceneScopesBridge.js.map +1 -0
- package/dist/esm/core/sceneGraph/index.js +2 -2
- package/dist/esm/core/sceneGraph/index.js.map +1 -1
- package/dist/esm/core/sceneGraph/sceneGraph.js +5 -9
- package/dist/esm/core/sceneGraph/sceneGraph.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/querying/SceneQueryRunner.js +33 -10
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/variables/VariableDependencyConfig.js +1 -4
- package/dist/esm/variables/VariableDependencyConfig.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js +18 -19
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
- package/dist/esm/variables/components/VariableValueSelectors.js +0 -3
- package/dist/esm/variables/components/VariableValueSelectors.js.map +1 -1
- package/dist/esm/variables/constants.js +1 -2
- package/dist/esm/variables/constants.js.map +1 -1
- package/dist/esm/variables/groupby/DefaultGroupByCustomIndicatorContainer.js +102 -0
- package/dist/esm/variables/groupby/DefaultGroupByCustomIndicatorContainer.js.map +1 -0
- package/dist/esm/variables/groupby/GroupByVariable.js +40 -7
- package/dist/esm/variables/groupby/GroupByVariable.js.map +1 -1
- package/dist/esm/variables/groupby/GroupByVariableUrlSyncHandler.js +31 -7
- package/dist/esm/variables/groupby/GroupByVariableUrlSyncHandler.js.map +1 -1
- package/dist/esm/variables/sets/SceneVariableSet.js +7 -10
- package/dist/esm/variables/sets/SceneVariableSet.js.map +1 -1
- package/dist/esm/variables/types.js.map +1 -1
- package/dist/index.d.ts +60 -56
- package/dist/index.js +311 -122
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/esm/variables/variants/ScopesVariable.js +0 -80
- package/dist/esm/variables/variants/ScopesVariable.js.map +0 -1
package/dist/esm/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { getUrlWithAppState } from './components/SceneApp/utils';\nimport { registerRuntimePanelPlugin } from './components/VizPanel/registerRuntimePanelPlugin';\nimport { cloneSceneObjectState } from './core/sceneGraph/cloneSceneObject';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { getUrlState, syncStateFromSearchParams } from './services/utils';\n\nimport { registerVariableMacro } from './variables/macros';\nimport {\n escapeLabelValueInExactSelector,\n escapeLabelValueInRegexSelector,\n escapeURLDelimiters,\n renderPrometheusLabelFilters,\n} from './variables/utils';\nimport {\n isAdHocVariable,\n isQueryVariable,\n isTextBoxVariable,\n isCustomVariable,\n isDataSourceVariable,\n isConstantVariable,\n isIntervalVariable,\n isGroupByVariable,\n} from './variables/variants/guards';\n\nexport * from './core/types';\nexport * from './core/events';\nexport { sceneGraph } from './core/sceneGraph';\nexport * as behaviors from './behaviors';\nexport * as dataLayers from './querying/layers';\n\nexport { SceneObjectBase, useSceneObjectState } from './core/SceneObjectBase';\nexport { SceneDataNode } from './core/SceneDataNode';\nexport { SceneTimeRange } from './core/SceneTimeRange';\nexport { SceneTimeZoneOverride } from './core/SceneTimeZoneOverride';\n\nexport { SceneQueryRunner, type QueryRunnerState } from './querying/SceneQueryRunner';\nexport { DataProviderProxy } from './querying/DataProviderProxy';\nexport {\n type ExtraQueryDescriptor,\n type ExtraQueryProvider,\n type ExtraQueryDataProcessor,\n} from './querying/ExtraQueryProvider';\nexport { SceneDataLayerSet, SceneDataLayerSetBase } from './querying/SceneDataLayerSet';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer, type SceneDataTransformerState } from './querying/SceneDataTransformer';\nexport { registerQueryWithController } from './querying/registerQueryWithController';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\nexport type {\n SceneQueryControllerLike,\n SceneQueryControllerEntryType,\n SceneQueryControllerEntry,\n SceneInteractionProfileEvent,\n} from './behaviors/types';\n\nexport * from './variables/types';\nexport { VariableDependencyConfig } from './variables/VariableDependencyConfig';\nexport { formatRegistry, type FormatVariable } from './variables/interpolation/formatRegistry';\nexport { VariableValueSelectors } from './variables/components/VariableValueSelectors';\nexport { VariableValueControl } from './variables/components/VariableValueControl';\nexport { SceneVariableSet } from './variables/sets/SceneVariableSet';\nexport { ConstantVariable } from './variables/variants/ConstantVariable';\nexport { CustomVariable } from './variables/variants/CustomVariable';\nexport { DataSourceVariable } from './variables/variants/DataSourceVariable';\nexport { QueryVariable } from './variables/variants/query/QueryVariable';\nexport { TestVariable } from './variables/variants/TestVariable';\nexport { TextBoxVariable } from './variables/variants/TextBoxVariable';\nexport {
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import { getUrlWithAppState } from './components/SceneApp/utils';\nimport { registerRuntimePanelPlugin } from './components/VizPanel/registerRuntimePanelPlugin';\nimport { cloneSceneObjectState } from './core/sceneGraph/cloneSceneObject';\nimport { registerRuntimeDataSource } from './querying/RuntimeDataSource';\nimport { getUrlState, syncStateFromSearchParams } from './services/utils';\n\nimport { registerVariableMacro } from './variables/macros';\nimport {\n escapeLabelValueInExactSelector,\n escapeLabelValueInRegexSelector,\n escapeURLDelimiters,\n renderPrometheusLabelFilters,\n} from './variables/utils';\nimport {\n isAdHocVariable,\n isQueryVariable,\n isTextBoxVariable,\n isCustomVariable,\n isDataSourceVariable,\n isConstantVariable,\n isIntervalVariable,\n isGroupByVariable,\n} from './variables/variants/guards';\n\nexport * from './core/types';\nexport * from './core/events';\nexport { sceneGraph } from './core/sceneGraph';\nexport * as behaviors from './behaviors';\nexport * as dataLayers from './querying/layers';\n\nexport { SceneObjectBase, useSceneObjectState } from './core/SceneObjectBase';\nexport { SceneDataNode } from './core/SceneDataNode';\nexport { SceneTimeRange } from './core/SceneTimeRange';\nexport { SceneTimeZoneOverride } from './core/SceneTimeZoneOverride';\n\nexport { SceneQueryRunner, type QueryRunnerState } from './querying/SceneQueryRunner';\nexport { DataProviderProxy } from './querying/DataProviderProxy';\nexport {\n type ExtraQueryDescriptor,\n type ExtraQueryProvider,\n type ExtraQueryDataProcessor,\n} from './querying/ExtraQueryProvider';\nexport { SceneDataLayerSet, SceneDataLayerSetBase } from './querying/SceneDataLayerSet';\nexport { SceneDataLayerBase } from './querying/layers/SceneDataLayerBase';\nexport { SceneDataLayerControls } from './querying/layers/SceneDataLayerControls';\nexport { SceneDataTransformer, type SceneDataTransformerState } from './querying/SceneDataTransformer';\nexport { registerQueryWithController } from './querying/registerQueryWithController';\nexport { registerRuntimeDataSource, RuntimeDataSource } from './querying/RuntimeDataSource';\nexport type {\n SceneQueryControllerLike,\n SceneQueryControllerEntryType,\n SceneQueryControllerEntry,\n SceneInteractionProfileEvent,\n} from './behaviors/types';\n\nexport * from './variables/types';\nexport { VariableDependencyConfig } from './variables/VariableDependencyConfig';\nexport { formatRegistry, type FormatVariable } from './variables/interpolation/formatRegistry';\nexport { VariableValueSelectors } from './variables/components/VariableValueSelectors';\nexport { VariableValueControl } from './variables/components/VariableValueControl';\nexport { SceneVariableSet } from './variables/sets/SceneVariableSet';\nexport { ConstantVariable } from './variables/variants/ConstantVariable';\nexport { CustomVariable } from './variables/variants/CustomVariable';\nexport { DataSourceVariable } from './variables/variants/DataSourceVariable';\nexport { QueryVariable } from './variables/variants/query/QueryVariable';\nexport { TestVariable } from './variables/variants/TestVariable';\nexport { TextBoxVariable } from './variables/variants/TextBoxVariable';\nexport {\n MultiValueVariable,\n type MultiValueVariableState,\n type VariableGetOptionsArgs,\n} from './variables/variants/MultiValueVariable';\nexport { LocalValueVariable } from './variables/variants/LocalValueVariable';\nexport { IntervalVariable } from './variables/variants/IntervalVariable';\nexport { AdHocFiltersVariable } from './variables/adhoc/AdHocFiltersVariable';\nexport type { AdHocFilterWithLabels } from './variables/adhoc/AdHocFiltersVariable';\nexport { GroupByVariable } from './variables/groupby/GroupByVariable';\nexport { type MacroVariableConstructor } from './variables/macros/types';\n\nexport { type UrlSyncManagerLike, UrlSyncManager, NewSceneObjectAddedEvent } from './services/UrlSyncManager';\nexport { useUrlSync } from './services/useUrlSync';\nexport { UrlSyncContextProvider } from './services/UrlSyncContextProvider';\nexport { SceneObjectUrlSyncConfig } from './services/SceneObjectUrlSyncConfig';\n\nexport { EmbeddedScene, type EmbeddedSceneState } from './components/EmbeddedScene';\nexport { VizPanel, type VizPanelState } from './components/VizPanel/VizPanel';\nexport { VizPanelMenu } from './components/VizPanel/VizPanelMenu';\nexport { VizPanelExploreButton } from './components/VizPanel/VizPanelExploreButton';\nexport { NestedScene } from './components/NestedScene';\nexport { SceneCanvasText } from './components/SceneCanvasText';\nexport { SceneToolbarButton, SceneToolbarInput } from './components/SceneToolbarButton';\nexport { SceneTimePicker } from './components/SceneTimePicker';\nexport { SceneRefreshPicker, type SceneRefreshPickerState } from './components/SceneRefreshPicker';\nexport { SceneTimeRangeTransformerBase } from './core/SceneTimeRangeTransformerBase';\nexport { SceneTimeRangeCompare } from './components/SceneTimeRangeCompare';\nexport { SceneByFrameRepeater } from './components/SceneByFrameRepeater';\nexport { SceneByVariableRepeater } from './components/SceneByVariableRepeater';\nexport { SceneControlsSpacer } from './components/SceneControlsSpacer';\nexport {\n SceneFlexLayout,\n SceneFlexItem,\n type SceneFlexItemState,\n type SceneFlexItemLike,\n} from './components/layout/SceneFlexLayout';\nexport { SceneCSSGridLayout, SceneCSSGridItem } from './components/layout/CSSGrid/SceneCSSGridLayout';\nexport { SceneGridLayout } from './components/layout/grid/SceneGridLayout';\nexport { SceneGridLayoutDragStartEvent } from './components/layout/grid/types';\nexport { SceneGridItem } from './components/layout/grid/SceneGridItem';\nexport { SceneGridRow } from './components/layout/grid/SceneGridRow';\nexport { type SceneGridItemStateLike, type SceneGridItemLike } from './components/layout/grid/types';\nexport { SplitLayout } from './components/layout/split/SplitLayout';\nexport { LazyLoader } from './components/layout/LazyLoader';\nexport {\n type SceneAppPageLike,\n type SceneRouteMatch,\n type SceneAppPageState,\n type SceneAppDrilldownView,\n type SceneAppRoute,\n} from './components/SceneApp/types';\nexport { SceneApp, useSceneApp } from './components/SceneApp/SceneApp';\nexport { SceneAppPage } from './components/SceneApp/SceneAppPage';\nexport { SceneReactObject } from './components/SceneReactObject';\nexport { SceneObjectRef } from './core/SceneObjectRef';\nexport {\n PanelBuilders,\n PanelOptionsBuilders,\n FieldConfigBuilders,\n FieldConfigOverridesBuilder,\n} from './core/PanelBuilders';\nexport { FieldConfigBuilder } from './core/PanelBuilders/FieldConfigBuilder';\nexport { VizPanelBuilder } from './core/PanelBuilders/VizPanelBuilder';\nexport { SceneDebugger } from './components/SceneDebugger/SceneDebugger';\nexport { VariableValueSelectWrapper } from './variables/components/VariableValueSelectors';\nexport { ControlsLabel } from './utils/ControlsLabel';\nexport { MultiOrSingleValueSelect } from './variables/components/VariableValueSelect';\nexport { VizConfigBuilder } from './core/PanelBuilders/VizConfigBuilder';\nexport { VizConfigBuilders } from './core/PanelBuilders/VizConfigBuilders';\nexport { type VizConfig } from './core/PanelBuilders/types';\nexport { SceneScopesBridge } from './core/SceneScopesBridge';\n\nexport const sceneUtils = {\n getUrlWithAppState,\n registerRuntimePanelPlugin,\n registerRuntimeDataSource,\n registerVariableMacro,\n cloneSceneObjectState,\n syncStateFromSearchParams,\n getUrlState,\n renderPrometheusLabelFilters,\n escapeLabelValueInRegexSelector,\n escapeLabelValueInExactSelector,\n escapeURLDelimiters,\n\n // Variable guards\n isAdHocVariable,\n isConstantVariable,\n isCustomVariable,\n isDataSourceVariable,\n isIntervalVariable,\n isQueryVariable,\n isTextBoxVariable,\n isGroupByVariable,\n};\n\nexport { SafeSerializableSceneObject } from './utils/SafeSerializableSceneObject';\nexport { getExploreURL } from './utils/explore';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4IO,MAAM,UAAa,GAAA;AAAA,EACxB,kBAAA;AAAA,EACA,0BAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,yBAAA;AAAA,EACA,WAAA;AAAA,EACA,4BAAA;AAAA,EACA,+BAAA;AAAA,EACA,+BAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EAGA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,kBAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF;;;;"}
|
@@ -38,8 +38,7 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
38
38
|
this._variableDependency = new VariableDependencyConfig(this, {
|
39
39
|
statePaths: ["queries", "datasource", "minInterval"],
|
40
40
|
onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this),
|
41
|
-
onAnyVariableChanged: this.onAnyVariableChanged.bind(this)
|
42
|
-
dependsOnScopes: true
|
41
|
+
onAnyVariableChanged: this.onAnyVariableChanged.bind(this)
|
43
42
|
});
|
44
43
|
this.onDataReceived = (data) => {
|
45
44
|
const preProcessedData = preProcessPanelData(data, this.state.data);
|
@@ -60,6 +59,7 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
60
59
|
_onActivate() {
|
61
60
|
if (this.isQueryModeAuto()) {
|
62
61
|
const timeRange = sceneGraph.getTimeRange(this);
|
62
|
+
const scopesBridge = sceneGraph.getScopesBridge(this);
|
63
63
|
const providers = this.getClosestExtraQueryProviders();
|
64
64
|
for (const provider of providers) {
|
65
65
|
this._subs.add(
|
@@ -70,6 +70,7 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
70
70
|
})
|
71
71
|
);
|
72
72
|
}
|
73
|
+
this.subscribeToScopesChanges(scopesBridge);
|
73
74
|
this.subscribeToTimeRangeChanges(timeRange);
|
74
75
|
if (this.shouldRunQueriesOnActivate()) {
|
75
76
|
this.runQueries();
|
@@ -233,6 +234,21 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
233
234
|
isDataReadyToDisplay() {
|
234
235
|
return Boolean(this.state._hasFetchedData);
|
235
236
|
}
|
237
|
+
subscribeToScopesChanges(scopesBridge) {
|
238
|
+
if (!scopesBridge) {
|
239
|
+
return;
|
240
|
+
}
|
241
|
+
if (this._scopesSubBridge === scopesBridge) {
|
242
|
+
return;
|
243
|
+
}
|
244
|
+
if (this._scopesSub) {
|
245
|
+
this._scopesSub.unsubscribe();
|
246
|
+
}
|
247
|
+
this._scopesSubBridge = scopesBridge;
|
248
|
+
this._scopesSub = scopesBridge.subscribeToValue(() => {
|
249
|
+
this.runWithTimeRangeAndScopes(sceneGraph.getTimeRange(this), scopesBridge);
|
250
|
+
});
|
251
|
+
}
|
236
252
|
subscribeToTimeRangeChanges(timeRange) {
|
237
253
|
if (this._timeSubRange === timeRange) {
|
238
254
|
return;
|
@@ -242,15 +258,17 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
242
258
|
}
|
243
259
|
this._timeSubRange = timeRange;
|
244
260
|
this._timeSub = timeRange.subscribeToState(() => {
|
245
|
-
this.
|
261
|
+
this.runWithTimeRangeAndScopes(timeRange, sceneGraph.getScopesBridge(this));
|
246
262
|
});
|
247
263
|
}
|
248
264
|
runQueries() {
|
249
265
|
const timeRange = sceneGraph.getTimeRange(this);
|
266
|
+
const scopesBridge = sceneGraph.getScopesBridge(this);
|
250
267
|
if (this.isQueryModeAuto()) {
|
251
268
|
this.subscribeToTimeRangeChanges(timeRange);
|
269
|
+
this.subscribeToScopesChanges(scopesBridge);
|
252
270
|
}
|
253
|
-
this.
|
271
|
+
this.runWithTimeRangeAndScopes(timeRange, scopesBridge);
|
254
272
|
}
|
255
273
|
getMaxDataPoints() {
|
256
274
|
var _a;
|
@@ -270,8 +288,8 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
270
288
|
data: { ...this.state.data, state: LoadingState.Done }
|
271
289
|
});
|
272
290
|
}
|
273
|
-
async
|
274
|
-
var _a, _b, _c;
|
291
|
+
async runWithTimeRangeAndScopes(timeRange, scopesBridge) {
|
292
|
+
var _a, _b, _c, _d;
|
275
293
|
if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {
|
276
294
|
return;
|
277
295
|
}
|
@@ -284,17 +302,22 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
284
302
|
this.setState({ data: { ...(_b = this.state.data) != null ? _b : emptyPanelData, state: LoadingState.Loading } });
|
285
303
|
return;
|
286
304
|
}
|
305
|
+
if ((scopesBridge == null ? void 0 : scopesBridge.isLoading()) && (scopesBridge == null ? void 0 : scopesBridge.getValue().length)) {
|
306
|
+
writeSceneLog("SceneQueryRunner", "Scopes are in loading state, skipping query execution");
|
307
|
+
this.setState({ data: { ...(_c = this.state.data) != null ? _c : emptyPanelData, state: LoadingState.Loading } });
|
308
|
+
return;
|
309
|
+
}
|
287
310
|
const { queries } = this.state;
|
288
311
|
if (!(queries == null ? void 0 : queries.length)) {
|
289
312
|
this._setNoDataState();
|
290
313
|
return;
|
291
314
|
}
|
292
315
|
try {
|
293
|
-
const datasource = (
|
316
|
+
const datasource = (_d = this.state.datasource) != null ? _d : findFirstDatasource(queries);
|
294
317
|
const ds = await getDataSource(datasource, this._scopedVars);
|
295
318
|
this.findAndSubscribeToAdHocFilters(ds.uid);
|
296
319
|
const runRequest = getRunRequest();
|
297
|
-
const { primary, secondaries, processors } = this.prepareRequests(timeRange, ds);
|
320
|
+
const { primary, secondaries, processors } = this.prepareRequests(timeRange, ds, scopesBridge);
|
298
321
|
writeSceneLog("SceneQueryRunner", "Starting runRequest", this.state.key);
|
299
322
|
let stream = runRequest(ds, primary);
|
300
323
|
if (secondaries.length > 0) {
|
@@ -335,7 +358,7 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
335
358
|
clone["_results"].next({ origin: this, data: (_a = this.state.data) != null ? _a : emptyPanelData });
|
336
359
|
return clone;
|
337
360
|
}
|
338
|
-
prepareRequests(timeRange, ds) {
|
361
|
+
prepareRequests(timeRange, ds, scopesBridge) {
|
339
362
|
var _a, _b;
|
340
363
|
const { minInterval, queries } = this.state;
|
341
364
|
let request = {
|
@@ -356,7 +379,7 @@ class SceneQueryRunner extends SceneObjectBase {
|
|
356
379
|
},
|
357
380
|
cacheTimeout: this.state.cacheTimeout,
|
358
381
|
queryCachingTTL: this.state.queryCachingTTL,
|
359
|
-
scopes:
|
382
|
+
scopes: scopesBridge == null ? void 0 : scopesBridge.getValue(),
|
360
383
|
// This asks the scene root to provide context properties like app, panel and dashboardUID
|
361
384
|
...getEnrichedDataRequest(this)
|
362
385
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep, isEqual } from 'lodash';\nimport { forkJoin, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n AlertStateInfo,\n DataFrame,\n DataFrameView,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n} from '@grafana/data';\n\n// TODO: Remove this ignore annotation when the grafana runtime dependency has been updated\n// @ts-ignore\nimport { getRunRequest, toDataQueryError, isExpressionReference, config } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneDataQuery,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { isExtraQueryProvider, ExtraQueryDataProcessor, ExtraQueryProvider } from './ExtraQueryProvider';\nimport { passthroughProcessor, extraQueryProcessingOperator } from './extraQueryProcessingOperator';\nimport { filterAnnotations } from './layers/annotations/filterAnnotations';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\nimport { findActiveAdHocFilterVariableByUid } from '../variables/adhoc/patchGetAdhocFilters';\nimport { registerQueryWithController } from './registerQueryWithController';\nimport { findActiveGroupByVariablesByUid } from '../variables/groupby/findActiveGroupByVariablesByUid';\nimport { GroupByVariable } from '../variables/groupby/GroupByVariable';\nimport { AdHocFiltersVariable, isFilterComplete } from '../variables/adhoc/AdHocFiltersVariable';\nimport { SceneVariable } from '../variables/types';\nimport { DataLayersMerger } from './DataLayersMerger';\nimport { interpolate } from '../core/sceneGraph/sceneGraph';\nimport { wrapInSafeSerializableSceneObject } from '../utils/wrapInSafeSerializableSceneObject';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'SQR' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: SceneDataQuery[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n cacheTimeout?: DataQueryRequest['cacheTimeout'];\n queryCachingTTL?: DataQueryRequest['queryCachingTTL'];\n /**\n * When set to auto (the default) query runner will issue queries on activate (when variable dependencies are ready) or when time range change.\n * Set to manual to have full manual control over when queries are issued. Try not to set this. This is mainly useful for unit tests, or special edge case workflows.\n */\n runQueriesMode?: 'auto' | 'manual';\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n // Private runtime state\n _hasFetchedData?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n\n// The requests that will be run by the query runner.\n//\n// Generally the query runner will run a single primary request.\n// If the scene graph contains implementations of\n// `ExtraQueryProvider`, the requests created by these\n// implementations will be added to the list of secondary requests,\n// and these will be executed at the same time as the primary request.\n//\n// The results of each secondary request will be passed to an associated\n// processor function (along with the results of the primary request),\n// which can transform the results as desired.\ninterface PreparedRequests {\n // The primary request to run.\n primary: DataQueryRequest;\n // A possibly empty list of secondary requests to run alongside\n // the primary request.\n secondaries: DataQueryRequest[];\n // A map from `requestId` of secondary requests to processors\n // for those requests. Provided by the `ExtraQueryProvider`.\n processors: Map<string, ExtraQueryDataProcessor>;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _dataLayersMerger = new DataLayersMerger();\n private _timeSub?: Unsubscribable;\n private _timeSubRange?: SceneTimeRangeLike;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>(1);\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _layerAnnotations?: DataFrame[];\n private _resultAnnotations?: DataFrame[];\n\n private _adhocFiltersVar?: AdHocFiltersVariable;\n private _groupByVar?: GroupByVariable;\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource', 'minInterval'],\n onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this),\n onAnyVariableChanged: this.onAnyVariableChanged.bind(this),\n dependsOnScopes: true,\n });\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n if (this.isQueryModeAuto()) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n // Add subscriptions to any extra providers so that they rerun queries\n // when their state changes and they should rerun.\n const providers = this.getClosestExtraQueryProviders();\n for (const provider of providers) {\n this._subs.add(\n provider.subscribeToState((n, p) => {\n if (provider.shouldRerun(p, n, this.state.queries)) {\n this.runQueries();\n }\n })\n );\n }\n\n this.subscribeToTimeRangeChanges(timeRange);\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n }\n\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n return () => this._onDeactivate();\n }\n\n // This method subscribes to all SceneDataLayers up until the root, and combines the results into data provided from SceneQueryRunner\n private _handleDataLayers() {\n const dataLayers = sceneGraph.getDataLayers(this);\n\n if (dataLayers.length === 0) {\n return;\n }\n\n this._dataLayersSub = this._dataLayersMerger\n .getMergedStream(dataLayers)\n .subscribe(this._onLayersReceived.bind(this));\n }\n\n private _onLayersReceived(results: Iterable<SceneDataProviderResult>) {\n const timeRange = sceneGraph.getTimeRange(this);\n const { dataLayerFilter } = this.state;\n\n let annotations: DataFrame[] = [];\n let alertStates: DataFrame[] = [];\n let alertState: AlertStateInfo | undefined;\n\n for (const result of results) {\n for (let frame of result.data.series) {\n if (frame.meta?.dataTopic === DataTopic.Annotations) {\n annotations = annotations.concat(frame);\n }\n if (frame.meta?.dataTopic === DataTopic.AlertStates) {\n alertStates = alertStates.concat(frame);\n }\n }\n }\n\n if (dataLayerFilter?.panelId) {\n if (annotations.length > 0) {\n annotations = filterAnnotations(annotations, dataLayerFilter);\n }\n\n if (alertStates.length > 0) {\n for (const frame of alertStates) {\n const frameView = new DataFrameView<AlertStateInfo>(frame);\n\n for (const row of frameView) {\n if (row.panelId === dataLayerFilter.panelId) {\n alertState = row;\n break;\n }\n }\n }\n }\n }\n\n // Skip unnessary state updates\n if (\n allFramesEmpty(annotations) &&\n allFramesEmpty(this._layerAnnotations) &&\n isEqual(alertState, this.state.data?.alertState)\n ) {\n return;\n }\n\n this._layerAnnotations = annotations;\n\n const baseStateUpdate = this.state.data ? this.state.data : { ...emptyPanelData, timeRange: timeRange.state.value };\n\n this.setState({\n data: {\n ...baseStateUpdate,\n annotations: [...(this._resultAnnotations ?? []), ...annotations],\n alertState: alertState ?? this.state.data?.alertState,\n },\n });\n }\n\n /**\n * This tries to start a new query whenever a variable completes or is changed.\n *\n * We care about variable update completions even when the variable has not changed and even when it is not a direct dependency.\n * Example: Variables A and B (B depends on A). A update depends on time range. So when time change query runner will\n * find that variable A is loading which is a dependency on of variable B so will set _isWaitingForVariables to true and\n * not issue any query.\n *\n * When A completes it's loading (with no value change, so B never updates) it will cause a call of this function letting\n * the query runner know that A has completed, and in case _isWaitingForVariables we try to run the query. The query will\n * only run if all variables are in a non loading state so in other scenarios where a query depends on many variables this will\n * be called many times until all dependencies are in a non loading state. *\n */\n private onVariableUpdatesCompleted() {\n if (this.isQueryModeAuto()) {\n this.runQueries();\n }\n }\n\n /**\n * Check if value changed is a adhoc filter o group by variable that did not exist when we issued the last query\n */\n private onAnyVariableChanged(variable: SceneVariable) {\n // If this variable has already been detected this variable as a dependency onVariableUpdatesCompleted above will handle value changes\n if (this._adhocFiltersVar === variable || this._groupByVar === variable || !this.isQueryModeAuto()) {\n return;\n }\n\n if (variable instanceof AdHocFiltersVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n\n if (variable instanceof GroupByVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n }\n\n private _isRelevantAutoVariable(variable: AdHocFiltersVariable | GroupByVariable) {\n const datasource = this.state.datasource ?? findFirstDatasource(this.state.queries);\n return variable.state.applyMode === 'auto' && datasource?.uid === variable.state.datasource?.uid;\n }\n\n private shouldRunQueriesOnActivate() {\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneQueryRunner',\n 'Variable dependency changed while inactive, shouldRunQueriesOnActivate returns true'\n );\n return true;\n }\n\n // If we don't have any data we should run queries\n if (!this.state.data) {\n return true;\n }\n\n // If time range is stale / different we should run queries\n if (this._isDataTimeRangeStale(this.state.data)) {\n return true;\n }\n\n return false;\n }\n\n private _isDataTimeRangeStale(data: PanelData) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n const stateTimeRange = timeRange.state.value;\n const dataTimeRange = data.timeRange;\n\n if (\n stateTimeRange.from.unix() === dataTimeRange.from.unix() &&\n stateTimeRange.to.unix() === dataTimeRange.to.unix()\n ) {\n return false;\n }\n writeSceneLog('SceneQueryRunner', 'Data time range is stale');\n return true;\n }\n\n private _onDeactivate(): void {\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this._timeSub?.unsubscribe();\n this._timeSub = undefined;\n this._timeSubRange = undefined;\n this._adhocFiltersVar = undefined;\n this._groupByVar = undefined;\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this.state._hasFetchedData) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // if the updated container width is bigger than 0 let's remember the width until next query issue\n if (width > 0) {\n this._containerWidth = width;\n }\n }\n }\n\n public isDataReadyToDisplay() {\n return Boolean(this.state._hasFetchedData);\n }\n\n private subscribeToTimeRangeChanges(timeRange: SceneTimeRangeLike) {\n if (this._timeSubRange === timeRange) {\n // Nothing to do, already subscribed\n return;\n }\n\n if (this._timeSub) {\n this._timeSub.unsubscribe();\n }\n\n this._timeSubRange = timeRange;\n this._timeSub = timeRange.subscribeToState(() => {\n this.runWithTimeRange(timeRange);\n });\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this.isQueryModeAuto()) {\n this.subscribeToTimeRangeChanges(timeRange);\n }\n\n this.runWithTimeRange(timeRange);\n }\n\n private getMaxDataPoints() {\n if (this.state.maxDataPoints) {\n return this.state.maxDataPoints;\n }\n\n return this.state.maxDataPointsFromWidth ? this._containerWidth ?? 500 : 500;\n }\n\n public cancelQuery() {\n this._querySub?.unsubscribe();\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this.setState({\n data: { ...this.state.data!, state: LoadingState.Done },\n });\n }\n\n private async runWithTimeRange(timeRange: SceneTimeRangeLike) {\n // If no maxDataPoints specified we might need to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return;\n }\n\n // If data layers subscription doesn't exist, create one\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (this._variableDependency.hasDependencyInLoadingState()) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ data: { ...(this.state.data ?? emptyPanelData), state: LoadingState.Loading } });\n return;\n }\n\n const { queries } = this.state;\n\n // Simple path when no queries exist\n if (!queries?.length) {\n this._setNoDataState();\n return;\n }\n\n try {\n const datasource = this.state.datasource ?? findFirstDatasource(queries);\n const ds = await getDataSource(datasource, this._scopedVars);\n\n this.findAndSubscribeToAdHocFilters(ds.uid);\n\n const runRequest = getRunRequest();\n const { primary, secondaries, processors } = this.prepareRequests(timeRange, ds);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n let stream = runRequest(ds, primary);\n\n if (secondaries.length > 0) {\n // Submit all secondary requests in parallel.\n const secondaryStreams = secondaries.map((r) => runRequest(ds, r));\n // Create the rxjs operator which will combine the primary and secondary responses\n // by calling the correct processor functions provided by the\n // extra request providers.\n const op = extraQueryProcessingOperator(processors);\n // Combine the primary and secondary streams into a single stream, and apply the operator.\n stream = forkJoin([stream, ...secondaryStreams]).pipe(op);\n }\n\n stream = stream.pipe(\n registerQueryWithController({\n type: 'data',\n request: primary,\n origin: this,\n cancel: () => this.cancelQuery(),\n })\n );\n\n this._querySub = stream.subscribe(this.onDataReceived);\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n this.onDataReceived({\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n });\n }\n }\n\n public clone(withState?: Partial<QueryRunnerState>) {\n const clone = super.clone(withState);\n\n if (this._resultAnnotations) {\n clone['_resultAnnotations'] = this._resultAnnotations.map((frame) => ({ ...frame }));\n }\n\n if (this._layerAnnotations) {\n clone['_layerAnnotations'] = this._layerAnnotations.map((frame) => ({ ...frame }));\n }\n\n clone['_variableValueRecorder'] = this._variableValueRecorder.cloneAndRecordCurrentValuesForSceneObject(this);\n clone['_containerWidth'] = this._containerWidth;\n clone['_results'].next({ origin: this, data: this.state.data ?? emptyPanelData });\n\n return clone;\n }\n\n private prepareRequests(timeRange: SceneTimeRangeLike, ds: DataSourceApi): PreparedRequests {\n const { minInterval, queries } = this.state;\n\n let request: DataQueryRequest<DataQueryExtended> = {\n app: 'scenes',\n requestId: getNextRequestId(),\n timezone: timeRange.getTimeZone(),\n range: timeRange.state.value,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: this._scopedVars,\n startTime: Date.now(),\n liveStreaming: this.state.liveStreaming,\n rangeRaw: {\n from: timeRange.state.from,\n to: timeRange.state.to,\n },\n cacheTimeout: this.state.cacheTimeout,\n queryCachingTTL: this.state.queryCachingTTL,\n scopes: sceneGraph.getScopes(this),\n // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n if (this._adhocFiltersVar) {\n request.filters = [];\n\n if (this._adhocFiltersVar.state.baseFilters?.length) {\n const injectedBaseFilters = this._adhocFiltersVar.state.baseFilters.filter((filter) => filter.origin);\n request.filters = request.filters.concat(injectedBaseFilters);\n }\n\n // only pass filters that have both key and value\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.filters = request.filters.concat(this._adhocFiltersVar.state.filters.filter(isFilterComplete));\n }\n\n if (this._groupByVar) {\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.groupByKeys = this._groupByVar.state.value;\n }\n\n request.targets = request.targets.map((query) => {\n if (\n !query.datasource ||\n (query.datasource.uid !== ds.uid &&\n !ds.meta?.mixed &&\n isExpressionReference /* TODO: Remove this check when isExpressionReference is properly exported from grafan runtime */ &&\n !isExpressionReference(query.datasource))\n ) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n const lowerIntervalLimit = minInterval ? interpolate(this, minInterval) : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n // If there are any extra request providers, we need to add a new request for each\n // and map the request's ID to the processor function given by the provider, to ensure that\n // the processor is called with the correct response data.\n const primaryTimeRange = timeRange.state.value;\n let secondaryRequests: DataQueryRequest[] = [];\n let secondaryProcessors = new Map();\n for (const provider of this.getClosestExtraQueryProviders() ?? []) {\n for (const { req, processor } of provider.getExtraQueries(request)) {\n const requestId = getNextRequestId();\n secondaryRequests.push({ ...req, requestId });\n secondaryProcessors.set(requestId, processor ?? passthroughProcessor);\n }\n }\n request.range = primaryTimeRange;\n return { primary: request, secondaries: secondaryRequests, processors: secondaryProcessors };\n }\n\n private onDataReceived = (data: PanelData) => {\n // Will combine annotations from SQR queries (frames with meta.dataTopic === DataTopic.Annotations)\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n // Save query annotations\n this._resultAnnotations = data.annotations;\n\n // Will combine annotations & alert state from data layer providers\n const dataWithLayersApplied = this._combineDataLayers(preProcessedData);\n\n let hasFetchedData = this.state._hasFetchedData;\n\n if (!hasFetchedData && preProcessedData.state !== LoadingState.Loading) {\n hasFetchedData = true;\n }\n\n this.setState({ data: dataWithLayersApplied, _hasFetchedData: hasFetchedData });\n this._results.next({ origin: this, data: dataWithLayersApplied });\n };\n\n private _combineDataLayers(data: PanelData) {\n if (this._layerAnnotations && this._layerAnnotations.length > 0) {\n data.annotations = (data.annotations || []).concat(this._layerAnnotations);\n }\n\n if (this.state.data && this.state.data.alertState) {\n data.alertState = this.state.data.alertState;\n }\n\n return data;\n }\n\n private _setNoDataState() {\n if (this.state.data !== emptyPanelData) {\n this.setState({ data: emptyPanelData });\n }\n }\n\n /**\n * Walk up the scene graph and find any ExtraQueryProviders.\n *\n * This will return an array of the closest provider of each type.\n */\n private getClosestExtraQueryProviders(): Array<ExtraQueryProvider<any>> {\n // Maintain a map from provider constructor to provider object. The constructor\n // is used as a unique key for each class, to ensure we have no more than one\n // type of each type of provider.\n const found = new Map();\n if (!this.parent) {\n return [];\n }\n getClosest(this.parent, (s) => {\n if (isExtraQueryProvider(s) && !found.has(s.constructor)) {\n found.set(s.constructor, s);\n }\n s.forEachChild((child) => {\n if (isExtraQueryProvider(child) && !found.has(child.constructor)) {\n found.set(child.constructor, child);\n }\n });\n // Always return null so that the search continues to the top of\n // the scene graph.\n return null;\n });\n return Array.from(found.values());\n }\n\n /**\n * Walk up scene graph and find the closest filterset with matching data source\n */\n private findAndSubscribeToAdHocFilters(interpolatedUid: string | undefined) {\n const filtersVar = findActiveAdHocFilterVariableByUid(interpolatedUid);\n\n if (this._adhocFiltersVar !== filtersVar) {\n this._adhocFiltersVar = filtersVar;\n this._updateExplicitVariableDependencies();\n }\n\n const groupByVar = findActiveGroupByVariablesByUid(interpolatedUid);\n if (this._groupByVar !== groupByVar) {\n this._groupByVar = groupByVar;\n this._updateExplicitVariableDependencies();\n }\n }\n\n private _updateExplicitVariableDependencies() {\n const explicitDependencies: string[] = [];\n\n if (this._adhocFiltersVar) {\n explicitDependencies.push(this._adhocFiltersVar.state.name);\n }\n\n if (this._groupByVar) {\n explicitDependencies.push(this._groupByVar.state.name);\n }\n\n this._variableDependency.setVariableNames(explicitDependencies);\n }\n\n private isQueryModeAuto(): boolean {\n return (this.state.runQueriesMode ?? 'auto') === 'auto';\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n\nfunction allFramesEmpty(frames?: DataFrame[]) {\n if (!frames) {\n return true;\n }\n\n for (let i = 0; i < frames.length; i++) {\n if (frames[i].length > 0) {\n return false;\n }\n }\n\n return true;\n}\n"],"names":["_a"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep, isEqual } from 'lodash';\nimport { forkJoin, ReplaySubject, Unsubscribable } from 'rxjs';\n\nimport { DataQuery, DataSourceRef, LoadingState } from '@grafana/schema';\n\nimport {\n AlertStateInfo,\n DataFrame,\n DataFrameView,\n DataQueryRequest,\n DataSourceApi,\n DataTopic,\n PanelData,\n preProcessPanelData,\n rangeUtil,\n} from '@grafana/data';\n\n// TODO: Remove this ignore annotation when the grafana runtime dependency has been updated\n// @ts-ignore\nimport { getRunRequest, toDataQueryError, isExpressionReference, config } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n DataLayerFilter,\n SceneDataProvider,\n SceneDataProviderResult,\n SceneDataQuery,\n SceneObjectState,\n SceneTimeRangeLike,\n} from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VariableValueRecorder } from '../variables/VariableValueRecorder';\nimport { emptyPanelData } from '../core/SceneDataNode';\nimport { getClosest } from '../core/sceneGraph/utils';\nimport { isExtraQueryProvider, ExtraQueryDataProcessor, ExtraQueryProvider } from './ExtraQueryProvider';\nimport { passthroughProcessor, extraQueryProcessingOperator } from './extraQueryProcessingOperator';\nimport { filterAnnotations } from './layers/annotations/filterAnnotations';\nimport { getEnrichedDataRequest } from './getEnrichedDataRequest';\nimport { findActiveAdHocFilterVariableByUid } from '../variables/adhoc/patchGetAdhocFilters';\nimport { registerQueryWithController } from './registerQueryWithController';\nimport { findActiveGroupByVariablesByUid } from '../variables/groupby/findActiveGroupByVariablesByUid';\nimport { GroupByVariable } from '../variables/groupby/GroupByVariable';\nimport { AdHocFiltersVariable, isFilterComplete } from '../variables/adhoc/AdHocFiltersVariable';\nimport { SceneVariable } from '../variables/types';\nimport { DataLayersMerger } from './DataLayersMerger';\nimport { interpolate } from '../core/sceneGraph/sceneGraph';\nimport { wrapInSafeSerializableSceneObject } from '../utils/wrapInSafeSerializableSceneObject';\nimport { SceneScopesBridge } from '../core/SceneScopesBridge';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'SQR' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectState {\n data?: PanelData;\n queries: SceneDataQuery[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n liveStreaming?: boolean;\n maxDataPointsFromWidth?: boolean;\n cacheTimeout?: DataQueryRequest['cacheTimeout'];\n queryCachingTTL?: DataQueryRequest['queryCachingTTL'];\n /**\n * When set to auto (the default) query runner will issue queries on activate (when variable dependencies are ready) or when time range change.\n * Set to manual to have full manual control over when queries are issued. Try not to set this. This is mainly useful for unit tests, or special edge case workflows.\n */\n runQueriesMode?: 'auto' | 'manual';\n // Filters to be applied to data layer results before combining them with SQR results\n dataLayerFilter?: DataLayerFilter;\n // Private runtime state\n _hasFetchedData?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n\n // Opt this query out of time window comparison\n timeRangeCompare?: boolean;\n}\n\n// The requests that will be run by the query runner.\n//\n// Generally the query runner will run a single primary request.\n// If the scene graph contains implementations of\n// `ExtraQueryProvider`, the requests created by these\n// implementations will be added to the list of secondary requests,\n// and these will be executed at the same time as the primary request.\n//\n// The results of each secondary request will be passed to an associated\n// processor function (along with the results of the primary request),\n// which can transform the results as desired.\ninterface PreparedRequests {\n // The primary request to run.\n primary: DataQueryRequest;\n // A possibly empty list of secondary requests to run alongside\n // the primary request.\n secondaries: DataQueryRequest[];\n // A map from `requestId` of secondary requests to processors\n // for those requests. Provided by the `ExtraQueryProvider`.\n processors: Map<string, ExtraQueryDataProcessor>;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> implements SceneDataProvider {\n private _querySub?: Unsubscribable;\n private _dataLayersSub?: Unsubscribable;\n private _dataLayersMerger = new DataLayersMerger();\n private _timeSub?: Unsubscribable;\n private _timeSubRange?: SceneTimeRangeLike;\n private _scopesSub?: Unsubscribable;\n private _scopesSubBridge?: SceneScopesBridge;\n private _containerWidth?: number;\n private _variableValueRecorder = new VariableValueRecorder();\n private _results = new ReplaySubject<SceneDataProviderResult>(1);\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _layerAnnotations?: DataFrame[];\n private _resultAnnotations?: DataFrame[];\n\n private _adhocFiltersVar?: AdHocFiltersVariable;\n private _groupByVar?: GroupByVariable;\n\n public getResultsStream() {\n return this._results;\n }\n\n protected _variableDependency: VariableDependencyConfig<QueryRunnerState> = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource', 'minInterval'],\n onVariableUpdateCompleted: this.onVariableUpdatesCompleted.bind(this),\n onAnyVariableChanged: this.onAnyVariableChanged.bind(this),\n });\n\n public constructor(initialState: QueryRunnerState) {\n super(initialState);\n\n this.addActivationHandler(() => this._onActivate());\n }\n\n private _onActivate() {\n if (this.isQueryModeAuto()) {\n const timeRange = sceneGraph.getTimeRange(this);\n const scopesBridge = sceneGraph.getScopesBridge(this);\n\n // Add subscriptions to any extra providers so that they rerun queries\n // when their state changes and they should rerun.\n const providers = this.getClosestExtraQueryProviders();\n for (const provider of providers) {\n this._subs.add(\n provider.subscribeToState((n, p) => {\n if (provider.shouldRerun(p, n, this.state.queries)) {\n this.runQueries();\n }\n })\n );\n }\n\n this.subscribeToScopesChanges(scopesBridge);\n\n this.subscribeToTimeRangeChanges(timeRange);\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n }\n\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n return () => this._onDeactivate();\n }\n\n // This method subscribes to all SceneDataLayers up until the root, and combines the results into data provided from SceneQueryRunner\n private _handleDataLayers() {\n const dataLayers = sceneGraph.getDataLayers(this);\n\n if (dataLayers.length === 0) {\n return;\n }\n\n this._dataLayersSub = this._dataLayersMerger\n .getMergedStream(dataLayers)\n .subscribe(this._onLayersReceived.bind(this));\n }\n\n private _onLayersReceived(results: Iterable<SceneDataProviderResult>) {\n const timeRange = sceneGraph.getTimeRange(this);\n const { dataLayerFilter } = this.state;\n\n let annotations: DataFrame[] = [];\n let alertStates: DataFrame[] = [];\n let alertState: AlertStateInfo | undefined;\n\n for (const result of results) {\n for (let frame of result.data.series) {\n if (frame.meta?.dataTopic === DataTopic.Annotations) {\n annotations = annotations.concat(frame);\n }\n if (frame.meta?.dataTopic === DataTopic.AlertStates) {\n alertStates = alertStates.concat(frame);\n }\n }\n }\n\n if (dataLayerFilter?.panelId) {\n if (annotations.length > 0) {\n annotations = filterAnnotations(annotations, dataLayerFilter);\n }\n\n if (alertStates.length > 0) {\n for (const frame of alertStates) {\n const frameView = new DataFrameView<AlertStateInfo>(frame);\n\n for (const row of frameView) {\n if (row.panelId === dataLayerFilter.panelId) {\n alertState = row;\n break;\n }\n }\n }\n }\n }\n\n // Skip unnessary state updates\n if (\n allFramesEmpty(annotations) &&\n allFramesEmpty(this._layerAnnotations) &&\n isEqual(alertState, this.state.data?.alertState)\n ) {\n return;\n }\n\n this._layerAnnotations = annotations;\n\n const baseStateUpdate = this.state.data ? this.state.data : { ...emptyPanelData, timeRange: timeRange.state.value };\n\n this.setState({\n data: {\n ...baseStateUpdate,\n annotations: [...(this._resultAnnotations ?? []), ...annotations],\n alertState: alertState ?? this.state.data?.alertState,\n },\n });\n }\n\n /**\n * This tries to start a new query whenever a variable completes or is changed.\n *\n * We care about variable update completions even when the variable has not changed and even when it is not a direct dependency.\n * Example: Variables A and B (B depends on A). A update depends on time range. So when time change query runner will\n * find that variable A is loading which is a dependency on of variable B so will set _isWaitingForVariables to true and\n * not issue any query.\n *\n * When A completes it's loading (with no value change, so B never updates) it will cause a call of this function letting\n * the query runner know that A has completed, and in case _isWaitingForVariables we try to run the query. The query will\n * only run if all variables are in a non loading state so in other scenarios where a query depends on many variables this will\n * be called many times until all dependencies are in a non loading state. *\n */\n private onVariableUpdatesCompleted() {\n if (this.isQueryModeAuto()) {\n this.runQueries();\n }\n }\n\n /**\n * Check if value changed is a adhoc filter o group by variable that did not exist when we issued the last query\n */\n private onAnyVariableChanged(variable: SceneVariable) {\n // If this variable has already been detected this variable as a dependency onVariableUpdatesCompleted above will handle value changes\n if (this._adhocFiltersVar === variable || this._groupByVar === variable || !this.isQueryModeAuto()) {\n return;\n }\n\n if (variable instanceof AdHocFiltersVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n\n if (variable instanceof GroupByVariable && this._isRelevantAutoVariable(variable)) {\n this.runQueries();\n }\n }\n\n private _isRelevantAutoVariable(variable: AdHocFiltersVariable | GroupByVariable) {\n const datasource = this.state.datasource ?? findFirstDatasource(this.state.queries);\n return variable.state.applyMode === 'auto' && datasource?.uid === variable.state.datasource?.uid;\n }\n\n private shouldRunQueriesOnActivate() {\n if (this._variableValueRecorder.hasDependenciesChanged(this)) {\n writeSceneLog(\n 'SceneQueryRunner',\n 'Variable dependency changed while inactive, shouldRunQueriesOnActivate returns true'\n );\n return true;\n }\n\n // If we don't have any data we should run queries\n if (!this.state.data) {\n return true;\n }\n\n // If time range is stale / different we should run queries\n if (this._isDataTimeRangeStale(this.state.data)) {\n return true;\n }\n\n return false;\n }\n\n private _isDataTimeRangeStale(data: PanelData) {\n const timeRange = sceneGraph.getTimeRange(this);\n\n const stateTimeRange = timeRange.state.value;\n const dataTimeRange = data.timeRange;\n\n if (\n stateTimeRange.from.unix() === dataTimeRange.from.unix() &&\n stateTimeRange.to.unix() === dataTimeRange.to.unix()\n ) {\n return false;\n }\n writeSceneLog('SceneQueryRunner', 'Data time range is stale');\n return true;\n }\n\n private _onDeactivate(): void {\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this._timeSub?.unsubscribe();\n this._timeSub = undefined;\n this._timeSubRange = undefined;\n this._adhocFiltersVar = undefined;\n this._groupByVar = undefined;\n this._variableValueRecorder.recordCurrentDependencyValuesForSceneObject(this);\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this.state._hasFetchedData) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // if the updated container width is bigger than 0 let's remember the width until next query issue\n if (width > 0) {\n this._containerWidth = width;\n }\n }\n }\n\n public isDataReadyToDisplay() {\n return Boolean(this.state._hasFetchedData);\n }\n\n private subscribeToScopesChanges(scopesBridge: SceneScopesBridge | undefined) {\n if (!scopesBridge) {\n // Nothing to do, there's no scopes bridge\n return;\n }\n\n if (this._scopesSubBridge === scopesBridge) {\n // Nothing to do, already subscribed\n return;\n }\n\n if (this._scopesSub) {\n this._scopesSub.unsubscribe();\n }\n\n this._scopesSubBridge = scopesBridge;\n\n this._scopesSub = scopesBridge.subscribeToValue(() => {\n this.runWithTimeRangeAndScopes(sceneGraph.getTimeRange(this), scopesBridge);\n });\n }\n\n private subscribeToTimeRangeChanges(timeRange: SceneTimeRangeLike) {\n if (this._timeSubRange === timeRange) {\n // Nothing to do, already subscribed\n return;\n }\n\n if (this._timeSub) {\n this._timeSub.unsubscribe();\n }\n\n this._timeSubRange = timeRange;\n this._timeSub = timeRange.subscribeToState(() => {\n this.runWithTimeRangeAndScopes(timeRange, sceneGraph.getScopesBridge(this));\n });\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n const scopesBridge = sceneGraph.getScopesBridge(this);\n if (this.isQueryModeAuto()) {\n this.subscribeToTimeRangeChanges(timeRange);\n this.subscribeToScopesChanges(scopesBridge);\n }\n\n this.runWithTimeRangeAndScopes(timeRange, scopesBridge);\n }\n\n private getMaxDataPoints() {\n if (this.state.maxDataPoints) {\n return this.state.maxDataPoints;\n }\n\n return this.state.maxDataPointsFromWidth ? this._containerWidth ?? 500 : 500;\n }\n\n public cancelQuery() {\n this._querySub?.unsubscribe();\n\n if (this._dataLayersSub) {\n this._dataLayersSub.unsubscribe();\n this._dataLayersSub = undefined;\n }\n\n this.setState({\n data: { ...this.state.data!, state: LoadingState.Done },\n });\n }\n\n private async runWithTimeRangeAndScopes(timeRange: SceneTimeRangeLike, scopesBridge: SceneScopesBridge | undefined) {\n // If no maxDataPoints specified we might need to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return;\n }\n\n // If data layers subscription doesn't exist, create one\n if (!this._dataLayersSub) {\n this._handleDataLayers();\n }\n\n // Cancel any running queries\n this._querySub?.unsubscribe();\n\n // Skip executing queries if variable dependency is in loading state\n if (this._variableDependency.hasDependencyInLoadingState()) {\n writeSceneLog('SceneQueryRunner', 'Variable dependency is in loading state, skipping query execution');\n this.setState({ data: { ...(this.state.data ?? emptyPanelData), state: LoadingState.Loading } });\n return;\n }\n\n // Skip executing queries if scopes are in loading state and there are values, meaning further\n // data will be received after scope filters are loaded\n if (scopesBridge?.isLoading() && scopesBridge?.getValue().length) {\n writeSceneLog('SceneQueryRunner', 'Scopes are in loading state, skipping query execution');\n this.setState({ data: { ...(this.state.data ?? emptyPanelData), state: LoadingState.Loading } });\n return;\n }\n\n const { queries } = this.state;\n\n // Simple path when no queries exist\n if (!queries?.length) {\n this._setNoDataState();\n return;\n }\n\n try {\n const datasource = this.state.datasource ?? findFirstDatasource(queries);\n const ds = await getDataSource(datasource, this._scopedVars);\n\n this.findAndSubscribeToAdHocFilters(ds.uid);\n\n const runRequest = getRunRequest();\n const { primary, secondaries, processors } = this.prepareRequests(timeRange, ds, scopesBridge);\n\n writeSceneLog('SceneQueryRunner', 'Starting runRequest', this.state.key);\n\n let stream = runRequest(ds, primary);\n\n if (secondaries.length > 0) {\n // Submit all secondary requests in parallel.\n const secondaryStreams = secondaries.map((r) => runRequest(ds, r));\n // Create the rxjs operator which will combine the primary and secondary responses\n // by calling the correct processor functions provided by the\n // extra request providers.\n const op = extraQueryProcessingOperator(processors);\n // Combine the primary and secondary streams into a single stream, and apply the operator.\n stream = forkJoin([stream, ...secondaryStreams]).pipe(op);\n }\n\n stream = stream.pipe(\n registerQueryWithController({\n type: 'data',\n request: primary,\n origin: this,\n cancel: () => this.cancelQuery(),\n })\n );\n\n this._querySub = stream.subscribe(this.onDataReceived);\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n\n this.onDataReceived({\n ...emptyPanelData,\n ...this.state.data,\n state: LoadingState.Error,\n errors: [toDataQueryError(err)],\n });\n }\n }\n\n public clone(withState?: Partial<QueryRunnerState>) {\n const clone = super.clone(withState);\n\n if (this._resultAnnotations) {\n clone['_resultAnnotations'] = this._resultAnnotations.map((frame) => ({ ...frame }));\n }\n\n if (this._layerAnnotations) {\n clone['_layerAnnotations'] = this._layerAnnotations.map((frame) => ({ ...frame }));\n }\n\n clone['_variableValueRecorder'] = this._variableValueRecorder.cloneAndRecordCurrentValuesForSceneObject(this);\n clone['_containerWidth'] = this._containerWidth;\n clone['_results'].next({ origin: this, data: this.state.data ?? emptyPanelData });\n\n return clone;\n }\n\n private prepareRequests(\n timeRange: SceneTimeRangeLike,\n ds: DataSourceApi,\n scopesBridge: SceneScopesBridge | undefined\n ): PreparedRequests {\n const { minInterval, queries } = this.state;\n\n let request: DataQueryRequest<DataQueryExtended> = {\n app: 'scenes',\n requestId: getNextRequestId(),\n timezone: timeRange.getTimeZone(),\n range: timeRange.state.value,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: this._scopedVars,\n startTime: Date.now(),\n liveStreaming: this.state.liveStreaming,\n rangeRaw: {\n from: timeRange.state.from,\n to: timeRange.state.to,\n },\n cacheTimeout: this.state.cacheTimeout,\n queryCachingTTL: this.state.queryCachingTTL,\n scopes: scopesBridge?.getValue(),\n // This asks the scene root to provide context properties like app, panel and dashboardUID\n ...getEnrichedDataRequest(this),\n };\n\n if (this._adhocFiltersVar) {\n request.filters = [];\n\n if (this._adhocFiltersVar.state.baseFilters?.length) {\n const injectedBaseFilters = this._adhocFiltersVar.state.baseFilters.filter((filter) => filter.origin);\n request.filters = request.filters.concat(injectedBaseFilters);\n }\n\n // only pass filters that have both key and value\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.filters = request.filters.concat(this._adhocFiltersVar.state.filters.filter(isFilterComplete));\n }\n\n if (this._groupByVar) {\n // @ts-ignore (Temporary ignore until we update @grafana/data)\n request.groupByKeys = this._groupByVar.state.value;\n }\n\n request.targets = request.targets.map((query) => {\n if (\n !query.datasource ||\n (query.datasource.uid !== ds.uid &&\n !ds.meta?.mixed &&\n isExpressionReference /* TODO: Remove this check when isExpressionReference is properly exported from grafan runtime */ &&\n !isExpressionReference(query.datasource))\n ) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n const lowerIntervalLimit = minInterval ? interpolate(this, minInterval) : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange.state.value, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n // If there are any extra request providers, we need to add a new request for each\n // and map the request's ID to the processor function given by the provider, to ensure that\n // the processor is called with the correct response data.\n const primaryTimeRange = timeRange.state.value;\n let secondaryRequests: DataQueryRequest[] = [];\n let secondaryProcessors = new Map();\n for (const provider of this.getClosestExtraQueryProviders() ?? []) {\n for (const { req, processor } of provider.getExtraQueries(request)) {\n const requestId = getNextRequestId();\n secondaryRequests.push({ ...req, requestId });\n secondaryProcessors.set(requestId, processor ?? passthroughProcessor);\n }\n }\n request.range = primaryTimeRange;\n return { primary: request, secondaries: secondaryRequests, processors: secondaryProcessors };\n }\n\n private onDataReceived = (data: PanelData) => {\n // Will combine annotations from SQR queries (frames with meta.dataTopic === DataTopic.Annotations)\n const preProcessedData = preProcessPanelData(data, this.state.data);\n\n // Save query annotations\n this._resultAnnotations = data.annotations;\n\n // Will combine annotations & alert state from data layer providers\n const dataWithLayersApplied = this._combineDataLayers(preProcessedData);\n\n let hasFetchedData = this.state._hasFetchedData;\n\n if (!hasFetchedData && preProcessedData.state !== LoadingState.Loading) {\n hasFetchedData = true;\n }\n\n this.setState({ data: dataWithLayersApplied, _hasFetchedData: hasFetchedData });\n this._results.next({ origin: this, data: dataWithLayersApplied });\n };\n\n private _combineDataLayers(data: PanelData) {\n if (this._layerAnnotations && this._layerAnnotations.length > 0) {\n data.annotations = (data.annotations || []).concat(this._layerAnnotations);\n }\n\n if (this.state.data && this.state.data.alertState) {\n data.alertState = this.state.data.alertState;\n }\n\n return data;\n }\n\n private _setNoDataState() {\n if (this.state.data !== emptyPanelData) {\n this.setState({ data: emptyPanelData });\n }\n }\n\n /**\n * Walk up the scene graph and find any ExtraQueryProviders.\n *\n * This will return an array of the closest provider of each type.\n */\n private getClosestExtraQueryProviders(): Array<ExtraQueryProvider<any>> {\n // Maintain a map from provider constructor to provider object. The constructor\n // is used as a unique key for each class, to ensure we have no more than one\n // type of each type of provider.\n const found = new Map();\n if (!this.parent) {\n return [];\n }\n getClosest(this.parent, (s) => {\n if (isExtraQueryProvider(s) && !found.has(s.constructor)) {\n found.set(s.constructor, s);\n }\n s.forEachChild((child) => {\n if (isExtraQueryProvider(child) && !found.has(child.constructor)) {\n found.set(child.constructor, child);\n }\n });\n // Always return null so that the search continues to the top of\n // the scene graph.\n return null;\n });\n return Array.from(found.values());\n }\n\n /**\n * Walk up scene graph and find the closest filterset with matching data source\n */\n private findAndSubscribeToAdHocFilters(interpolatedUid: string | undefined) {\n const filtersVar = findActiveAdHocFilterVariableByUid(interpolatedUid);\n\n if (this._adhocFiltersVar !== filtersVar) {\n this._adhocFiltersVar = filtersVar;\n this._updateExplicitVariableDependencies();\n }\n\n const groupByVar = findActiveGroupByVariablesByUid(interpolatedUid);\n if (this._groupByVar !== groupByVar) {\n this._groupByVar = groupByVar;\n this._updateExplicitVariableDependencies();\n }\n }\n\n private _updateExplicitVariableDependencies() {\n const explicitDependencies: string[] = [];\n\n if (this._adhocFiltersVar) {\n explicitDependencies.push(this._adhocFiltersVar.state.name);\n }\n\n if (this._groupByVar) {\n explicitDependencies.push(this._groupByVar.state.name);\n }\n\n this._variableDependency.setVariableNames(explicitDependencies);\n }\n\n private isQueryModeAuto(): boolean {\n return (this.state.runQueriesMode ?? 'auto') === 'auto';\n }\n}\n\nexport function findFirstDatasource(targets: DataQuery[]): DataSourceRef | undefined {\n return targets.find((t) => t.datasource !== null)?.datasource ?? undefined;\n}\n\nfunction allFramesEmpty(frames?: DataFrame[]) {\n if (!frames) {\n return true;\n }\n\n for (let i = 0; i < frames.length; i++) {\n if (frames[i].length > 0) {\n return false;\n }\n }\n\n return true;\n}\n"],"names":["_a"],"mappings":"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"}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { DataLinkBuiltInVars } from '@grafana/data';
|
2
2
|
import { sceneGraph } from '../core/sceneGraph/index.js';
|
3
3
|
import { writeSceneLog } from '../utils/writeSceneLog.js';
|
4
|
-
import {
|
4
|
+
import { VARIABLE_REGEX } from './constants.js';
|
5
5
|
import { safeStringifyValue } from './utils.js';
|
6
6
|
import { ConstantVariable } from './variants/ConstantVariable.js';
|
7
7
|
|
@@ -101,9 +101,6 @@ class VariableDependencyConfig {
|
|
101
101
|
this._dependencies.add(name);
|
102
102
|
}
|
103
103
|
}
|
104
|
-
if (this._options.dependsOnScopes) {
|
105
|
-
this._dependencies.add(SCOPES_VARIABLE_NAME);
|
106
|
-
}
|
107
104
|
if (this._statePaths) {
|
108
105
|
for (const path of this._statePaths) {
|
109
106
|
if (path === "*") {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"VariableDependencyConfig.js","sources":["../../../src/variables/VariableDependencyConfig.ts"],"sourcesContent":["import { DataLinkBuiltInVars } from '@grafana/data';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject, SceneObjectState } from '../core/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { SCOPES_VARIABLE_NAME, VARIABLE_REGEX } from './constants';\n\nimport { SceneVariable, SceneVariableDependencyConfigLike } from './types';\nimport { safeStringifyValue } from './utils';\nimport { ConstantVariable } from './variants/ConstantVariable';\n\ninterface VariableDependencyConfigOptions<TState extends SceneObjectState> {\n /**\n * State paths to scan / extract variable dependencies from. Leave empty to scan all paths.\n */\n statePaths?: Array<keyof TState | '*'>;\n\n /**\n * Explicit list of variable names to depend on. Leave empty to scan state for dependencies.\n */\n variableNames?: string[];\n\n /**\n * Optional way to customize how to handle when a dependent variable changes\n * If not specified the default behavior is to trigger a re-render\n */\n onReferencedVariableValueChanged?: (variable: SceneVariable) => void;\n\n /**\n * Two scenarios trigger this callback to be called.\n * 1. When any direct dependency changed value\n * 2. In case hasDependencyInLoadingState was called and returned true we really care about any variable update. So in this scenario this callback is called\n * after any variable update completes. This is to cover scenarios where an object is waiting for indirect dependencies to complete.\n */\n onVariableUpdateCompleted?: () => void;\n\n /**\n * Optional way to subscribe to all variable value changes, even to variables that are not dependencies.\n */\n onAnyVariableChanged?: (variable: SceneVariable) => void;\n\n /**\n * Handle time macros.\n */\n handleTimeMacros?: boolean;\n\n /**\n * Depends on scopes\n */\n dependsOnScopes?: boolean;\n}\n\nexport class VariableDependencyConfig<TState extends SceneObjectState> implements SceneVariableDependencyConfigLike {\n private _state: TState | undefined;\n private _dependencies = new Set<string>();\n private _statePaths?: Array<keyof TState | '*'>;\n private _isWaitingForVariables = false;\n\n public scanCount = 0;\n\n public constructor(\n private _sceneObject: SceneObject<TState>,\n private _options: VariableDependencyConfigOptions<TState>\n ) {\n this._statePaths = _options.statePaths;\n\n if (this._options.handleTimeMacros) {\n this.handleTimeMacros();\n }\n }\n\n /**\n * Used to check for dependency on a specific variable\n */\n public hasDependencyOn(name: string): boolean {\n return this.getNames().has(name);\n }\n\n /**\n * This is called whenever any set of variables have new values. It is up to this implementation to check if it's relevant given the current dependencies.\n */\n public variableUpdateCompleted(variable: SceneVariable, hasChanged: boolean) {\n const deps = this.getNames();\n let dependencyChanged = false;\n\n if ((deps.has(variable.state.name) || deps.has(DataLinkBuiltInVars.includeVars)) && hasChanged) {\n dependencyChanged = true;\n }\n\n writeSceneLog(\n 'VariableDependencyConfig',\n 'variableUpdateCompleted',\n variable.state.name,\n dependencyChanged,\n this._isWaitingForVariables\n );\n\n if (this._options.onAnyVariableChanged) {\n this._options.onAnyVariableChanged(variable);\n }\n\n // If custom handler called when dependency is changed or when we are waiting for variables\n if (this._options.onVariableUpdateCompleted && (this._isWaitingForVariables || dependencyChanged)) {\n this._options.onVariableUpdateCompleted();\n }\n\n if (dependencyChanged) {\n if (this._options.onReferencedVariableValueChanged) {\n this._options.onReferencedVariableValueChanged(variable);\n }\n\n // if no callbacks are specified then just do a forceRender\n if (!this._options.onReferencedVariableValueChanged && !this._options.onVariableUpdateCompleted) {\n this._sceneObject.forceRender();\n }\n }\n }\n\n public hasDependencyInLoadingState() {\n if (sceneGraph.hasVariableDependencyInLoadingState(this._sceneObject)) {\n this._isWaitingForVariables = true;\n return true;\n }\n\n this._isWaitingForVariables = false;\n return false;\n }\n\n public getNames(): Set<string> {\n const prevState = this._state;\n const newState = (this._state = this._sceneObject.state);\n\n if (!prevState) {\n // First time we always scan for dependencies\n this.scanStateForDependencies(this._state);\n return this._dependencies;\n }\n\n // Second time we only scan if state is a different and if any specific state path has changed\n if (newState !== prevState) {\n if (this._statePaths) {\n for (const path of this._statePaths) {\n if (path === '*' || newState[path] !== prevState[path]) {\n this.scanStateForDependencies(newState);\n break;\n }\n }\n } else {\n this.scanStateForDependencies(newState);\n }\n }\n\n return this._dependencies;\n }\n\n /**\n * Update variableNames\n */\n public setVariableNames(varNames: string[]) {\n this._options.variableNames = varNames;\n this.scanStateForDependencies(this._state!);\n }\n\n public setPaths(paths: Array<keyof TState | '*'>) {\n this._statePaths = paths;\n }\n\n private scanStateForDependencies(state: TState) {\n this._dependencies.clear();\n this.scanCount += 1;\n\n if (this._options.variableNames) {\n for (const name of this._options.variableNames) {\n this._dependencies.add(name);\n }\n }\n\n if (this._options.dependsOnScopes) {\n this._dependencies.add(SCOPES_VARIABLE_NAME);\n }\n\n if (this._statePaths) {\n for (const path of this._statePaths) {\n if (path === '*') {\n this.extractVariablesFrom(state);\n break;\n } else {\n const value = state[path];\n if (value) {\n this.extractVariablesFrom(value);\n }\n }\n }\n }\n }\n\n private extractVariablesFrom(value: unknown) {\n VARIABLE_REGEX.lastIndex = 0;\n\n const stringToCheck = typeof value !== 'string' ? safeStringifyValue(value) : value;\n\n const matches = stringToCheck.matchAll(VARIABLE_REGEX);\n if (!matches) {\n return;\n }\n\n for (const match of matches) {\n const [, var1, var2, , var3] = match;\n const variableName = var1 || var2 || var3;\n this._dependencies.add(variableName);\n }\n }\n\n private handleTimeMacros() {\n this._sceneObject.addActivationHandler(() => {\n const timeRange = sceneGraph.getTimeRange(this._sceneObject);\n\n const sub = timeRange.subscribeToState((newState, oldState) => {\n const deps = this.getNames();\n const hasFromDep = deps.has('__from');\n const hasToDep = deps.has('__to');\n const hasTimeZone = deps.has('__timezone');\n\n if (newState.value !== oldState.value) {\n // If you have both __from & __to as dependencies you only get notified that from changed and vice versa\n if (hasFromDep) {\n const variable = new ConstantVariable({ name: '__from', value: newState.from });\n this.variableUpdateCompleted(variable, true);\n } else if (hasToDep) {\n const variable = new ConstantVariable({ name: '__to', value: newState.to });\n this.variableUpdateCompleted(variable, true);\n }\n }\n\n if (newState.timeZone !== oldState.timeZone && hasTimeZone) {\n const variable = new ConstantVariable({ name: '__timezone', value: newState.timeZone });\n this.variableUpdateCompleted(variable, true);\n }\n });\n\n return () => sub.unsubscribe();\n });\n }\n}\n"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"VariableDependencyConfig.js","sources":["../../../src/variables/VariableDependencyConfig.ts"],"sourcesContent":["import { DataLinkBuiltInVars } from '@grafana/data';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject, SceneObjectState } from '../core/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { VARIABLE_REGEX } from './constants';\n\nimport { SceneVariable, SceneVariableDependencyConfigLike } from './types';\nimport { safeStringifyValue } from './utils';\nimport { ConstantVariable } from './variants/ConstantVariable';\n\ninterface VariableDependencyConfigOptions<TState extends SceneObjectState> {\n /**\n * State paths to scan / extract variable dependencies from. Leave empty to scan all paths.\n */\n statePaths?: Array<keyof TState | '*'>;\n\n /**\n * Explicit list of variable names to depend on. Leave empty to scan state for dependencies.\n */\n variableNames?: string[];\n\n /**\n * Optional way to customize how to handle when a dependent variable changes\n * If not specified the default behavior is to trigger a re-render\n */\n onReferencedVariableValueChanged?: (variable: SceneVariable) => void;\n\n /**\n * Two scenarios trigger this callback to be called.\n * 1. When any direct dependency changed value\n * 2. In case hasDependencyInLoadingState was called and returned true we really care about any variable update. So in this scenario this callback is called\n * after any variable update completes. This is to cover scenarios where an object is waiting for indirect dependencies to complete.\n */\n onVariableUpdateCompleted?: () => void;\n\n /**\n * Optional way to subscribe to all variable value changes, even to variables that are not dependencies.\n */\n onAnyVariableChanged?: (variable: SceneVariable) => void;\n\n /**\n * Handle time macros.\n */\n handleTimeMacros?: boolean;\n}\n\nexport class VariableDependencyConfig<TState extends SceneObjectState> implements SceneVariableDependencyConfigLike {\n private _state: TState | undefined;\n private _dependencies = new Set<string>();\n private _statePaths?: Array<keyof TState | '*'>;\n private _isWaitingForVariables = false;\n\n public scanCount = 0;\n\n public constructor(\n private _sceneObject: SceneObject<TState>,\n private _options: VariableDependencyConfigOptions<TState>\n ) {\n this._statePaths = _options.statePaths;\n\n if (this._options.handleTimeMacros) {\n this.handleTimeMacros();\n }\n }\n\n /**\n * Used to check for dependency on a specific variable\n */\n public hasDependencyOn(name: string): boolean {\n return this.getNames().has(name);\n }\n\n /**\n * This is called whenever any set of variables have new values. It is up to this implementation to check if it's relevant given the current dependencies.\n */\n public variableUpdateCompleted(variable: SceneVariable, hasChanged: boolean) {\n const deps = this.getNames();\n let dependencyChanged = false;\n\n if ((deps.has(variable.state.name) || deps.has(DataLinkBuiltInVars.includeVars)) && hasChanged) {\n dependencyChanged = true;\n }\n\n writeSceneLog(\n 'VariableDependencyConfig',\n 'variableUpdateCompleted',\n variable.state.name,\n dependencyChanged,\n this._isWaitingForVariables\n );\n\n if (this._options.onAnyVariableChanged) {\n this._options.onAnyVariableChanged(variable);\n }\n\n // If custom handler called when dependency is changed or when we are waiting for variables\n if (this._options.onVariableUpdateCompleted && (this._isWaitingForVariables || dependencyChanged)) {\n this._options.onVariableUpdateCompleted();\n }\n\n if (dependencyChanged) {\n if (this._options.onReferencedVariableValueChanged) {\n this._options.onReferencedVariableValueChanged(variable);\n }\n\n // if no callbacks are specified then just do a forceRender\n if (!this._options.onReferencedVariableValueChanged && !this._options.onVariableUpdateCompleted) {\n this._sceneObject.forceRender();\n }\n }\n }\n\n public hasDependencyInLoadingState() {\n if (sceneGraph.hasVariableDependencyInLoadingState(this._sceneObject)) {\n this._isWaitingForVariables = true;\n return true;\n }\n\n this._isWaitingForVariables = false;\n return false;\n }\n\n public getNames(): Set<string> {\n const prevState = this._state;\n const newState = (this._state = this._sceneObject.state);\n\n if (!prevState) {\n // First time we always scan for dependencies\n this.scanStateForDependencies(this._state);\n return this._dependencies;\n }\n\n // Second time we only scan if state is a different and if any specific state path has changed\n if (newState !== prevState) {\n if (this._statePaths) {\n for (const path of this._statePaths) {\n if (path === '*' || newState[path] !== prevState[path]) {\n this.scanStateForDependencies(newState);\n break;\n }\n }\n } else {\n this.scanStateForDependencies(newState);\n }\n }\n\n return this._dependencies;\n }\n\n /**\n * Update variableNames\n */\n public setVariableNames(varNames: string[]) {\n this._options.variableNames = varNames;\n this.scanStateForDependencies(this._state!);\n }\n\n public setPaths(paths: Array<keyof TState | '*'>) {\n this._statePaths = paths;\n }\n\n private scanStateForDependencies(state: TState) {\n this._dependencies.clear();\n this.scanCount += 1;\n\n if (this._options.variableNames) {\n for (const name of this._options.variableNames) {\n this._dependencies.add(name);\n }\n }\n\n if (this._statePaths) {\n for (const path of this._statePaths) {\n if (path === '*') {\n this.extractVariablesFrom(state);\n break;\n } else {\n const value = state[path];\n if (value) {\n this.extractVariablesFrom(value);\n }\n }\n }\n }\n }\n\n private extractVariablesFrom(value: unknown) {\n VARIABLE_REGEX.lastIndex = 0;\n\n const stringToCheck = typeof value !== 'string' ? safeStringifyValue(value) : value;\n\n const matches = stringToCheck.matchAll(VARIABLE_REGEX);\n if (!matches) {\n return;\n }\n\n for (const match of matches) {\n const [, var1, var2, , var3] = match;\n const variableName = var1 || var2 || var3;\n this._dependencies.add(variableName);\n }\n }\n\n private handleTimeMacros() {\n this._sceneObject.addActivationHandler(() => {\n const timeRange = sceneGraph.getTimeRange(this._sceneObject);\n\n const sub = timeRange.subscribeToState((newState, oldState) => {\n const deps = this.getNames();\n const hasFromDep = deps.has('__from');\n const hasToDep = deps.has('__to');\n const hasTimeZone = deps.has('__timezone');\n\n if (newState.value !== oldState.value) {\n // If you have both __from & __to as dependencies you only get notified that from changed and vice versa\n if (hasFromDep) {\n const variable = new ConstantVariable({ name: '__from', value: newState.from });\n this.variableUpdateCompleted(variable, true);\n } else if (hasToDep) {\n const variable = new ConstantVariable({ name: '__to', value: newState.to });\n this.variableUpdateCompleted(variable, true);\n }\n }\n\n if (newState.timeZone !== oldState.timeZone && hasTimeZone) {\n const variable = new ConstantVariable({ name: '__timezone', value: newState.timeZone });\n this.variableUpdateCompleted(variable, true);\n }\n });\n\n return () => sub.unsubscribe();\n });\n }\n}\n"],"names":[],"mappings":"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"}
|
@@ -15,7 +15,6 @@ import { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFilter
|
|
15
15
|
import { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject.js';
|
16
16
|
import { isEqual } from 'lodash';
|
17
17
|
import { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes.js';
|
18
|
-
import { VariableDependencyConfig } from '../VariableDependencyConfig.js';
|
19
18
|
|
20
19
|
const OPERATORS = [
|
21
20
|
{
|
@@ -76,21 +75,25 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
76
75
|
// are set on construct and used to restore a baseFilter with an origin
|
77
76
|
// to its original value if edited at some point
|
78
77
|
this._originalValues = /* @__PURE__ */ new Map();
|
79
|
-
/** Needed for scopes dependency */
|
80
|
-
this._variableDependency = new VariableDependencyConfig(this, {
|
81
|
-
dependsOnScopes: true,
|
82
|
-
onReferencedVariableValueChanged: () => this._updateScopesFilters()
|
83
|
-
});
|
84
78
|
this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
|
85
79
|
this._activationHandler = () => {
|
86
|
-
|
80
|
+
var _a, _b;
|
81
|
+
this._scopesBridge = sceneGraph.getScopesBridge(this);
|
82
|
+
const scopes = (_a = this._scopesBridge) == null ? void 0 : _a.getValue();
|
83
|
+
if (scopes) {
|
84
|
+
this._updateScopesFilters(scopes);
|
85
|
+
}
|
86
|
+
const sub = (_b = this._scopesBridge) == null ? void 0 : _b.subscribeToValue((n, _) => {
|
87
|
+
this._updateScopesFilters(n);
|
88
|
+
});
|
87
89
|
return () => {
|
88
|
-
var
|
89
|
-
|
90
|
+
var _a2, _b2;
|
91
|
+
sub == null ? void 0 : sub.unsubscribe();
|
92
|
+
if ((_a2 = this.state.baseFilters) == null ? void 0 : _a2.length) {
|
90
93
|
this.setState({
|
91
94
|
baseFilters: [...this.state.baseFilters.filter((filter) => filter.origin !== "scope")]
|
92
95
|
});
|
93
|
-
(
|
96
|
+
(_b2 = this.state.baseFilters) == null ? void 0 : _b2.forEach((filter) => {
|
94
97
|
if (filter.origin === "dashboard" && filter.restorable) {
|
95
98
|
this.restoreOriginalFilter(filter);
|
96
99
|
}
|
@@ -112,12 +115,8 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
112
115
|
});
|
113
116
|
this.addActivationHandler(this._activationHandler);
|
114
117
|
}
|
115
|
-
_updateScopesFilters() {
|
118
|
+
_updateScopesFilters(scopes) {
|
116
119
|
var _a, _b;
|
117
|
-
const scopes = sceneGraph.getScopes(this);
|
118
|
-
if (!scopes) {
|
119
|
-
return;
|
120
|
-
}
|
121
120
|
if (!scopes.length) {
|
122
121
|
this.setState({
|
123
122
|
baseFilters: (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin !== "scope")
|
@@ -318,7 +317,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
318
317
|
* Get possible keys given current filters. Do not call from plugins directly
|
319
318
|
*/
|
320
319
|
async _getKeys(currentKey) {
|
321
|
-
var _a, _b, _c;
|
320
|
+
var _a, _b, _c, _d;
|
322
321
|
const override = await ((_b = (_a = this.state).getTagKeysProvider) == null ? void 0 : _b.call(_a, this, currentKey));
|
323
322
|
if (override && override.replace) {
|
324
323
|
return dataFromResponse(override.values).map(toSelectableValue);
|
@@ -337,7 +336,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
337
336
|
filters: otherFilters,
|
338
337
|
queries,
|
339
338
|
timeRange,
|
340
|
-
scopes:
|
339
|
+
scopes: (_d = this._scopesBridge) == null ? void 0 : _d.getValue(),
|
341
340
|
...getEnrichedFiltersRequest(this)
|
342
341
|
});
|
343
342
|
if (responseHasError(response)) {
|
@@ -357,7 +356,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
357
356
|
* Get possible key values for a specific key given current filters. Do not call from plugins directly
|
358
357
|
*/
|
359
358
|
async _getValuesFor(filter) {
|
360
|
-
var _a, _b, _c, _d;
|
359
|
+
var _a, _b, _c, _d, _e;
|
361
360
|
const override = await ((_b = (_a = this.state).getTagValuesProvider) == null ? void 0 : _b.call(_a, this, filter));
|
362
361
|
if (override && override.replace) {
|
363
362
|
return dataFromResponse(override.values).map(toSelectableValue);
|
@@ -370,7 +369,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
|
|
370
369
|
const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(filteredBaseFilters);
|
371
370
|
const timeRange = sceneGraph.getTimeRange(this).state.value;
|
372
371
|
const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
|
373
|
-
let scopes =
|
372
|
+
let scopes = (_e = this._scopesBridge) == null ? void 0 : _e.getValue();
|
374
373
|
if (filter.origin === "scope") {
|
375
374
|
scopes = scopes == null ? void 0 : scopes.map((scope) => {
|
376
375
|
return {
|