@@ -4,20 +4,13 @@ import {
44 DataQueryRequest ,
55 DataFrame ,
66 Field ,
7- MetricFindValue ,
87 getDefaultTimeRange ,
9- FieldType ,
10- CustomVariableSupport ,
11- DataQueryResponse ,
12- QueryEditorProps ,
138} from '@grafana/data' ;
149import { DataSourceWithBackend , getTemplateSrv } from '@grafana/runtime' ;
1510
16- import { HaystackQuery , OpsQuery , HaystackDataSourceOptions , HaystackVariableQuery , QueryType } from './types' ;
17- import { firstValueFrom , map , Observable } from 'rxjs' ;
18- import { isRef , parseRef } from 'haystack' ;
19- import { ComponentType } from 'react' ;
20- import { VariableQueryEditor } from 'components/VariableQueryEditor' ;
11+ import { HaystackQuery , OpsQuery , HaystackDataSourceOptions , QueryType } from './types' ;
12+ import { firstValueFrom } from 'rxjs' ;
13+ import { HaystackVariableSupport } from 'HaystackVariableSupport' ;
2114
2215export const queryTypes : QueryType [ ] = [
2316 { label : 'Eval' , value : 'eval' , apiRequirements : [ 'eval' ] , description : 'Evaluate an Axon expression' } ,
@@ -34,9 +27,7 @@ export const queryTypes: QueryType[] = [
3427export class DataSource extends DataSourceWithBackend < HaystackQuery , HaystackDataSourceOptions > {
3528 constructor ( instanceSettings : DataSourceInstanceSettings < HaystackDataSourceOptions > ) {
3629 super ( instanceSettings ) ;
37- this . variables = new HaystackVariableSupport ( ( request ) => {
38- return this . query ( request ) ;
39- } ) ;
30+ this . variables = new HaystackVariableSupport ( this ) ;
4031 }
4132
4233 // Queries the available ops from the datasource and returns the queryTypes that are supported.
@@ -115,89 +106,3 @@ export class DataSource extends DataSourceWithBackend<HaystackQuery, HaystackDat
115106 } ;
116107 }
117108}
118-
119- export class HaystackVariableSupport extends CustomVariableSupport <
120- DataSource ,
121- HaystackVariableQuery ,
122- HaystackQuery ,
123- HaystackDataSourceOptions
124- > {
125- editor : ComponentType < QueryEditorProps < DataSource , HaystackQuery , HaystackDataSourceOptions , HaystackVariableQuery > > ;
126-
127- // Requests data from the backend. This allows this class to reuse the DataSource.query method to get data.
128- onQuery : ( request : DataQueryRequest < HaystackVariableQuery > ) => Observable < DataQueryResponse > ;
129-
130- constructor ( onQuery : ( request : DataQueryRequest < HaystackVariableQuery > ) => Observable < DataQueryResponse > ) {
131- super ( ) ;
132- this . editor = VariableQueryEditor ;
133- this . onQuery = onQuery ;
134- }
135-
136- query ( request : DataQueryRequest < HaystackVariableQuery > ) : Observable < DataQueryResponse > {
137- let variableQuery = request . targets [ 0 ] ;
138- // Setting the refId is required for Grafana to associate the response with the request.
139- variableQuery . refId = 'HaystackVariableQuery' ;
140- let observable = this . onQuery ( request ) ;
141- return observable . pipe (
142- map ( ( response ) => {
143- if ( response === undefined || response . errors !== undefined || response . data === undefined ) {
144- return response ;
145- }
146-
147- let variableValues = response . data . reduce ( ( acc : MetricFindValue [ ] , frame : DataFrame ) => {
148- // Default to the first field
149- let column = frame . fields [ 0 ] ;
150- if ( variableQuery . column !== undefined && variableQuery . column !== '' ) {
151- // If a column was input, match the column name
152- column = frame . fields . find ( ( field : Field ) => field . name === variableQuery . column ) ?? column ;
153- } else if ( frame . fields . some ( ( field : Field ) => field . name === 'id' ) ) {
154- // If there is an id column, use that
155- column = frame . fields . find ( ( field : Field ) => field . name === 'id' ) ?? column ;
156- }
157-
158- // Default to the selected column
159- let displayColumn = column ;
160- if ( variableQuery . displayColumn !== undefined && variableQuery . displayColumn !== '' ) {
161- // If a column was input, match the column name
162- displayColumn =
163- frame . fields . find ( ( field : Field ) => {
164- return field . name === variableQuery . displayColumn ;
165- } ) ?? displayColumn ;
166- }
167-
168- let variableValues = column . values . map ( ( value , index ) => {
169- let variableValue = variableValueFromCell ( value , column . type ) ;
170-
171- let displayValue = displayColumn . values [ index ] ;
172- let variableText = variableTextFromCell ( displayValue , displayColumn . type ) ;
173-
174- return { text : variableText , value : variableValue } ;
175- } ) ;
176- return acc . concat ( variableValues ) ;
177- } , [ ] ) ;
178- return { ...response , data : variableValues } ;
179- } )
180- ) ;
181- }
182- }
183-
184- function variableValueFromCell ( value : string , columnType : FieldType ) : string {
185- switch ( columnType ) {
186- case FieldType . string :
187- if ( isRef ( value ) ) {
188- return parseRef ( value ) . id ;
189- }
190- }
191- return value ;
192- }
193-
194- function variableTextFromCell ( value : string , columnType : FieldType ) : string {
195- switch ( columnType ) {
196- case FieldType . string :
197- if ( isRef ( value ) ) {
198- let ref = parseRef ( value ) ;
199- return ref . dis ?? ref . id ;
200- }
201- }
202- return value ;
203- }
0 commit comments