Files
grafana/public/app/plugins/datasource/elasticsearch/queryBuilder.js

85 lines
1.8 KiB
JavaScript

define([
"angular"
],
function (angular) {
'use strict';
function ElasticQueryBuilder() { }
ElasticQueryBuilder.prototype.getRangeFilter = function(timeField) {
var filter = {};
filter[timeField] = {"gte": "$timeFrom", "lte": "$timeTo"};
return filter;
};
ElasticQueryBuilder.prototype.build = function(target) {
if (target.rawQuery) {
return angular.fromJson(target.rawQuery);
}
var i, nestedAggs;
var query = {
"size": 0,
"query": {
"filtered": {
"query": {
"query_string": {
"analyze_wildcard": true,
"query": target.query || '*' ,
}
},
"filter": {
"bool": {
"must": [{"range": this.getRangeFilter(target.timeField)}]
}
}
}
}
};
nestedAggs = query;
for (i = 0; i < target.bucketAggs.length; i++) {
var aggDef = target.bucketAggs[i];
var esAgg = {};
switch(aggDef.type) {
case 'date_histogram': {
esAgg["date_histogram"] = {
"interval": target.interval || "$interval",
"field": aggDef.field,
"min_doc_count": 0,
"extended_bounds": { "min": "$timeFrom", "max": "$timeTo" }
};
break;
}
case 'terms': {
esAgg["terms"] = { "field": aggDef.field };
break;
}
}
nestedAggs.aggs = {};
nestedAggs.aggs['b' + i] = esAgg;
nestedAggs = esAgg;
}
nestedAggs.aggs = {};
for (i = 0; i < target.metrics.length; i++) {
var metric = target.metrics[i];
if (metric.field) {
var aggField = {};
aggField[metric.agg] = {field: metric.field};
nestedAggs.aggs['m' + i] = aggField;
}
}
return query;
};
return ElasticQueryBuilder;
});