Skip to content

Commit 63150dc

Browse files
committed
Add support for template variables.
1 parent 4addf68 commit 63150dc

File tree

3 files changed

+69
-5
lines changed

3 files changed

+69
-5
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/QueryBuilder.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ export class ElasticQueryBuilder {
1414
filter[this.timeField] = {
1515
gte: '$timeFrom',
1616
lte: '$timeTo',
17-
format: 'epoch_millis',
17+
// FIXME when Quickwit supports format.
18+
// format: 'epoch_millis',
1819
};
1920

2021
return filter;

src/datasource.ts

Lines changed: 65 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
import { trackQuery } from 'tracking';
2929
import { BucketAggregation, DataLinkConfig, ElasticsearchQuery, Field, FieldMapping, IndexMetadata, TermsQuery } from './types';
3030
import {
31-
DataSourceWithBackend,
31+
DataSourceWithBackend, getTemplateSrv, TemplateSrv,
3232
} from '@grafana/runtime';
3333
import { QuickwitOptions } from 'quickwit';
3434
import { ElasticQueryBuilder } from 'QueryBuilder';
@@ -61,7 +61,10 @@ export class QuickwitDataSource
6161
dataLinks: DataLinkConfig[];
6262
languageProvider: ElasticsearchLanguageProvider;
6363

64-
constructor(instanceSettings: DataSourceInstanceSettings<QuickwitOptions>) {
64+
constructor(
65+
instanceSettings: DataSourceInstanceSettings<QuickwitOptions>,
66+
private readonly templateSrv: TemplateSrv = getTemplateSrv()
67+
) {
6568
super(instanceSettings);
6669
const settingsData = instanceSettings.jsonData || ({} as QuickwitOptions);
6770
this.index = settingsData.index || '';
@@ -424,6 +427,66 @@ export class QuickwitDataSource
424427
}
425428
return true;
426429
}
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+
}
427490
}
428491

429492
// Returns a flatten array of fields and nested fields found in the given `FieldMapping` array.

0 commit comments

Comments
 (0)