@@ -12,6 +12,7 @@ import { DataSourceWithBackend, getTemplateSrv } from '@grafana/runtime';
1212
1313import { HaystackQuery , OpsQuery , HaystackDataSourceOptions , HaystackVariableQuery , QueryType } from './types' ;
1414import { firstValueFrom } from 'rxjs' ;
15+ import { isRef , parseRef } from 'haystack' ;
1516
1617export const queryTypes : QueryType [ ] = [
1718 { label : 'Eval' , value : 'eval' , apiRequirements : [ 'eval' ] , description : 'Evaluate an Axon expression' } ,
@@ -100,39 +101,33 @@ export class DataSource extends DataSourceWithBackend<HaystackQuery, HaystackDat
100101
101102 return response . data . reduce ( ( acc : MetricFindValue [ ] , frame : DataFrame ) => {
102103 // Default to the first field
103- let field = frame . fields [ 0 ] ;
104+ let column = frame . fields [ 0 ] ;
104105 if ( variableQuery . column !== undefined && variableQuery . column !== '' ) {
105106 // If a column was input, match the column name
106- field = frame . fields . find ( ( field : Field ) => field . name === variableQuery . column ) ?? field ;
107+ column = frame . fields . find ( ( field : Field ) => field . name === variableQuery . column ) ?? column ;
107108 } else if ( frame . fields . some ( ( field : Field ) => field . name === 'id' ) ) {
108109 // If there is an id column, use that
109- field = frame . fields . find ( ( field : Field ) => field . name === 'id' ) ?? field ;
110+ column = frame . fields . find ( ( field : Field ) => field . name === 'id' ) ?? column ;
110111 }
111112
112- let fieldVals = field . values . map ( ( value ) => {
113- switch ( field . type ) {
114- case FieldType . string :
115- if ( value . startsWith ( '@' ) ) {
116- // Detect ref using @ prefix, and adjust value to just the Ref
117- const spaceIndex = value . indexOf ( ' ' ) ;
118- if ( spaceIndex > - 1 ) {
119- // Display name exists
120- const id = value . substring ( 0 , spaceIndex ) ;
121- const dis = value . substring ( spaceIndex + 2 , value . length - 1 ) ;
122- return { text : dis , value : id } ;
123- } else {
124- // Otherwise, just use id
125- return { text : value , value : value } ;
126- }
127- } else {
128- // Otherwise, just use the value directly
129- return { text : value , value : value } ;
130- }
131- default :
132- return { text : value , value : value } ;
133- }
113+ // Default to the selected column
114+ let displayColumn = column ;
115+ if ( variableQuery . displayColumn !== undefined && variableQuery . displayColumn !== '' ) {
116+ // If a column was input, match the column name
117+ displayColumn =
118+ frame . fields . find ( ( field : Field ) => field . name === variableQuery . displayColumn ) ?? displayColumn ;
119+ }
120+
121+ let variableValues = column . values . map ( ( value , index ) => {
122+ let variableValue = variableValueFromCell ( value , column . type ) ;
123+
124+ let displayValue = displayColumn . values [ index ] ;
125+ let variableText = variableTextFromCell ( displayValue , displayColumn . type ) ;
126+
127+ return { text : variableText , value : variableValue } ;
134128 } ) ;
135- return acc . concat ( fieldVals ) ;
129+
130+ return acc . concat ( variableValues ) ;
136131 } , [ ] ) ;
137132 }
138133
@@ -154,3 +149,24 @@ export class DataSource extends DataSourceWithBackend<HaystackQuery, HaystackDat
154149 } ;
155150 }
156151}
152+
153+ function variableValueFromCell ( value : string , columnType : FieldType ) : string {
154+ switch ( columnType ) {
155+ case FieldType . string :
156+ if ( isRef ( value ) ) {
157+ return parseRef ( value ) . id ;
158+ }
159+ }
160+ return value ;
161+ }
162+
163+ function variableTextFromCell ( value : string , columnType : FieldType ) : string {
164+ switch ( columnType ) {
165+ case FieldType . string :
166+ if ( isRef ( value ) ) {
167+ let ref = parseRef ( value ) ;
168+ return ref . dis ?? ref . id ;
169+ }
170+ }
171+ return value ;
172+ }
0 commit comments