From 3e9aca3ed4c568f447fad2eb49df552b5ff81f5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Sat, 5 Sep 2015 15:41:04 +0200 Subject: [PATCH] feat(elasticsearch): terms aggregation options are working, things are starting to come together, #1034 --- .../elasticsearch/advancedOptions.js | 23 --- .../datasource/elasticsearch/bucketAgg.js | 153 ++++++++---------- .../datasource/elasticsearch/directives.js | 28 ++++ .../datasource/elasticsearch/metricAgg.js | 96 +++++------ .../elasticsearch/partials/bucketAgg.html | 2 +- .../datasource/elasticsearch/queryCtrl.js | 23 +-- .../datasource/elasticsearch/queryDef.js | 79 +++++++++ 7 files changed, 216 insertions(+), 188 deletions(-) delete mode 100644 public/app/plugins/datasource/elasticsearch/advancedOptions.js create mode 100644 public/app/plugins/datasource/elasticsearch/queryDef.js diff --git a/public/app/plugins/datasource/elasticsearch/advancedOptions.js b/public/app/plugins/datasource/elasticsearch/advancedOptions.js deleted file mode 100644 index aa8a1eb6007..00000000000 --- a/public/app/plugins/datasource/elasticsearch/advancedOptions.js +++ /dev/null @@ -1,23 +0,0 @@ -define([ - 'angular', - 'lodash', - 'jquery', -], -function (angular, _, $) { - 'use strict'; - - angular - .module('grafana.directives') - .directive('tightFormAdvancedOption', function($compile, uiSegmentSrv, $q) { - return { - templateUrl: 'app/plugins/datasource/elasticsearch/partials/advancedOption.html', - restrict: 'E', - scope: { - model: "=", - option: "=", - }, - link: function postLink($scope, elem) { - } - }; - }); -}); diff --git a/public/app/plugins/datasource/elasticsearch/bucketAgg.js b/public/app/plugins/datasource/elasticsearch/bucketAgg.js index eeda170544f..03b58569325 100644 --- a/public/app/plugins/datasource/elasticsearch/bucketAgg.js +++ b/public/app/plugins/datasource/elasticsearch/bucketAgg.js @@ -1,112 +1,95 @@ define([ 'angular', 'lodash', - 'jquery', + './queryDef', ], -function (angular, _, $) { +function (angular, _, queryDef) { 'use strict'; var module = angular.module('grafana.directives'); - module.controller('ElasticBucketAggCtrl', function($scope, uiSegmentSrv, $q) { - var bucketAggs = $scope.target.bucketAggs; + module.controller('ElasticBucketAggCtrl', function($scope, uiSegmentSrv, $q, $rootScope) { + var bucketAggs = $scope.target.bucketAggs; - $scope.bucketAggTypes = [ - {text: "Terms", value: 'terms' }, - {text: "Date Histogram", value: 'date_histogram' }, - ]; + $scope.orderByOptions = []; + $scope.bucketAggTypes = queryDef.bucketAggTypes; + $scope.orderOptions = queryDef.orderOptions; + $scope.sizeOptions = queryDef.sizeOptions; - $scope.orderOptions = [ - {text: "Top", value: 'desc' }, - {text: "Bottom", value: 'asc' }, - ]; + $rootScope.onAppEvent('elastic-query-updated', function() { + $scope.validateModel(); + $scope.updateOrderByOptions(); + }); - $scope.sizeOptions = [ - {text: "No limit", value: '0' }, - {text: "1", value: '1' }, - {text: "2", value: '2' }, - {text: "3", value: '4' }, - {text: "5", value: '5' }, - {text: "10", value: '10' }, - {text: "15", value: '15' }, - {text: "20", value: '20' }, - ]; + $scope.init = function() { + $scope.agg = bucketAggs[$scope.index]; + $scope.validateModel(); + }; - $scope.$watch("index", function() { - $scope.isFirst = $scope.index === 0; - $scope.isLast = $scope.index === bucketAggs.length - 1; - }); + $scope.onChangeInternal = function() { + if ($scope.validateModel()) { + $scope.onChange(); + } + }; - $scope.init = function() { - $scope.agg = bucketAggs[$scope.index]; - $scope.modelIsValid(); - }; + $scope.validateModel = function() { + $scope.isFirst = $scope.index === 0; + $scope.isLast = $scope.index === bucketAggs.length - 1; + $scope.aggOptionsString = ""; - $scope.onChangeInternal = function() { - if ($scope.modelIsValid()) { - $scope.onChange(); + if ($scope.agg.type === "terms") { + $scope.agg.order = $scope.agg.order || "desc"; + $scope.agg.size = $scope.agg.size || "0"; + $scope.agg.orderBy = $scope.agg.orderBy || "_count"; + + if ($scope.agg.size === '0') { + $scope.aggOptionsString = ""; + } else { + $scope.aggOptionsString = queryDef.describeOrder($scope.agg.order) + ' ' + $scope.agg.size + ', ' } - }; + $scope.aggOptionsString += 'Order by: ' + queryDef.describeOrderBy($scope.agg.orderBy, $scope.target); - $scope.modelIsValid = function() { - if ($scope.agg.type === "terms") { - $scope.aggOptionsString = "Top 5, Order by: sum @value"; - - $scope.agg.order = $scope.agg.order || "desc"; - $scope.agg.size = $scope.agg.size || "0"; - $scope.agg.orderBy = $scope.agg.orderBy || "_count"; + if ($scope.agg.size === '0') { + $scope.aggOptionsString += ' (' + $scope.agg.order + ')'; } - return true; - }; - - $scope.toggleOptions = function() { - $scope.showOptions = !$scope.showOptions; - - $scope.orderByOptions = [ - {text: "Doc Count", value: '_count' }, - {text: "Term name", value: '_term' }, - {text: "Average of @value", value: '1' }, - ]; } - $scope.addBucketAgg = function() { - // if last is date histogram add it before - var lastBucket = bucketAggs[bucketAggs.length - 1]; - var addIndex = bucketAggs.length - 1; + return true; + }; - if (lastBucket && lastBucket.type === 'date_histogram') { - addIndex - 1; - } + $scope.toggleOptions = function() { + $scope.showOptions = !$scope.showOptions; + $scope.updateOrderByOptions(); + }; - var id = _.reduce($scope.target.bucketAggs.concat($scope.target.metrics), function(max, val) { - return parseInt(val.id) > max ? parseInt(val.id) : max; - }, 0); + $scope.updateOrderByOptions = function() { + $scope.orderByOptions = queryDef.getOrderByOptions($scope.target); + }; - bucketAggs.splice(addIndex, 0, {type: "terms", field: "select field", id: (id+1).toString()}); - }; + $scope.addBucketAgg = function() { + // if last is date histogram add it before + var lastBucket = bucketAggs[bucketAggs.length - 1]; + var addIndex = bucketAggs.length - 1; - $scope.removeBucketAgg = function() { - bucketAggs.splice($scope.index, 1); - $scope.onChange(); - }; + if (lastBucket && lastBucket.type === 'date_histogram') { + addIndex - 1; + } - $scope.init(); + 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.onChange(); + }; + + $scope.removeBucketAgg = function() { + bucketAggs.splice($scope.index, 1); + $scope.onChange(); + }; + + $scope.init(); + + }); - module.directive('elasticBucketAgg', function() { - return { - templateUrl: 'app/plugins/datasource/elasticsearch/partials/bucketAgg.html', - controller: 'ElasticBucketAggCtrl', - restrict: 'E', - scope: { - target: "=", - index: "=", - onChange: "&", - getFields: "&", - }, - link: function postLink($scope, elem) { - } - }; - }); }); diff --git a/public/app/plugins/datasource/elasticsearch/directives.js b/public/app/plugins/datasource/elasticsearch/directives.js index bd8b23de905..57656050cab 100644 --- a/public/app/plugins/datasource/elasticsearch/directives.js +++ b/public/app/plugins/datasource/elasticsearch/directives.js @@ -20,4 +20,32 @@ function (angular) { return {templateUrl: 'app/plugins/datasource/elasticsearch/partials/annotations.editor.html'}; }); + module.directive('elasticMetricAgg', function() { + return { + templateUrl: 'app/plugins/datasource/elasticsearch/partials/metricAgg.html', + controller: 'ElasticMetricAggCtrl', + restrict: 'E', + scope: { + target: "=", + index: "=", + onChange: "&", + getFields: "&", + } + }; + }); + + module.directive('elasticBucketAgg', function() { + return { + templateUrl: 'app/plugins/datasource/elasticsearch/partials/bucketAgg.html', + controller: 'ElasticBucketAggCtrl', + restrict: 'E', + scope: { + target: "=", + index: "=", + onChange: "&", + getFields: "&", + } + }; + }); + }); diff --git a/public/app/plugins/datasource/elasticsearch/metricAgg.js b/public/app/plugins/datasource/elasticsearch/metricAgg.js index 538b543b716..f6670879741 100644 --- a/public/app/plugins/datasource/elasticsearch/metricAgg.js +++ b/public/app/plugins/datasource/elasticsearch/metricAgg.js @@ -1,74 +1,52 @@ define([ 'angular', 'lodash', - 'jquery', + './queryDef' ], -function (angular, _, $) { +function (angular, _, queryDef) { 'use strict'; var module = angular.module('grafana.directives'); - module.controller('ElasticMetricAggCtrl', function($scope, uiSegmentSrv, $q) { - var metricAggs = $scope.target.metrics; + module.controller('ElasticMetricAggCtrl', function($scope, uiSegmentSrv, $q) { + var metricAggs = $scope.target.metrics; - $scope.metricAggTypes = [ - {text: "Count", value: 'count' }, - {text: "Average of", value: 'avg' }, - {text: "Sum of", value: 'sum' }, - {text: "Max of", value: 'max' }, - {text: "Min of", value: 'min' }, - {text: "Standard Deviations", value: 'std_dev' }, - ]; + $scope.metricAggTypes = queryDef.metricAggTypes; - $scope.init = function() { - $scope.agg = metricAggs[$scope.index]; - if (!$scope.agg.field) { - $scope.agg.field = 'select field'; - } + $scope.init = function() { + $scope.agg = metricAggs[$scope.index]; + if (!$scope.agg.field) { + $scope.agg.field = 'select field'; } + } - $scope.$watchCollection("target.metrics", function() { - $scope.isFirst = $scope.index === 0; - $scope.isLast = $scope.index === metricAggs.length - 1; - $scope.isSingle = metricAggs.length === 1; - }); - - $scope.toggleOptions = function() { - $scope.showOptions = !$scope.showOptions; - } - - $scope.addMetricAgg = function() { - var addIndex = metricAggs.length; - - 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() { - metricAggs.splice($scope.index, 1); - $scope.onChange(); - }; - - $scope.init(); - + $scope.$watchCollection("target.metrics", function() { + $scope.isFirst = $scope.index === 0; + $scope.isLast = $scope.index === metricAggs.length - 1; + $scope.isSingle = metricAggs.length === 1; }); - module.directive('elasticMetricAgg', function() { - return { - templateUrl: 'app/plugins/datasource/elasticsearch/partials/metricAgg.html', - controller: 'ElasticMetricAggCtrl', - restrict: 'E', - scope: { - target: "=", - index: "=", - onChange: "&", - getFields: "&", - }, - link: function postLink($scope, elem) { - } - }; - }); + $scope.toggleOptions = function() { + $scope.showOptions = !$scope.showOptions; + } + + $scope.addMetricAgg = function() { + var addIndex = metricAggs.length; + + 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() { + metricAggs.splice($scope.index, 1); + $scope.onChange(); + }; + + $scope.init(); + + }); + }); diff --git a/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html b/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html index f2c440c1c4b..e89230f0c97 100644 --- a/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html +++ b/public/app/plugins/datasource/elasticsearch/partials/bucketAgg.html @@ -51,7 +51,7 @@