Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Percentile Agg #2486

Merged
merged 41 commits into from
Jan 9, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
89a30bc
Merge remote-tracking branch 'pr/default-values' into multiValueMetri…
Dec 30, 2014
2973aea
[aggTypes] split metric aggs into files
Dec 30, 2014
b280030
[discover] clear fetchStatus when the fetch is complete
Dec 30, 2014
c31d079
[aggTypes] update aggTypes to use new Bucket/MetricAggType classes
Dec 30, 2014
9173cbb
[tabify] [aggTypes/metrics] let the aggType get the metric values
Dec 30, 2014
bfbb4a5
[tabify] allow replacing an agg with other aggs
Dec 30, 2014
043633e
[aggTypes/metrics] setup the percentile aggType
Dec 30, 2014
8ac4197
Merge branch 'list_input_directive' into multiValueMetricAggs
Dec 30, 2014
feb0d13
switch to pecent-list
Dec 30, 2014
4cfff47
Merge branch 'ordinalSuffix' into multiValueMetricAggs
Dec 30, 2014
4b14f0c
[aggTypes/percentiles] use ordinalSuffix util for better labels
Dec 30, 2014
ee4002c
Merge branch 'orderTermsOnMetric' into multiValueMetricAggs
Jan 4, 2015
e8e70a4
[aggConfigs/responseValueAggs] standardize naming
Jan 4, 2015
7657b09
[aggConfigs/responseValueAggs] add getter to AggConfigs
Jan 4, 2015
1a4b9c8
Merge branch 'orderTermsOnMetric' into multiValueMetricAggs
Jan 4, 2015
47d2645
[aggConfigs/responseValueAggs] standardize naming further
Jan 5, 2015
79a7149
[visualize/editor] propogate move to child scopes in editor
Jan 5, 2015
2e20c6e
[visualize/editor] use metric response aggs for sorting
Jan 5, 2015
0d7d4c8
[visualize/editor] allow sorting by a multi-value metric response
Jan 5, 2015
7dd0705
[editor/visualize] prevent order agg on percentiles
Jan 5, 2015
2ab365a
[vis/aggConfigs] added tests for #getResponseAggs
Jan 5, 2015
270d2c6
[aggTypes/aggParams] remove unused feature
Jan 5, 2015
d14d211
[AggType] added tests to validate getResponseAggs config
Jan 5, 2015
c4176c9
[aggTypes] tests that all AggTypes extend proper classes
Jan 5, 2015
8dfd0ca
Merge branch 'master' into multiValueMetricAggs
Jan 7, 2015
2919104
ensure that agg ids are always strings
Jan 7, 2015
a2c0b98
[visualize/editor/terms] orderAgg id extends termsAgg id so it is alw…
Jan 7, 2015
fda0572
[visualize/editor] limit replace:true so directive boundries are more…
Jan 7, 2015
edfa33d
[$watchMulti] added collection and deep equality watching
Jan 7, 2015
93552bf
[visualize/editor] update add-agg form to match new vis wizard
Jan 7, 2015
597ceb7
[visualize/editor] clean up some outdated references
Jan 7, 2015
64b9f37
[aggTypes/terms] support old states which do not have an orderAgg
Jan 7, 2015
8b35900
[editor/nestingIndicator] simplify
Jan 7, 2015
d59ecc6
fix reference to old params obj
Jan 8, 2015
f165319
[aggConfig] wrap sub agg ids that have periods
Jan 8, 2015
99c3f00
[aggTypes/percentile] split the percents into individual inputs
Jan 8, 2015
5a65e0d
[aggTypes/percentiles] tie in the add and remove buttons
Jan 9, 2015
f6f883c
[aggTypes/percentile] move key map into util file
Jan 9, 2015
f9ee0b2
[aggTypes/percentile] updated tests
Jan 9, 2015
7cbc474
[aggConfigs] harden #getResponseAggById()
Jan 9, 2015
f656731
[$watchMulti] spelling error [ci skip]
Jan 9, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/kibana/components/agg_response/tabify/_get_columns.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ define(function (require) {
var AggConfig = Private(require('components/vis/_agg_config'));

return function getColumns(vis, minimal) {
var aggs = vis.aggs.getSorted();
var aggs = vis.aggs.getResponseAggs();

if (minimal == null) minimal = !vis.isHierarchical();

if (!vis.aggs.bySchemaGroup.metrics) {
Expand Down
5 changes: 2 additions & 3 deletions src/kibana/components/agg_response/tabify/tabify.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,10 @@ define(function (require) {
*/
function collectBucket(write, bucket, key) {
var agg = write.aggStack.shift();
var aggResp = bucket[agg.id];

switch (agg.schema.group) {
case 'buckets':
var buckets = new Buckets(aggResp);
var buckets = new Buckets(bucket[agg.id]);
if (buckets.length) {
var splitting = write.canSplit && agg.schema.name === 'split';
if (splitting) {
Expand Down Expand Up @@ -62,7 +61,7 @@ define(function (require) {
}
break;
case 'metrics':
var value = (agg.type.name === 'count') ? bucketCount(bucket) : metricValue(aggResp);
var value = agg.getValue(bucket);
write.cell(agg, value, function () {
if (!write.aggStack.length) {
// row complete
Expand Down
9 changes: 1 addition & 8 deletions src/kibana/components/agg_types/_agg_params.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,7 @@ define(function (require) {
initialSet: params.map(function (config) {
var type = config.name === 'field' ? config.name : config.type;
var Class = paramTypeMap[type] || paramTypeMap._default;
var param = new Class(config);

// recursively init sub params
if (param.params && !(params.params instanceof AggParams)) {
param.params = new AggParams(param.params);
}

return param;
return new Class(config);
})
});
}
Expand Down
12 changes: 12 additions & 0 deletions src/kibana/components/agg_types/_agg_type.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,18 @@ define(function (require) {

this.params = new AggParams(this.params);
}

/**
* Designed for multi-value metric aggs, this method can return a
* set of AggConfigs that should replace this aggConfig in result sets
* that walk the AggConfig set.
*
* @method getResponseAggs
* @returns {array[AggConfig]|undefined} - an array of aggConfig objects
* that should replace this one,
* or undefined
*/
this.getResponseAggs = config.getResponseAggs || _.noop;
}

return AggType;
Expand Down
13 changes: 13 additions & 0 deletions src/kibana/components/agg_types/buckets/_bucket_agg_type.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
define(function (require) {
return function BucketAggTypeProvider(Private) {
var _ = require('lodash');
var AggType = Private(require('components/agg_types/_agg_type'));

_(BucketAggType).inherits(AggType);
function BucketAggType(config) {
BucketAggType.Super.call(this, config);
}

return BucketAggType;
};
});
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ define(function (require) {
* @return {null|number}
*/
function bucketCountBetween(aggConfigA, aggConfigB) {
var aggs = aggConfigA.vis.aggs.getSorted();
var aggs = aggConfigA.vis.aggs.getRequestAggs();

var aIndex = aggs.indexOf(aggConfigA);
var bIndex = aggs.indexOf(aggConfigB);
Expand Down
4 changes: 2 additions & 2 deletions src/kibana/components/agg_types/buckets/date_histogram.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ define(function (require) {
var _ = require('lodash');
var moment = require('moment');
var interval = require('utils/interval');
var AggType = Private(require('components/agg_types/_agg_type'));
var BucketAggType = Private(require('components/agg_types/buckets/_bucket_agg_type'));
var calculateInterval = Private(require('components/agg_types/param_types/_calculate_interval'));

var createFilter = Private(require('components/agg_types/buckets/create_filter/date_histogram'));
Expand All @@ -15,7 +15,7 @@ define(function (require) {
return interval.calculate(bounds.min, bounds.max, targetBuckets);
};

return new AggType({
return new BucketAggType({
name: 'date_histogram',
title: 'Date Histogram',
ordered: {
Expand Down
4 changes: 2 additions & 2 deletions src/kibana/components/agg_types/buckets/filters.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
define(function (require) {
return function FiltersAggDefinition(Private, Notifier) {
var _ = require('lodash');
var AggType = Private(require('components/agg_types/_agg_type'));
var BucketAggType = Private(require('components/agg_types/buckets/_bucket_agg_type'));
var createFilter = Private(require('components/agg_types/buckets/create_filter/filters'));
var decorateQuery = Private(require('components/courier/data_source/_decorate_query'));
var notif = new Notifier({ location: 'Filters Agg' });

return new AggType({
return new BucketAggType({
name: 'filters',
title: 'Filters',
createFilter: createFilter,
Expand Down
4 changes: 2 additions & 2 deletions src/kibana/components/agg_types/buckets/geo_hash.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ define(function (require) {
return function GeoHashAggDefinition(Private, config) {
var _ = require('lodash');
var moment = require('moment');
var AggType = Private(require('components/agg_types/_agg_type'));
var BucketAggType = Private(require('components/agg_types/buckets/_bucket_agg_type'));
var defaultPrecision = 3;

function getPrecision(precision) {
Expand All @@ -21,7 +21,7 @@ define(function (require) {
return precision;
}

return new AggType({
return new BucketAggType({
name: 'geohash_grid',
title: 'Geohash',
ordered: {},
Expand Down
4 changes: 2 additions & 2 deletions src/kibana/components/agg_types/buckets/histogram.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ define(function (require) {
return function HistogramAggDefinition(Private) {
var _ = require('lodash');
var moment = require('moment');
var AggType = Private(require('components/agg_types/_agg_type'));
var BucketAggType = Private(require('components/agg_types/buckets/_bucket_agg_type'));
var createFilter = Private(require('components/agg_types/buckets/create_filter/histogram'));

return new AggType({
return new BucketAggType({
name: 'histogram',
title: 'Histogram',
ordered: {},
Expand Down
4 changes: 2 additions & 2 deletions src/kibana/components/agg_types/buckets/range.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ define(function (require) {
var _ = require('lodash');
var moment = require('moment');
var angular = require('angular');
var AggType = Private(require('components/agg_types/_agg_type'));
var BucketAggType = Private(require('components/agg_types/buckets/_bucket_agg_type'));
var createFilter = Private(require('components/agg_types/buckets/create_filter/range'));

return new AggType({
return new BucketAggType({
name: 'range',
title: 'Range',
createFilter: createFilter,
Expand Down
4 changes: 2 additions & 2 deletions src/kibana/components/agg_types/buckets/significant_terms.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
define(function (require) {
return function SignificantTermsAggDefinition(Private) {
var _ = require('lodash');
var AggType = Private(require('components/agg_types/_agg_type'));
var BucketAggType = Private(require('components/agg_types/buckets/_bucket_agg_type'));
var createFilter = Private(require('components/agg_types/buckets/create_filter/terms'));

return new AggType({
return new BucketAggType({
name: 'significant_terms',
title: 'Significant Terms',
makeLabel: function (aggConfig) {
Expand Down
81 changes: 59 additions & 22 deletions src/kibana/components/agg_types/buckets/terms.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
define(function (require) {
return function TermsAggDefinition(Private) {
var _ = require('lodash');
var AggType = Private(require('components/agg_types/_agg_type'));
var BucketAggType = Private(require('components/agg_types/buckets/_bucket_agg_type'));
var bucketCountBetween = Private(require('components/agg_types/buckets/_bucket_count_between'));
var AggConfig = Private(require('components/vis/_agg_config'));
var Schemas = Private(require('plugins/vis_types/_schemas'));
var createFilter = Private(require('components/agg_types/buckets/create_filter/terms'));

return new AggType({
var orderAggSchema = (new Schemas([
{
group: 'none',
name: 'orderAgg',
title: 'Order Agg',
aggFilter: '!percentiles'
}
])).all[0];

return new BucketAggType({
name: 'terms',
title: 'Terms',
makeLabel: function (agg) {
Expand Down Expand Up @@ -56,8 +67,15 @@ define(function (require) {
serialize: function (orderAgg) {
return orderAgg.toJSON();
},
deserialize: function (stateJSON, aggConfig) {
return new AggConfig(aggConfig.vis, stateJSON);
deserialize: function (state, agg) {
return this.makeOrderAgg(agg, state);
},
makeOrderAgg: function (termsAgg, state) {
state = state || {};
state.schema = orderAggSchema;
var orderAgg = new AggConfig(termsAgg.vis, state);
orderAgg.id = termsAgg.id + '-orderAgg';
return orderAgg;
},
controller: function ($scope) {
$scope.safeMakeLabel = function (agg) {
Expand All @@ -68,43 +86,62 @@ define(function (require) {
}
};

$scope.$watch('agg.params.orderBy', function (orderBy, prevOrderBy) {
var INIT = {}; // flag to know when prevOrderBy has changed
var prevOrderBy = INIT;

$scope.$watch('responseValueAggs', updateOrderAgg);
$scope.$watch('agg.params.orderBy', updateOrderAgg);

function updateOrderAgg() {
var agg = $scope.agg;
var aggs = agg.vis.aggs;
var params = agg.params;
var orderBy = params.orderBy;
var paramDef = agg.type.params.byName.orderAgg;

if (orderBy === prevOrderBy && !orderBy) {
params.orderBy = (_.first(aggs.bySchemaGroup.metrics) || { id: 'custom' }).id;
// setup the initial value of orderBy
if (!orderBy && prevOrderBy === INIT) {
// abort until we get the responseValueAggs
if (!$scope.responseValueAggs) return;
params.orderBy = (_.first($scope.responseValueAggs) || { id: 'custom' }).id;
return;
}

if (!orderBy) return;
if (orderBy !== 'custom') {
// track the previous value
prevOrderBy = orderBy;

// we aren't creating a custom aggConfig
if (!orderBy || orderBy !== 'custom') {
params.orderAgg = null;
// ensure that orderBy is set to a valid agg
if (!_.find($scope.responseValueAggs, { id: orderBy })) {
params.orderBy = null;
}
return;
}
if (params.orderAgg) return;

params.orderAgg = new AggConfig(agg.vis, {
schema: _.first(agg.vis.type.schemas.metrics)
});
});
params.orderAgg = params.orderAgg || paramDef.makeOrderAgg(agg);
}
},
write: function (agg, output) {
var vis = agg.vis;
var dir = agg.params.order.val;
var order = output.params.order = {};

var orderAgg = agg.params.orderAgg;
if (!orderAgg) {
orderAgg = agg.vis.aggs.byId[agg.params.orderBy];
}
var orderAgg = agg.params.orderAgg || vis.aggs.getResponseAggById(agg.params.orderBy);

if (orderAgg.type.name === 'count') {
if (!orderAgg || orderAgg.type.name === 'count') {
order._count = dir;
} else {
output.subAggs = (output.subAggs || []).concat(orderAgg);
order[orderAgg.id] = dir;
return;
}

var orderAggId = orderAgg.id;
if (orderAgg.parentId) {
orderAgg = vis.aggs.byId[orderAgg.parentId];
}

output.subAggs = (output.subAggs || []).concat(orderAgg);
order[orderAggId] = dir;
}
}
]
Expand Down
Loading