mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
85 lines
1.8 KiB
JavaScript
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;
|
|
|
|
});
|