From 792b194d0e0d0ced881ea18d194c7b39dc141509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 21 Sep 2015 20:29:05 +0200 Subject: [PATCH] feat(elasticsearch): finished work on adding support for filters aggregate, you can now split series by query using group by filters, closes #2785 --- .../datasource/elasticsearch/bucketAgg.js | 17 ++++++++++++ .../elasticsearch/partials/bucketAgg.html | 27 ++++++++++++++++--- .../datasource/elasticsearch/queryBuilder.js | 23 +++++----------- .../specs/elasticsearch-querybuilder-specs.js | 12 +++++++-- .../specs/elasticsearch-response-specs.js | 12 +++++++-- 5 files changed, 68 insertions(+), 23 deletions(-) diff --git a/public/app/plugins/datasource/elasticsearch/bucketAgg.js b/public/app/plugins/datasource/elasticsearch/bucketAgg.js index d96e9ad8090..32021f0ba42 100644 --- a/public/app/plugins/datasource/elasticsearch/bucketAgg.js +++ b/public/app/plugins/datasource/elasticsearch/bucketAgg.js @@ -80,6 +80,15 @@ function (angular, _, queryDef) { break; } case 'filters': { + settings.filters = settings.filters || [{query: '*'}]; + settingsLinkText = _.reduce(settings.filters, function(memo, value, index) { + memo += 'Q' + (index + 1) + ' = ' + value.query + ' '; + return memo; + }, ''); + if (settingsLinkText.length > 50) { + settingsLinkText = settingsLinkText.substr(0, 50) + "..."; + } + settingsLinkText = 'Filter Queries (' + settings.filters.length + ')'; break; } case 'date_histogram': { @@ -94,6 +103,14 @@ function (angular, _, queryDef) { return true; }; + $scope.addFiltersQuery = function() { + $scope.agg.settings.filters.push({query: '*'}); + }; + + $scope.removeFiltersQuery = function(filter) { + $scope.agg.settings.filters = _.without($scope.agg.settings.filters, filter); + }; + $scope.toggleOptions = function() { $scope.showOptions = !$scope.showOptions; $scope.updateOrderByOptions(); diff --git a/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html b/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html index 2d7349f295a..b783b3c2efc 100644 --- a/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html +++ b/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html @@ -7,11 +7,11 @@
  • -
  • +
  • -
  • - +
  • +  
  • {{settingsLinkText}} @@ -78,6 +78,27 @@
    +
    +
    +
      +
    • + Query {{$index + 1}} +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    +
    +
    + +
    + diff --git a/public/app/plugins/datasource/elasticsearch/queryBuilder.js b/public/app/plugins/datasource/elasticsearch/queryBuilder.js index f1d1998e51d..f303c93952c 100644 --- a/public/app/plugins/datasource/elasticsearch/queryBuilder.js +++ b/public/app/plugins/datasource/elasticsearch/queryBuilder.js @@ -54,19 +54,15 @@ function (angular) { } }; - ElasticQueryBuilder.prototype.getFiltersAgg = function(target) { + ElasticQueryBuilder.prototype.getFiltersAgg = function(aggDef) { var filterObj = {}; - for (var i = 0; i < target.bucketAggs.length; i++) { - var aggDef = target.bucketAggs[i]; - if (aggDef.type !== 'filters') { - continue; - } - - filterObj[aggDef.query] = { + for (var i = 0; i < aggDef.settings.filters.length; i++) { + var query = aggDef.settings.filters[i].query; + filterObj[query] = { query: { query_string: { - query: aggDef.query, + query: query, analyze_wildcard: true } } @@ -81,7 +77,7 @@ function (angular) { return angular.fromJson(target.rawQuery); } - var i, nestedAggs, metric, filtersHandled; + var i, nestedAggs, metric; var query = { "size": 0, "query": { @@ -118,12 +114,7 @@ function (angular) { break; } case 'filters': { - // skip filters if we already processed them - if (filtersHandled) { - continue; - } - esAgg["filters"] = {filters: this.getFiltersAgg(target)}; - filtersHandled = true; + esAgg["filters"] = {filters: this.getFiltersAgg(aggDef)}; break; } case 'terms': { diff --git a/public/test/specs/elasticsearch-querybuilder-specs.js b/public/test/specs/elasticsearch-querybuilder-specs.js index f80b29f4021..467d3706e03 100644 --- a/public/test/specs/elasticsearch-querybuilder-specs.js +++ b/public/test/specs/elasticsearch-querybuilder-specs.js @@ -100,8 +100,16 @@ define([ metrics: [{type: 'count', id: '1'}], timeField: '@timestamp', bucketAggs: [ - {type: 'filters', query: '@metric:cpu', id: '2'}, - {type: 'filters', query: '@metric:logins.count', id: '3' }, + { + id: '2', + type: 'filters', + settings: { + filters: [ + {query: '@metric:cpu' }, + {query: '@metric:logins.count' }, + ] + } + }, {type: 'date_histogram', field: '@timestamp', id: '4'} ], }); diff --git a/public/test/specs/elasticsearch-response-specs.js b/public/test/specs/elasticsearch-response-specs.js index 4001327aa5e..fe465df3129 100644 --- a/public/test/specs/elasticsearch-response-specs.js +++ b/public/test/specs/elasticsearch-response-specs.js @@ -359,8 +359,16 @@ define([ refId: 'A', metrics: [{type: 'count', id: '1'}], bucketAggs: [ - {type: 'filters', query: '@metric:cpu', id: '2'}, - {type: 'filters', query: '@metric:logins.count', id: '5'}, + { + id: '2', + type: 'filters', + settings: { + filters: [ + {query: '@metric:cpu' }, + {query: '@metric:logins.count' }, + ] + } + }, {type: 'date_histogram', field: '@timestamp', id: '3'} ], }];