1- import { DataSourceInstanceSettings , CoreApp , ScopedVars , DataQueryRequest , DataQueryResponse } from '@grafana/data' ;
1+ import { DataSourceInstanceSettings , CoreApp , ScopedVars , DataQueryRequest , DataFrame , Field , MetricFindValue } from '@grafana/data' ;
22import { DataSourceWithBackend , getTemplateSrv } from '@grafana/runtime' ;
3- import { Observable } from 'rxjs' ;
43
5- import { HaystackQuery , HaystackDataSourceOptions , DEFAULT_QUERY } from './types' ;
4+ import { HaystackQuery , HaystackDataSourceOptions , DEFAULT_QUERY , HaystackVariableQuery } from './types' ;
65
76export class DataSource extends DataSourceWithBackend < HaystackQuery , HaystackDataSourceOptions > {
87 constructor ( instanceSettings : DataSourceInstanceSettings < HaystackDataSourceOptions > ) {
@@ -12,12 +11,50 @@ export class DataSource extends DataSourceWithBackend<HaystackQuery, HaystackDat
1211 applyTemplateVariables ( query : HaystackQuery , scopedVars : ScopedVars ) : Record < string , any > {
1312 return {
1413 ...query ,
15- eval : getTemplateSrv ( ) . replace ( query . eval , scopedVars ) ,
16- hisRead : getTemplateSrv ( ) . replace ( query . hisRead , scopedVars ) ,
17- read : getTemplateSrv ( ) . replace ( query . read , scopedVars ) ,
14+ eval : getTemplateSrv ( ) . replace ( query . eval , scopedVars , "csv" ) ,
15+ hisRead : getTemplateSrv ( ) . replace ( query . hisRead , scopedVars , "csv" ) ,
16+ read : getTemplateSrv ( ) . replace ( query . read , scopedVars , "csv" ) ,
1817 } ;
1918 }
2019
20+ // This is called when the user is selecting a variable value
21+ async metricFindQuery ( query : HaystackVariableQuery , options ?: any ) {
22+ let request : HaystackQuery = {
23+ refId : "VariableQuery" ,
24+ type : "Eval" ,
25+ eval : query . eval ,
26+ hisRead : "" ,
27+ read : ""
28+ } ;
29+ let response = await this . query ( { targets : [ request ] } as DataQueryRequest < HaystackQuery > ) . toPromise ( )
30+
31+ if ( response === undefined || response . data === undefined ) {
32+ return [ ] ;
33+ }
34+
35+ return response . data . reduce ( ( acc : MetricFindValue [ ] , frame : DataFrame ) => {
36+ let field = frame . fields [ 0 ] ;
37+ if ( query . column !== undefined && query . column !== "" ) {
38+ // If a column was input, match the column name
39+ field = frame . fields . find ( ( field : Field ) => field . name === query . column ) ?? field ;
40+ }
41+
42+ let fieldVals = field . values . toArray ( ) . map ( ( value ) => {
43+ if ( value . startsWith ( "@" ) ) {
44+ // Detect ref using @ prefix, and adjust value to just the Ref
45+ let spaceIndex = value . indexOf ( " " ) ;
46+ let id = value . substring ( 0 , spaceIndex ) ;
47+ return { text : value , value : id } ;
48+ } else {
49+ // Otherwise, just use the value directly
50+ return { text : value , value : value } ;
51+ }
52+ } ) ;
53+ return acc . concat ( fieldVals ) ;
54+ } , [ ] ) ;
55+ }
56+
57+
2158 getDefaultQuery ( _ : CoreApp ) : Partial < HaystackQuery > {
2259 return DEFAULT_QUERY
2360 }
0 commit comments