feat(elasticsearch): added bucket agg id concept

This commit is contained in:
Torkel Ödegaard
2015-09-05 12:24:14 +02:00
parent 756ec8ccd7
commit f1e995ec79
8 changed files with 84 additions and 67 deletions

View File

@@ -65,7 +65,7 @@ function (angular, _, $) {
$scope.orderByOptions = [
{text: "Doc Count", value: '_count' },
{text: "Term name", value: '_term' },
{text: "Average of @value", value: '0' },
{text: "Average of @value", value: 'm0' },
];
}
@@ -78,7 +78,11 @@ function (angular, _, $) {
addIndex - 1;
}
bucketAggs.splice(addIndex, 0, {type: "terms", field: "select field" });
var id = _.reduce($scope.target.bucketAggs.concat($scope.target.metrics), function(max, val) {
return parseInt(val.id) > max ? parseInt(val.id) : max;
}, 0);
bucketAggs.splice(addIndex, 0, {type: "terms", field: "select field", id: (id+1).toString()});
};
$scope.removeBucketAgg = function() {

View File

@@ -174,18 +174,19 @@ function (angular, _, config, kbn, moment, ElasticQueryBuilder) {
// This is quite complex
// neeed to recurise down the nested buckets to build series
ElasticDatasource.prototype._processBuckets = function(buckets, target, series, level, parentName) {
var seriesName, value, metric, i, y, bucket, childBucket;
ElasticDatasource.prototype._processBuckets = function(aggs, target, series, level, parentName) {
var seriesName, value, metric, i, y, bucket, childBucket, aggDef, esAgg;
var buckets;
var dataFound = 0;
for (i = 0; i < buckets.length; i++) {
bucket = buckets[i];
childBucket = bucket['b' + level];
aggDef = target.bucketAggs[level];
esAgg = aggs[aggDef.id];
if (childBucket && childBucket.buckets) {
seriesName = parentName + ' ' + bucket.key;
this._processBuckets(childBucket.buckets, target, series, level+1, seriesName);
} else {
for (i = 0; i < esAgg.buckets.length; i++) {
bucket = esAgg.buckets[i];
// if last agg collect series
if (level === target.bucketAggs.length - 1) {
for (y = 0; y < target.metrics.length; y++) {
metric = target.metrics[y];
seriesName = parentName;
@@ -195,13 +196,16 @@ function (angular, _, config, kbn, moment, ElasticQueryBuilder) {
value = bucket.doc_count;
} else {
seriesName += ' ' + metric.field + ' ' + metric.type;
value = bucket['m' + y.toString()].value;
value = bucket[metric.id].value;
}
var serie = series[seriesName] = series[seriesName] || {target: seriesName, datapoints: []};
serie.datapoints.push([value, bucket.key]);
}
}
else {
this._processBuckets(bucket, target, series, level+1, parentName + ' ' + bucket.key);
}
}
};
@@ -214,11 +218,11 @@ function (angular, _, config, kbn, moment, ElasticQueryBuilder) {
throw { message: response.error };
}
var buckets = response.aggregations["b0"].buckets;
var aggregations = response.aggregations;
var target = targets[i];
var querySeries = {};
this._processBuckets(buckets, target, querySeries, 1, target.refId);
this._processBuckets(aggregations, target, querySeries, 0, target.refId);
for (var prop in querySeries) {
if (querySeries.hasOwnProperty(prop)) {

View File

@@ -39,7 +39,12 @@ function (angular, _, $) {
$scope.addMetricAgg = function() {
var addIndex = metricAggs.length;
metricAggs.splice(addIndex, 0, {type: "count", field: "select field" });
var id = _.reduce($scope.target.bucketAggs.concat($scope.target.metrics), function(max, val) {
return parseInt(val.id) > max ? parseInt(val.id) : max;
}, 0);
metricAggs.splice(addIndex, 0, {type: "count", field: "select field", id: (id+1).toString()});
};
$scope.removeMetricAgg = function() {

View File

@@ -54,13 +54,19 @@ function (angular) {
break;
}
case 'terms': {
esAgg["terms"] = { "field": aggDef.field };
esAgg.terms = { "field": aggDef.field };
var size = parseInt(aggDef.size, 10);
if (size > 0) { esAgg.terms.size = size; }
if (aggDef.orderBy) {
esAgg.terms.order = {};
esAgg.terms.order[aggDef.orderBy] = aggDef.order;
}
break;
}
}
nestedAggs.aggs = {};
nestedAggs.aggs['b' + i] = esAgg;
nestedAggs.aggs[aggDef.id] = esAgg;
nestedAggs = esAgg;
}
@@ -74,7 +80,7 @@ function (angular) {
var aggField = {};
aggField[metric.type] = {field: metric.field};
nestedAggs.aggs['m' + i] = aggField;
nestedAggs.aggs[metric.id] = aggField;
}
return query;

View File

@@ -15,16 +15,18 @@ function (angular, _, ElasticQueryBuilder) {
if (!target) { return; }
target.timeField = target.timeField || '@timestamp';
target.metrics = target.metrics || [{ type: 'count' }];
target.metrics = target.metrics || [{ type: 'count', id: '1' }];
target.bucketAggs = target.bucketAggs || [];
target.bucketAggs = [
{
type: 'terms',
field: '@hostname'
field: '@hostname',
id: '2'
},
{
type: 'date_histogram',
field: '@timestamp'
field: '@timestamp',
id: '3'
},
];