mirror of
https://github.com/elastic/kibana.git
synced 2025-04-25 10:23:14 -04:00
Merge pull request #3470 from drej82/master
Add percentile ranks metric support
This commit is contained in:
commit
e4d45e6e75
7 changed files with 112 additions and 12 deletions
|
@ -8,14 +8,16 @@ define(function (require) {
|
||||||
|
|
||||||
require('modules')
|
require('modules')
|
||||||
.get('kibana')
|
.get('kibana')
|
||||||
.directive('percentList', function ($parse) {
|
.directive('valuesList', function ($parse) {
|
||||||
return {
|
return {
|
||||||
restrict: 'A',
|
restrict: 'A',
|
||||||
require: 'ngModel',
|
require: 'ngModel',
|
||||||
link: function ($scope, $el, attrs, ngModelController) {
|
link: function ($scope, $el, attrs, ngModelController) {
|
||||||
var $setModel = $parse(attrs.ngModel).assign;
|
var $setModel = $parse(attrs.ngModel).assign;
|
||||||
var $repeater = $el.closest('[ng-repeat]');
|
var $repeater = $el.closest('[ng-repeat]');
|
||||||
var $listGetter = $parse(attrs.percentList);
|
var $listGetter = $parse(attrs.valuesList);
|
||||||
|
var $minValue = $parse(attrs.valuesListMin);
|
||||||
|
var $maxValue = $parse(attrs.valuesListMax);
|
||||||
|
|
||||||
var handlers = {
|
var handlers = {
|
||||||
up: change(add, 1),
|
up: change(add, 1),
|
||||||
|
@ -42,7 +44,7 @@ define(function (require) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function $get(dir) {
|
function $get(dir) {
|
||||||
return $repeater[dir]().find('[percent-list]');
|
return $repeater[dir]().find('[values-list]');
|
||||||
}
|
}
|
||||||
|
|
||||||
function go(dir) {
|
function go(dir) {
|
||||||
|
@ -122,8 +124,8 @@ define(function (require) {
|
||||||
if (isNaN(num)) return INVALID;
|
if (isNaN(num)) return INVALID;
|
||||||
|
|
||||||
var list = $listGetter($scope);
|
var list = $listGetter($scope);
|
||||||
var min = list[$scope.$index - 1] || 0;
|
var min = list[$scope.$index - 1] || $minValue($scope);
|
||||||
var max = list[$scope.$index + 1] || 100;
|
var max = list[$scope.$index + 1] || $maxValue($scope);
|
||||||
|
|
||||||
if (num <= min || num >= max) return INVALID;
|
if (num <= min || num >= max) return INVALID;
|
||||||
|
|
||||||
|
@ -140,7 +142,7 @@ define(function (require) {
|
||||||
}
|
}
|
||||||
], function () {
|
], function () {
|
||||||
var valid = parse(ngModelController.$viewValue) !== INVALID;
|
var valid = parse(ngModelController.$viewValue) !== INVALID;
|
||||||
ngModelController.$setValidity('percentList', valid);
|
ngModelController.$setValidity('valuesList', valid);
|
||||||
});
|
});
|
||||||
|
|
||||||
function validate(then) {
|
function validate(then) {
|
||||||
|
@ -148,7 +150,7 @@ define(function (require) {
|
||||||
var value = parse(input);
|
var value = parse(input);
|
||||||
var valid = value !== INVALID;
|
var valid = value !== INVALID;
|
||||||
value = valid ? value : void 0;
|
value = valid ? value : void 0;
|
||||||
ngModelController.$setValidity('percentList', valid);
|
ngModelController.$setValidity('valuesList', valid);
|
||||||
then && then(input, value);
|
then && then(input, value);
|
||||||
return value;
|
return value;
|
||||||
};
|
};
|
|
@ -6,7 +6,9 @@
|
||||||
|
|
||||||
<input
|
<input
|
||||||
ng-model="agg.params.percents[$index]"
|
ng-model="agg.params.percents[$index]"
|
||||||
percent-list="agg.params.percents"
|
values-list="agg.params.percents"
|
||||||
|
values-list-min="0"
|
||||||
|
values-list-max="100"
|
||||||
input-focus
|
input-focus
|
||||||
class="form-control">
|
class="form-control">
|
||||||
|
|
||||||
|
|
30
src/kibana/components/agg_types/controls/values.html
Normal file
30
src/kibana/components/agg_types/controls/values.html
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
<div class="form-group" ng-controller="agg.type.params.byName.values.controller">
|
||||||
|
<label>Values</label>
|
||||||
|
<div
|
||||||
|
ng-repeat="value in agg.params.values track by $index"
|
||||||
|
class="form-group vis-editor-agg-form-row vis-editor-agg-form-row">
|
||||||
|
|
||||||
|
<input
|
||||||
|
ng-model="agg.params.values[$index]"
|
||||||
|
values-list="agg.params.values"
|
||||||
|
values-list-min="0"
|
||||||
|
input-focus
|
||||||
|
class="form-control">
|
||||||
|
|
||||||
|
<button type="button" ng-click="remove($index, 1)" class="btn btn-danger btn-xs">
|
||||||
|
<i class="fa fa-times"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input ng-model="validLength" name="validLength" required type="hidden">
|
||||||
|
<p ng-show="aggForm.validLength.$invalid" class="text-danger text-center">
|
||||||
|
You must specify at least one value
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<button
|
||||||
|
ng-click="add()"
|
||||||
|
type="button"
|
||||||
|
class="sidebar-item-button primary">
|
||||||
|
<i class="fa fa-plus"></i> Add value
|
||||||
|
</button>
|
||||||
|
</div>
|
|
@ -11,7 +11,8 @@ define(function (require) {
|
||||||
Private(require('components/agg_types/metrics/max')),
|
Private(require('components/agg_types/metrics/max')),
|
||||||
Private(require('components/agg_types/metrics/std_deviation')),
|
Private(require('components/agg_types/metrics/std_deviation')),
|
||||||
Private(require('components/agg_types/metrics/cardinality')),
|
Private(require('components/agg_types/metrics/cardinality')),
|
||||||
Private(require('components/agg_types/metrics/percentiles'))
|
Private(require('components/agg_types/metrics/percentiles')),
|
||||||
|
Private(require('components/agg_types/metrics/percentileranks'))
|
||||||
],
|
],
|
||||||
buckets: [
|
buckets: [
|
||||||
Private(require('components/agg_types/buckets/date_histogram')),
|
Private(require('components/agg_types/buckets/date_histogram')),
|
||||||
|
|
63
src/kibana/components/agg_types/metrics/percentileranks.js
Normal file
63
src/kibana/components/agg_types/metrics/percentileranks.js
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
define(function (require) {
|
||||||
|
return function AggTypeMetricPercentileRanksProvider(Private) {
|
||||||
|
var _ = require('lodash');
|
||||||
|
|
||||||
|
var MetricAggType = Private(require('components/agg_types/metrics/_metric_agg_type'));
|
||||||
|
var getResponseAggConfig = Private(require('components/agg_types/metrics/_get_response_agg_config'));
|
||||||
|
|
||||||
|
require('components/agg_types/controls/_values_list');
|
||||||
|
var valuesEditor = require('text!components/agg_types/controls/values.html');
|
||||||
|
|
||||||
|
var valueProps = {
|
||||||
|
makeLabel: function () {
|
||||||
|
return 'Percentile rank ' + this.key + ' of "' + this.fieldDisplayName() + '"';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return new MetricAggType({
|
||||||
|
name: 'percentile_ranks',
|
||||||
|
title: 'Percentile Ranks',
|
||||||
|
makeLabel: function (agg) {
|
||||||
|
return 'Percentile ranks of ' + agg.fieldDisplayName();
|
||||||
|
},
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
name: 'field',
|
||||||
|
filterFieldTypes: 'number'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'values',
|
||||||
|
editor: valuesEditor,
|
||||||
|
default: [10],
|
||||||
|
controller: function ($scope) {
|
||||||
|
$scope.remove = function (index) {
|
||||||
|
$scope.agg.params.values.splice(index, 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.add = function () {
|
||||||
|
$scope.agg.params.values.push(_.last($scope.agg.params.values) + 1);
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.$watchCollection('agg.params.values', function (values) {
|
||||||
|
$scope.validLength = _.size(values) || null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
getResponseAggs: function (agg) {
|
||||||
|
var ValueAggConfig = getResponseAggConfig(agg, valueProps);
|
||||||
|
|
||||||
|
return agg.params.values.map(function (value) {
|
||||||
|
return new ValueAggConfig(value);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
getValue: function (agg, bucket) {
|
||||||
|
// values for 1, 5, and 10 will come back as 1.0, 5.0, and 10.0 so we
|
||||||
|
// parse the keys and respond with the value that matches
|
||||||
|
return _.find(bucket[agg.parentId].values, function (value, key) {
|
||||||
|
return agg.key === parseFloat(key);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
});
|
|
@ -6,7 +6,7 @@ define(function (require) {
|
||||||
var getResponseAggConfig = Private(require('components/agg_types/metrics/_get_response_agg_config'));
|
var getResponseAggConfig = Private(require('components/agg_types/metrics/_get_response_agg_config'));
|
||||||
var ordinalSuffix = require('utils/ordinal_suffix');
|
var ordinalSuffix = require('utils/ordinal_suffix');
|
||||||
|
|
||||||
require('components/agg_types/controls/_percent_list');
|
require('components/agg_types/controls/_values_list');
|
||||||
var percentEditor = require('text!components/agg_types/controls/percents.html');
|
var percentEditor = require('text!components/agg_types/controls/percents.html');
|
||||||
|
|
||||||
var valueProps = {
|
var valueProps = {
|
||||||
|
|
|
@ -4,7 +4,7 @@ define(function (require) {
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
var simulateKeys = require('test_utils/simulate_keys');
|
var simulateKeys = require('test_utils/simulate_keys');
|
||||||
|
|
||||||
require('components/agg_types/controls/_percent_list');
|
require('components/agg_types/controls/_values_list');
|
||||||
|
|
||||||
var $el;
|
var $el;
|
||||||
var $scope;
|
var $scope;
|
||||||
|
@ -20,7 +20,9 @@ define(function (require) {
|
||||||
$('<input>')
|
$('<input>')
|
||||||
.attr('ng-model', 'vals[$index]')
|
.attr('ng-model', 'vals[$index]')
|
||||||
.attr('ng-repeat', 'val in vals')
|
.attr('ng-repeat', 'val in vals')
|
||||||
.attr('percent-list', 'vals')
|
.attr('values-list', 'vals')
|
||||||
|
.attr('values-list-min', '0')
|
||||||
|
.attr('values-list-max', '100')
|
||||||
);
|
);
|
||||||
compile = function (vals) {
|
compile = function (vals) {
|
||||||
$scope.vals = vals || [];
|
$scope.vals = vals || [];
|
Loading…
Add table
Add a link
Reference in a new issue