diff --git a/public/app/plugins/datasource/elasticsearch/datasource.js b/public/app/plugins/datasource/elasticsearch/datasource.js index b9a32df0066..674ff9b65ec 100644 --- a/public/app/plugins/datasource/elasticsearch/datasource.js +++ b/public/app/plugins/datasource/elasticsearch/datasource.js @@ -149,7 +149,7 @@ function (angular, _, config, kbn, moment, ElasticQueryBuilder) { var esQuery = queryBuilder.build(target, timeFrom, timeTo); payload += header + '\n'; - payload += esQuery + '\n'; + payload += angular.toJson(esQuery) + '\n'; sentTargets.push(target); }); @@ -172,7 +172,7 @@ function (angular, _, config, kbn, moment, ElasticQueryBuilder) { return date.getTime(); }; - // this is quite complex + // This is quite complex // neeed to recurise down the nested buckets to build series ElasticDatasource.prototype._processBuckets = function(buckets, groupByFields, series, level, parentName, parentTime) { var points = []; diff --git a/public/app/plugins/datasource/elasticsearch/queryBuilder.js b/public/app/plugins/datasource/elasticsearch/queryBuilder.js index 5b9bf4c8371..a934b9460db 100644 --- a/public/app/plugins/datasource/elasticsearch/queryBuilder.js +++ b/public/app/plugins/datasource/elasticsearch/queryBuilder.js @@ -56,6 +56,7 @@ function () { }; var nestedAggs = query.aggs.histogram; + target.groupByFields = target.groupByFields || []; for (var i = 0; i < target.groupByFields.length; i++) { var field = target.groupByFields[i].field; @@ -66,9 +67,16 @@ function () { nestedAggs = aggs; } - console.log(angular.toJson(query, true)); + for (var i = 0; i < target.select.length; i++) { + var select = target.select[i]; + if (select.field) { + nestedAggs.aggs = {}; + nestedAggs.aggs[select.field] = {}; + nestedAggs.aggs[select.field][select.agg] = {field: select.field}; + } + } - query = angular.toJson(query); + console.log(angular.toJson(query, true)); return query; }; diff --git a/public/app/plugins/datasource/elasticsearch/queryCtrl.js b/public/app/plugins/datasource/elasticsearch/queryCtrl.js index 9a4b7b2a292..fd59220b7aa 100644 --- a/public/app/plugins/datasource/elasticsearch/queryCtrl.js +++ b/public/app/plugins/datasource/elasticsearch/queryCtrl.js @@ -36,7 +36,7 @@ function (angular, _, ElasticQueryBuilder) { if ($scope.selectSegments.length > 0) { $scope.selectSegments.push(uiSegmentSrv.newCondition(" and ")); } - if (select.agg === 'Count') { + if (select.agg === 'count') { $scope.selectSegments.push(uiSegmentSrv.newSegment({value: select.agg, type: 'agg'})); } else { $scope.selectSegments.push(uiSegmentSrv.newSegment({value: select.agg, type: 'agg'})); @@ -53,10 +53,10 @@ function (angular, _, ElasticQueryBuilder) { $scope.getSelectSegments = function(segment, index) { if (segment.type === 'agg' || segment.type === 'plus-button') { var options = [ - uiSegmentSrv.newSegment({value: 'Count', type: 'agg'}), - uiSegmentSrv.newSegment({value: 'Min', type: 'agg'}), - uiSegmentSrv.newSegment({value: 'Max', type: 'agg'}), - uiSegmentSrv.newSegment({value: 'Avg', type: 'agg'}), + uiSegmentSrv.newSegment({value: 'count', type: 'agg'}), + uiSegmentSrv.newSegment({value: 'min', type: 'agg', reqField: true}), + uiSegmentSrv.newSegment({value: 'count', type: 'agg', reqField: true}), + uiSegmentSrv.newSegment({value: 'avg', type: 'agg', reqField: true}), ]; if (index > 0) { options.splice(0, 0, angular.copy($scope.removeSelectSegment)); @@ -90,10 +90,8 @@ function (angular, _, ElasticQueryBuilder) { if (segment.type === 'agg') { var nextSegment = $scope.selectSegments[index + 1]; - if (segment.value === 'Count') { - if (nextSegment && nextSegment.type === 'field') { - $scope.selectSegments.splice(index + 1, 1); - } + if (!segment.reqField && nextSegment && nextSegment.type === 'field') { + $scope.selectSegments.splice(index + 1, 1); } else if (!nextSegment || nextSegment.type !== 'field') { $scope.selectSegments.splice(index + 1, 0, uiSegmentSrv.newSegment({value: 'select field', fake: true, type: 'field'})); } @@ -112,7 +110,7 @@ function (angular, _, ElasticQueryBuilder) { var segment = $scope.selectSegments[i]; var select = {agg: segment.value }; - if (segment.type === 'agg' && segment.value !== 'Count') { + if (segment.type === 'agg' && segment.reqField) { select.field = $scope.selectSegments[i+1].value; i += 2; } else { diff --git a/public/test/specs/elasticsearch-querybuilder-specs.js b/public/test/specs/elasticsearch-querybuilder-specs.js new file mode 100644 index 00000000000..00a8cc56af8 --- /dev/null +++ b/public/test/specs/elasticsearch-querybuilder-specs.js @@ -0,0 +1,34 @@ +define([ + 'plugins/datasource/elasticsearch/queryBuilder' +], function(ElasticQueryBuilder) { + 'use strict'; + + describe('ElasticQueryBuilder', function() { + + it('with defaults', function() { + var builder = new ElasticQueryBuilder(); + + var query = builder.build({ + select: [{agg: 'Count'}], + groupByFields: [], + }, 100, 1000); + + expect(query.query.filtered.filter.bool.must[0].range["@timestamp"].gte).to.be(100); + expect(query.aggs.histogram.date_histogram.extended_bounds.min).to.be(100); + }); + + it('with select field', function() { + var builder = new ElasticQueryBuilder(); + + var query = builder.build({ + select: [{agg: 'Avg', field: '@value'}], + groupByFields: [], + }, 100, 1000); + + expect(query.query.filtered.filter.bool.must[0].range["@timestamp"].gte).to.be(100); + }); + + + }); + +}); diff --git a/public/test/specs/elasticsearch-specs.js b/public/test/specs/elasticsearch-specs.js index 0e4b7f04580..e73e6616fd1 100644 --- a/public/test/specs/elasticsearch-specs.js +++ b/public/test/specs/elasticsearch-specs.js @@ -97,7 +97,7 @@ define([ }); }); - describe('two group by query', function() { + describe('group by query 2 fields', function() { var result; beforeEach(function() { diff --git a/public/test/test-main.js b/public/test/test-main.js index 336b5e306eb..dff1a79ac13 100644 --- a/public/test/test-main.js +++ b/public/test/test-main.js @@ -153,6 +153,7 @@ require([ 'specs/opentsdbDatasource-specs', 'specs/cloudwatch-datasource-specs', 'specs/elasticsearch-specs', + 'specs/elasticsearch-querybuilder-specs', ]; var pluginSpecs = (config.plugins.specs || []).map(function (spec) {