@@ -28,7 +28,7 @@ import {
28
28
import { trackQuery } from 'tracking' ;
29
29
import { BucketAggregation , DataLinkConfig , ElasticsearchQuery , Field , FieldMapping , IndexMetadata , TermsQuery } from './types' ;
30
30
import {
31
- DataSourceWithBackend ,
31
+ DataSourceWithBackend , getTemplateSrv , TemplateSrv ,
32
32
} from '@grafana/runtime' ;
33
33
import { QuickwitOptions } from 'quickwit' ;
34
34
import { ElasticQueryBuilder } from 'QueryBuilder' ;
@@ -61,7 +61,10 @@ export class QuickwitDataSource
61
61
dataLinks : DataLinkConfig [ ] ;
62
62
languageProvider : ElasticsearchLanguageProvider ;
63
63
64
- constructor ( instanceSettings : DataSourceInstanceSettings < QuickwitOptions > ) {
64
+ constructor (
65
+ instanceSettings : DataSourceInstanceSettings < QuickwitOptions > ,
66
+ private readonly templateSrv : TemplateSrv = getTemplateSrv ( )
67
+ ) {
65
68
super ( instanceSettings ) ;
66
69
const settingsData = instanceSettings . jsonData || ( { } as QuickwitOptions ) ;
67
70
this . index = settingsData . index || '' ;
@@ -424,6 +427,66 @@ export class QuickwitDataSource
424
427
}
425
428
return true ;
426
429
}
430
+
431
+ metricFindQuery ( query : string , options ?: { range : TimeRange } ) : Promise < MetricFindValue [ ] > {
432
+ const range = options ?. range ;
433
+ const parsedQuery = JSON . parse ( query ) ;
434
+ if ( query ) {
435
+ if ( parsedQuery . find === 'fields' ) {
436
+ parsedQuery . type = this . interpolateLuceneQuery ( parsedQuery . type ) ;
437
+ return lastValueFrom ( this . getFields ( parsedQuery . type , range ) ) ;
438
+ }
439
+
440
+ if ( parsedQuery . find === 'terms' ) {
441
+ parsedQuery . field = this . interpolateLuceneQuery ( parsedQuery . field ) ;
442
+ parsedQuery . query = this . interpolateLuceneQuery ( parsedQuery . query ) ;
443
+ console . log ( parsedQuery ) ;
444
+ return lastValueFrom ( this . getTerms ( parsedQuery , range ) ) ;
445
+ }
446
+ }
447
+
448
+ return Promise . resolve ( [ ] ) ;
449
+ }
450
+
451
+ interpolateLuceneQuery ( queryString : string , scopedVars ?: ScopedVars ) {
452
+ return this . templateSrv . replace ( queryString , scopedVars , 'lucene' ) ;
453
+ }
454
+
455
+ interpolateVariablesInQueries ( queries : ElasticsearchQuery [ ] , scopedVars : ScopedVars | { } ) : ElasticsearchQuery [ ] {
456
+ return queries . map ( ( q ) => this . applyTemplateVariables ( q , scopedVars ) ) ;
457
+ }
458
+
459
+ // Used when running queries through backend
460
+ applyTemplateVariables ( query : ElasticsearchQuery , scopedVars : ScopedVars ) : ElasticsearchQuery {
461
+ // We need a separate interpolation format for lucene queries, therefore we first interpolate any
462
+ // lucene query string and then everything else
463
+ const interpolateBucketAgg = ( bucketAgg : BucketAggregation ) : BucketAggregation => {
464
+ if ( bucketAgg . type === 'filters' ) {
465
+ return {
466
+ ...bucketAgg ,
467
+ settings : {
468
+ ...bucketAgg . settings ,
469
+ filters : bucketAgg . settings ?. filters ?. map ( ( filter ) => ( {
470
+ ...filter ,
471
+ query : this . interpolateLuceneQuery ( filter . query , scopedVars ) || '*' ,
472
+ } ) ) ,
473
+ } ,
474
+ } ;
475
+ }
476
+
477
+ return bucketAgg ;
478
+ } ;
479
+
480
+ const expandedQuery = {
481
+ ...query ,
482
+ datasource : this . getRef ( ) ,
483
+ query : this . interpolateLuceneQuery ( query . query || '' , scopedVars ) ,
484
+ bucketAggs : query . bucketAggs ?. map ( interpolateBucketAgg ) ,
485
+ } ;
486
+
487
+ const finalQuery = JSON . parse ( this . templateSrv . replace ( JSON . stringify ( expandedQuery ) , scopedVars ) ) ;
488
+ return finalQuery ;
489
+ }
427
490
}
428
491
429
492
// Returns a flatten array of fields and nested fields found in the given `FieldMapping` array.
0 commit comments