From 2d832e10b0787c5914c16992527b8ce4b6ca3da6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Sat, 5 Sep 2015 12:51:05 +0200 Subject: [PATCH] feat(elasticsearch): term metric filters are starting to work! like terms aggregation with top 5, order by metric 1 desc, where metric 1 is maybe average of @load --- .../datasource/elasticsearch/bucketAgg.js | 2 +- .../datasource/elasticsearch/queryBuilder.js | 22 +++++++++++++++---- .../specs/elasticsearch-querybuilder-specs.js | 8 +++---- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/public/app/plugins/datasource/elasticsearch/bucketAgg.js b/public/app/plugins/datasource/elasticsearch/bucketAgg.js index a7852792e90..eeda170544f 100644 --- a/public/app/plugins/datasource/elasticsearch/bucketAgg.js +++ b/public/app/plugins/datasource/elasticsearch/bucketAgg.js @@ -65,7 +65,7 @@ function (angular, _, $) { $scope.orderByOptions = [ {text: "Doc Count", value: '_count' }, {text: "Term name", value: '_term' }, - {text: "Average of @value", value: 'm0' }, + {text: "Average of @value", value: '1' }, ]; } diff --git a/public/app/plugins/datasource/elasticsearch/queryBuilder.js b/public/app/plugins/datasource/elasticsearch/queryBuilder.js index d1fc9719a11..2eef154e83b 100644 --- a/public/app/plugins/datasource/elasticsearch/queryBuilder.js +++ b/public/app/plugins/datasource/elasticsearch/queryBuilder.js @@ -17,7 +17,7 @@ function (angular) { return angular.fromJson(target.rawQuery); } - var i, nestedAggs; + var i, y, nestedAggs, metric, metricRef; var query = { "size": 0, "query": { @@ -57,15 +57,29 @@ function (angular) { esAgg.terms = { "field": aggDef.field }; var size = parseInt(aggDef.size, 10); if (size > 0) { esAgg.terms.size = size; } - if (aggDef.orderBy) { + if (aggDef.orderBy != void 0) { esAgg.terms.order = {}; esAgg.terms.order[aggDef.orderBy] = aggDef.order; + + // if metric ref, look it up and add it to this agg level + metricRef = parseInt(aggDef.orderBy, 10); + if (!isNaN(metricRef)) { + for (y = 0; y < target.metrics.length; y++) { + metric = target.metrics[y]; + if (metric.id === aggDef.orderBy) { + esAgg.aggs = {}; + esAgg.aggs[metric.id] = {} + esAgg.aggs[metric.id][metric.type] = {field: metric.field}; + break; + } + } + } } break; } } - nestedAggs.aggs = {}; + nestedAggs.aggs = nestedAggs.aggs || {}; nestedAggs.aggs[aggDef.id] = esAgg; nestedAggs = esAgg; } @@ -73,7 +87,7 @@ function (angular) { nestedAggs.aggs = {}; for (i = 0; i < target.metrics.length; i++) { - var metric = target.metrics[i]; + metric = target.metrics[i]; if (metric.type === 'count') { continue; } diff --git a/public/test/specs/elasticsearch-querybuilder-specs.js b/public/test/specs/elasticsearch-querybuilder-specs.js index e589302f3f4..6622a2462a6 100644 --- a/public/test/specs/elasticsearch-querybuilder-specs.js +++ b/public/test/specs/elasticsearch-querybuilder-specs.js @@ -51,9 +51,9 @@ define([ var builder = new ElasticQueryBuilder(); var query = builder.build({ - metrics: [{type: 'avg', field: '@value', id: '1'}], + metrics: [{type: 'count', id: '1'}, {type: 'avg', field: '@value', id: '5'}], bucketAggs: [ - {type: 'term', size: 5, order: 'asc', orderBy: 'm0', id: '2' }, + {type: 'terms', field: '@host', size: 5, order: 'asc', orderBy: '5', id: '2' }, {type: 'date_histogram', field: '@timestamp', id: '3'} ], }, 100, 1000); @@ -61,8 +61,8 @@ define([ var firstLevel = query.aggs["2"]; var secondLevel = firstLevel.aggs["3"]; - // expect(firstLevel.aggs["m0"].avg.field).to.be("@value"); - expect(secondLevel.aggs["1"].avg.field).to.be("@value"); + expect(firstLevel.aggs["5"].avg.field).to.be("@value"); + expect(secondLevel.aggs["5"].avg.field).to.be("@value"); }); });