From c8484e40fca036c68c481193eece4dd30efc1924 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Mon, 6 Feb 2017 16:47:33 +0100 Subject: [PATCH 01/10] allow parent aggs to have sub aggs defined --- src/ui/public/vis/agg_config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/public/vis/agg_config.js b/src/ui/public/vis/agg_config.js index 2be2834bd078e..9497366c7fe12 100644 --- a/src/ui/public/vis/agg_config.js +++ b/src/ui/public/vis/agg_config.js @@ -210,6 +210,7 @@ export default function AggConfigFactory(Private, fieldTypeFilter) { configDsl[this.type.dslName || this.type.name] = output.params; // if the config requires subAggs, write them to the dsl as well + if (this.subAggs && !output.subAggs) output.subAggs = this.subAggs; if (output.subAggs) { const subDslLvl = configDsl.aggs || (configDsl.aggs = {}); output.subAggs.forEach(function nestAdhocSubAggs(subAggConfig) { From aea3cbf953b31432971f7c9382e774b5118f0f18 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Mon, 6 Feb 2017 17:12:36 +0100 Subject: [PATCH 02/10] adding bucket_sum aggregation --- .../public/agg_types/controls/sub_metric.html | 14 +++ src/ui/public/agg_types/index.js | 4 +- src/ui/public/agg_types/metrics/bucket_sum.js | 18 ++++ .../lib/sibling_pipeline_agg_controller.js | 31 +++++++ .../lib/sibling_pipeline_agg_helper.js | 86 +++++++++++++++++++ .../lib/sibling_pipeline_agg_writter.js | 19 ++++ 6 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 src/ui/public/agg_types/controls/sub_metric.html create mode 100644 src/ui/public/agg_types/metrics/bucket_sum.js create mode 100644 src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_controller.js create mode 100644 src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js create mode 100644 src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_writter.js diff --git a/src/ui/public/agg_types/controls/sub_metric.html b/src/ui/public/agg_types/controls/sub_metric.html new file mode 100644 index 0000000000000..88011451676be --- /dev/null +++ b/src/ui/public/agg_types/controls/sub_metric.html @@ -0,0 +1,14 @@ +
+
+ +
+ + + + +
+
+ +
diff --git a/src/ui/public/agg_types/index.js b/src/ui/public/agg_types/index.js index 5f735860e0cf7..15d68fe4370b5 100644 --- a/src/ui/public/agg_types/index.js +++ b/src/ui/public/agg_types/index.js @@ -24,6 +24,7 @@ import AggTypesBucketsTermsProvider from 'ui/agg_types/buckets/terms'; import AggTypesBucketsFiltersProvider from 'ui/agg_types/buckets/filters'; import AggTypesBucketsSignificantTermsProvider from 'ui/agg_types/buckets/significant_terms'; import AggTypesBucketsGeoHashProvider from 'ui/agg_types/buckets/geo_hash'; +import AggTypesMetricsBucketSumProvider from 'ui/agg_types/metrics/bucket_sum'; export default function AggTypeService(Private) { const aggs = { @@ -42,7 +43,8 @@ export default function AggTypeService(Private) { Private(AggTypesMetricsDerivativeProvider), Private(AggTypesMetricsCumulativeSumProvider), Private(AggTypesMetricsMovingAvgProvider), - Private(AggTypesMetricsSerialDiffProvider) + Private(AggTypesMetricsSerialDiffProvider), + Private(AggTypesMetricsBucketSumProvider), ], buckets: [ Private(AggTypesBucketsDateHistogramProvider), diff --git a/src/ui/public/agg_types/metrics/bucket_sum.js b/src/ui/public/agg_types/metrics/bucket_sum.js new file mode 100644 index 0000000000000..ea067e82e46b6 --- /dev/null +++ b/src/ui/public/agg_types/metrics/bucket_sum.js @@ -0,0 +1,18 @@ +import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_agg_type'; +import { makeNestedLabel } from './lib/make_nested_label'; +import SiblingPipelineAggHelperProvider from './lib/sibling_pipeline_agg_helper'; + + +export default function AggTypeMetricDerivativeProvider(Private) { + const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); + const siblingPipelineHelper = Private(SiblingPipelineAggHelperProvider); + + return new MetricAggType({ + name: 'sum_bucket', + title: 'Bucket Sum', + makeLabel: agg => makeNestedLabel(agg, 'overall sum'), + params: [ + ...siblingPipelineHelper.params() + ] + }); +} diff --git a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_controller.js b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_controller.js new file mode 100644 index 0000000000000..4d08761826e0c --- /dev/null +++ b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_controller.js @@ -0,0 +1,31 @@ +import safeMakeLabel from './safe_make_label'; + +const siblingPipelineAggController = function (type) { + return function ($scope) { + + $scope.aggType = type; + //$scope.aggParam = $scope.agg.params[type]; + $scope.aggTitle = type === 'customMetric' ? 'Metric' : 'Bucket'; + $scope.aggGroup = type === 'customMetric' ? 'metrics' : 'buckets'; + $scope.safeMakeLabel = safeMakeLabel; + + $scope.rejectAgg = function (agg) { + const invalidAggs = ['top_hits', 'percentiles', 'percentile_ranks', 'median', 'std_dev']; + return Boolean(invalidAggs.find(agg.type.name)); + }; + + //$scope.$watch(`agg.params.${type}`, updateAgg); + + function updateAgg() { + const agg = $scope.agg; + const params = agg.params; + const paramDef = agg.type.params.byName[type]; + + params[type] = params[type] || paramDef.makeAgg(agg); + } + + updateAgg(); + }; +}; + +export { siblingPipelineAggController }; diff --git a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js new file mode 100644 index 0000000000000..60b0e3d851cd1 --- /dev/null +++ b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js @@ -0,0 +1,86 @@ +import _ from 'lodash'; +import VisAggConfigProvider from 'ui/vis/agg_config'; +import VisSchemasProvider from 'ui/vis/schemas'; + +import { siblingPipelineAggController } from './sibling_pipeline_agg_controller'; +import { siblingPipelineAggWritter } from './sibling_pipeline_agg_writter'; +import metricAggTemplate from 'ui/agg_types/controls/sub_metric.html'; + +const SiblingPipelineAggHelperProvider = function (Private) { + + const AggConfig = Private(VisAggConfigProvider); + const Schemas = Private(VisSchemasProvider); + + const metricAggFilter = ['!top_hits', '!percentiles', '!percentile_ranks', '!median', '!std_dev']; + const metricAggSchema = (new Schemas([ + { + group: 'none', + name: 'metricAgg', + title: 'Metric Agg', + aggFilter: metricAggFilter + } + ])).all[0]; + + const bucketAggFilter = []; + const bucketAggSchema = (new Schemas([ + { + group: 'none', + title: 'Bucket Agg', + name: 'bucketAgg', + aggFilter: bucketAggFilter + } + ])).all[0]; + + return { + params: function () { + return [ + { + name: 'customBucket', + type: AggConfig, + default: null, + serialize: function (customMetric) { + return customMetric.toJSON(); + }, + deserialize: function (state, agg) { + return this.makeAgg(agg, state); + }, + makeAgg: function (agg, state) { + state = state || {}; + state.schema = bucketAggSchema; + const orderAgg = new AggConfig(agg.vis, state); + orderAgg.id = agg.id + '-bucket'; + return orderAgg; + }, + editor: metricAggTemplate, + controller: siblingPipelineAggController('customBucket'), + write: _.noop + }, + { + name: 'customMetric', + type: AggConfig, + default: null, + serialize: function (customMetric) { + return customMetric.toJSON(); + }, + deserialize: function (state, agg) { + return this.makeAgg(agg, state); + }, + makeAgg: function (agg, state) { + state = state || {}; + state.schema = metricAggSchema; + const orderAgg = new AggConfig(agg.vis, state); + orderAgg.id = agg.id + '-metric'; + return orderAgg; + }, + editor: metricAggTemplate, + controller: siblingPipelineAggController('customMetric'), + write: siblingPipelineAggWritter + } + ]; + } + }; + + +}; + +export default SiblingPipelineAggHelperProvider; diff --git a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_writter.js b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_writter.js new file mode 100644 index 0000000000000..2b7b51f64d059 --- /dev/null +++ b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_writter.js @@ -0,0 +1,19 @@ +const siblingPipelineAggWritter = function (agg, output) { + if (!agg.params.customMetric) return; + + const metricAgg = agg.params.customMetric; + const bucketAgg = agg.params.customBucket; + + // if a bucket is selected, we must add this agg as a sibling to it, and add a metric to that bucket (or select one of its) + if (metricAgg.type.name !== 'count') { + bucketAgg.subAggs = (output.subAggs || []).concat(metricAgg); + output.params.buckets_path = `${bucketAgg.id}>${metricAgg.id}`; + } else { + output.params.buckets_path = bucketAgg.id + '>_count'; + } + + output.parentAggs = (output.parentAggs || []).concat(bucketAgg); + +}; + +export { siblingPipelineAggWritter }; From 7602ee1f9daf10b0d6b2990de08ebcf457f43af9 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Tue, 7 Feb 2017 09:49:58 +0100 Subject: [PATCH 03/10] adding bucket_avg, bucket_min and bucket_max --- src/ui/public/agg_types/index.js | 6 ++++++ src/ui/public/agg_types/metrics/bucket_avg.js | 17 +++++++++++++++++ src/ui/public/agg_types/metrics/bucket_max.js | 17 +++++++++++++++++ src/ui/public/agg_types/metrics/bucket_min.js | 17 +++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 src/ui/public/agg_types/metrics/bucket_avg.js create mode 100644 src/ui/public/agg_types/metrics/bucket_max.js create mode 100644 src/ui/public/agg_types/metrics/bucket_min.js diff --git a/src/ui/public/agg_types/index.js b/src/ui/public/agg_types/index.js index 15d68fe4370b5..ee1cf7bf16e17 100644 --- a/src/ui/public/agg_types/index.js +++ b/src/ui/public/agg_types/index.js @@ -25,6 +25,9 @@ import AggTypesBucketsFiltersProvider from 'ui/agg_types/buckets/filters'; import AggTypesBucketsSignificantTermsProvider from 'ui/agg_types/buckets/significant_terms'; import AggTypesBucketsGeoHashProvider from 'ui/agg_types/buckets/geo_hash'; import AggTypesMetricsBucketSumProvider from 'ui/agg_types/metrics/bucket_sum'; +import AggTypesMetricsBucketAvgProvider from 'ui/agg_types/metrics/bucket_avg'; +import AggTypesMetricsBucketMinProvider from 'ui/agg_types/metrics/bucket_min'; +import AggTypesMetricsBucketMaxProvider from 'ui/agg_types/metrics/bucket_max'; export default function AggTypeService(Private) { const aggs = { @@ -45,6 +48,9 @@ export default function AggTypeService(Private) { Private(AggTypesMetricsMovingAvgProvider), Private(AggTypesMetricsSerialDiffProvider), Private(AggTypesMetricsBucketSumProvider), + Private(AggTypesMetricsBucketAvgProvider), + Private(AggTypesMetricsBucketMinProvider), + Private(AggTypesMetricsBucketMaxProvider), ], buckets: [ Private(AggTypesBucketsDateHistogramProvider), diff --git a/src/ui/public/agg_types/metrics/bucket_avg.js b/src/ui/public/agg_types/metrics/bucket_avg.js new file mode 100644 index 0000000000000..a8a8bd848d2c9 --- /dev/null +++ b/src/ui/public/agg_types/metrics/bucket_avg.js @@ -0,0 +1,17 @@ +import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_agg_type'; +import { makeNestedLabel } from './lib/make_nested_label'; +import SiblingPipelineAggHelperProvider from './lib/sibling_pipeline_agg_helper'; + +export default function AggTypeMetricDerivativeProvider(Private) { + const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); + const siblingPipelineHelper = Private(SiblingPipelineAggHelperProvider); + + return new MetricAggType({ + name: 'avg_bucket', + title: 'Bucket Average', + makeLabel: agg => makeNestedLabel(agg, 'overall average'), + params: [ + ...siblingPipelineHelper.params() + ] + }); +} diff --git a/src/ui/public/agg_types/metrics/bucket_max.js b/src/ui/public/agg_types/metrics/bucket_max.js new file mode 100644 index 0000000000000..bb7275ca36595 --- /dev/null +++ b/src/ui/public/agg_types/metrics/bucket_max.js @@ -0,0 +1,17 @@ +import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_agg_type'; +import { makeNestedLabel } from './lib/make_nested_label'; +import SiblingPipelineAggHelperProvider from './lib/sibling_pipeline_agg_helper'; + +export default function AggTypeMetricDerivativeProvider(Private) { + const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); + const siblingPipelineHelper = Private(SiblingPipelineAggHelperProvider); + + return new MetricAggType({ + name: 'max_bucket', + title: 'Bucket Max', + makeLabel: agg => makeNestedLabel(agg, 'overall max'), + params: [ + ...siblingPipelineHelper.params() + ] + }); +} diff --git a/src/ui/public/agg_types/metrics/bucket_min.js b/src/ui/public/agg_types/metrics/bucket_min.js new file mode 100644 index 0000000000000..d0c9e79373c1e --- /dev/null +++ b/src/ui/public/agg_types/metrics/bucket_min.js @@ -0,0 +1,17 @@ +import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_agg_type'; +import { makeNestedLabel } from './lib/make_nested_label'; +import SiblingPipelineAggHelperProvider from './lib/sibling_pipeline_agg_helper'; + +export default function AggTypeMetricDerivativeProvider(Private) { + const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); + const siblingPipelineHelper = Private(SiblingPipelineAggHelperProvider); + + return new MetricAggType({ + name: 'min_bucket', + title: 'Bucket Min', + makeLabel: agg => makeNestedLabel(agg, 'overall min'), + params: [ + ...siblingPipelineHelper.params() + ] + }); +} From 8af734c59401d67b7bd4a57f02f4b912449e9a3e Mon Sep 17 00:00:00 2001 From: ppisljar Date: Wed, 15 Feb 2017 12:57:40 +0100 Subject: [PATCH 04/10] fixing based on UI review --- .../kibana/public/visualize/editor/agg_select.html | 2 +- src/ui/public/agg_types/metrics/bucket_avg.js | 3 ++- src/ui/public/agg_types/metrics/bucket_max.js | 3 ++- src/ui/public/agg_types/metrics/bucket_min.js | 3 ++- src/ui/public/agg_types/metrics/bucket_sum.js | 3 ++- src/ui/public/agg_types/metrics/derivative.js | 1 + .../agg_types/metrics/lib/sibling_pipeline_agg_helper.js | 4 +++- src/ui/public/agg_types/metrics/metric_agg_type.js | 1 + 8 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/core_plugins/kibana/public/visualize/editor/agg_select.html b/src/core_plugins/kibana/public/visualize/editor/agg_select.html index 4059ef4884e86..3f0e10ff68e6a 100644 --- a/src/core_plugins/kibana/public/visualize/editor/agg_select.html +++ b/src/core_plugins/kibana/public/visualize/editor/agg_select.html @@ -7,6 +7,6 @@ ng-model="agg.type" required auto-select-if-only-one="aggTypeOptions | aggFilter:agg.schema.aggFilter" - ng-options="agg as agg.title for agg in aggTypeOptions | aggFilter:agg.schema.aggFilter"> + ng-options="agg as agg.title group by agg.group for agg in aggTypeOptions | aggFilter:agg.schema.aggFilter"> diff --git a/src/ui/public/agg_types/metrics/bucket_avg.js b/src/ui/public/agg_types/metrics/bucket_avg.js index a8a8bd848d2c9..5826e96f47ee5 100644 --- a/src/ui/public/agg_types/metrics/bucket_avg.js +++ b/src/ui/public/agg_types/metrics/bucket_avg.js @@ -8,8 +8,9 @@ export default function AggTypeMetricDerivativeProvider(Private) { return new MetricAggType({ name: 'avg_bucket', - title: 'Bucket Average', + title: 'Average Bucket', makeLabel: agg => makeNestedLabel(agg, 'overall average'), + group: 'Pipeline Aggregations', params: [ ...siblingPipelineHelper.params() ] diff --git a/src/ui/public/agg_types/metrics/bucket_max.js b/src/ui/public/agg_types/metrics/bucket_max.js index bb7275ca36595..639e94326feee 100644 --- a/src/ui/public/agg_types/metrics/bucket_max.js +++ b/src/ui/public/agg_types/metrics/bucket_max.js @@ -8,8 +8,9 @@ export default function AggTypeMetricDerivativeProvider(Private) { return new MetricAggType({ name: 'max_bucket', - title: 'Bucket Max', + title: 'Max Bucket', makeLabel: agg => makeNestedLabel(agg, 'overall max'), + group: 'Pipeline Aggregations', params: [ ...siblingPipelineHelper.params() ] diff --git a/src/ui/public/agg_types/metrics/bucket_min.js b/src/ui/public/agg_types/metrics/bucket_min.js index d0c9e79373c1e..fdda8d3310868 100644 --- a/src/ui/public/agg_types/metrics/bucket_min.js +++ b/src/ui/public/agg_types/metrics/bucket_min.js @@ -8,8 +8,9 @@ export default function AggTypeMetricDerivativeProvider(Private) { return new MetricAggType({ name: 'min_bucket', - title: 'Bucket Min', + title: 'Min Bucket', makeLabel: agg => makeNestedLabel(agg, 'overall min'), + group: 'Pipeline Aggregations', params: [ ...siblingPipelineHelper.params() ] diff --git a/src/ui/public/agg_types/metrics/bucket_sum.js b/src/ui/public/agg_types/metrics/bucket_sum.js index ea067e82e46b6..e732c1d830068 100644 --- a/src/ui/public/agg_types/metrics/bucket_sum.js +++ b/src/ui/public/agg_types/metrics/bucket_sum.js @@ -9,8 +9,9 @@ export default function AggTypeMetricDerivativeProvider(Private) { return new MetricAggType({ name: 'sum_bucket', - title: 'Bucket Sum', + title: 'Sum Bucket', makeLabel: agg => makeNestedLabel(agg, 'overall sum'), + group: 'Pipeline Aggregations', params: [ ...siblingPipelineHelper.params() ] diff --git a/src/ui/public/agg_types/metrics/derivative.js b/src/ui/public/agg_types/metrics/derivative.js index 01f075cc9d03b..b184d6e431cc3 100644 --- a/src/ui/public/agg_types/metrics/derivative.js +++ b/src/ui/public/agg_types/metrics/derivative.js @@ -9,6 +9,7 @@ export default function AggTypeMetricDerivativeProvider(Private) { return new MetricAggType({ name: 'derivative', title: 'Derivative', + group: 'Pipeline Aggregations', makeLabel: agg => makeNestedLabel(agg, 'derivative'), params: [ ...parentPipelineAggHelper.params() diff --git a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js index 60b0e3d851cd1..c7774f2165140 100644 --- a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js +++ b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js @@ -11,7 +11,9 @@ const SiblingPipelineAggHelperProvider = function (Private) { const AggConfig = Private(VisAggConfigProvider); const Schemas = Private(VisSchemasProvider); - const metricAggFilter = ['!top_hits', '!percentiles', '!percentile_ranks', '!median', '!std_dev']; + const metricAggFilter = ['!top_hits', '!percentiles', '!percentile_ranks', '!median', '!std_dev', + '!sum_bucket', '!avg_bucket', '!min_bucket', '!max_bucket']; + const metricAggSchema = (new Schemas([ { group: 'none', diff --git a/src/ui/public/agg_types/metrics/metric_agg_type.js b/src/ui/public/agg_types/metrics/metric_agg_type.js index 12f712cce4f09..45a4193960430 100644 --- a/src/ui/public/agg_types/metrics/metric_agg_type.js +++ b/src/ui/public/agg_types/metrics/metric_agg_type.js @@ -17,6 +17,7 @@ export default function MetricAggTypeProvider(Private) { }, this); } + MetricAggType.prototype.group = 'Basic Aggregations'; /** * Read the values for this metric from the * @param {[type]} bucket [description] From 690dc6b2c7603f702b8bdd816c37396ea8f4c5c9 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Wed, 15 Feb 2017 13:21:28 +0100 Subject: [PATCH 05/10] adding tests --- .../__tests__/metrics/sibling_pipeline.js | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/ui/public/agg_types/__tests__/metrics/sibling_pipeline.js diff --git a/src/ui/public/agg_types/__tests__/metrics/sibling_pipeline.js b/src/ui/public/agg_types/__tests__/metrics/sibling_pipeline.js new file mode 100644 index 0000000000000..90e756d5dcfd8 --- /dev/null +++ b/src/ui/public/agg_types/__tests__/metrics/sibling_pipeline.js @@ -0,0 +1,110 @@ +import _ from 'lodash'; +import expect from 'expect.js'; +import ngMock from 'ng_mock'; +import BucketSum from 'ui/agg_types/metrics/bucket_sum'; +import BucketAvg from 'ui/agg_types/metrics/bucket_avg'; +import BucketMin from 'ui/agg_types/metrics/bucket_min'; +import BucketMax from 'ui/agg_types/metrics/bucket_max'; +import VisProvider from 'ui/vis'; +import StubbedIndexPattern from 'fixtures/stubbed_logstash_index_pattern'; + +const metrics = [ + { name: 'sum_bucket', title: 'Overall Sum', provider: BucketSum }, + { name: 'avg_bucket', title: 'Overall Average', provider: BucketAvg }, + { name: 'min_bucket', title: 'Overall Min', provider: BucketMin }, + { name: 'max_bucket', title: 'Overall Max', provider: BucketMax }, +]; + +describe('sibling pipeline aggs', function () { + metrics.forEach(metric => { + describe(`${metric.title} metric`, function () { + + let aggDsl; + let metricAgg; + let aggConfig; + + function init(settings) { + ngMock.module('kibana'); + ngMock.inject(function (Private) { + const Vis = Private(VisProvider); + const indexPattern = Private(StubbedIndexPattern); + metricAgg = Private(metric.provider); + + const params = settings || { + customMetric: { + id: '5', + type: 'count', + schema: 'metric' + }, + customBucket: { + id: '6', + type: 'date_histogram', + schema: 'bucket', + params: { field: '@timestamp' } + } + }; + + const vis = new Vis(indexPattern, { + title: 'New Visualization', + type: 'metric', + params: { + fontSize: 60, + handleNoResults: true + }, + aggs: [ + { + id: '1', + type: 'count', + schema: 'metric' + }, + { + id: '2', + type: metric.name, + schema: 'metric', + params + } + ], + listeners: {} + }); + + // Grab the aggConfig off the vis (we don't actually use the vis for anything else) + aggConfig = vis.aggs[1]; + aggDsl = aggConfig.toDsl(); + }); + } + + it(`should return a label prefixed with ${metric.title} of`, function () { + init(); + expect(metricAgg.makeLabel(aggConfig)).to.eql(`${metric.title} of Count`); + }); + + it('should set parent aggs', function () { + init(); + expect(aggDsl[metric.name].buckets_path).to.be('2-bucket>_count'); + expect(aggDsl.parentAggs['2-bucket'].date_histogram).to.not.be.undefined; + }); + + it('should set nested parent aggs', function () { + init({ + customMetric: { + id: '5', + type: 'avg', + schema: 'metric', + params: { field: 'bytes' }, + }, + customBucket: { + id: '6', + type: 'date_histogram', + schema: 'bucket', + params: { field: '@timestamp' }, + } + }); + expect(aggDsl[metric.name].buckets_path).to.be('2-bucket>2-metric'); + expect(aggDsl.parentAggs['2-bucket'].date_histogram).to.not.be.undefined; + expect(aggDsl.parentAggs['2-bucket'].aggs['2-metric'].avg.field).to.equal('bytes'); + }); + + }); + }); + +}); From 7e3a32c93d25acd5e96cf2872a1d6af82c50e090 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Thu, 16 Feb 2017 10:11:54 +0100 Subject: [PATCH 06/10] disable terms sorting on pipeline aggs --- src/ui/public/agg_types/buckets/terms.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ui/public/agg_types/buckets/terms.js b/src/ui/public/agg_types/buckets/terms.js index 1ff01e548915e..4383c8c7e8465 100644 --- a/src/ui/public/agg_types/buckets/terms.js +++ b/src/ui/public/agg_types/buckets/terms.js @@ -18,8 +18,10 @@ export default function TermsAggDefinition(Private) { const aggFilter = [ '!top_hits', '!percentiles', '!median', '!std_dev', - '!derivative', '!cumulative_sum', '!moving_avg', '!serial_diff' + '!derivative', '!moving_avg', '!serial_diff', '!cumulative_sum', + '!avg_bucket', '!max_bucket', '!min_bucket', '!sum_bucket' ]; + const orderAggSchema = (new Schemas([ { group: 'none', From ad8b5b5e855403a176361ec1a42ef39004fdb046 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Thu, 16 Feb 2017 10:12:18 +0100 Subject: [PATCH 07/10] fixing based on Staceys review --- .../kibana/public/visualize/editor/agg_select.html | 2 +- src/ui/public/agg_types/metrics/bucket_avg.js | 4 ++-- src/ui/public/agg_types/metrics/bucket_max.js | 4 ++-- src/ui/public/agg_types/metrics/bucket_min.js | 4 ++-- src/ui/public/agg_types/metrics/bucket_sum.js | 5 ++--- src/ui/public/agg_types/metrics/cumulative_sum.js | 1 + src/ui/public/agg_types/metrics/derivative.js | 2 +- .../agg_types/metrics/lib/parent_pipeline_agg_helper.js | 1 + .../metrics/lib/sibling_pipeline_agg_controller.js | 8 -------- .../agg_types/metrics/lib/sibling_pipeline_agg_helper.js | 8 ++++++-- src/ui/public/agg_types/metrics/metric_agg_type.js | 2 +- src/ui/public/agg_types/metrics/moving_avg.js | 1 + src/ui/public/agg_types/metrics/serial_diff.js | 1 + 13 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/core_plugins/kibana/public/visualize/editor/agg_select.html b/src/core_plugins/kibana/public/visualize/editor/agg_select.html index 3f0e10ff68e6a..854996b965822 100644 --- a/src/core_plugins/kibana/public/visualize/editor/agg_select.html +++ b/src/core_plugins/kibana/public/visualize/editor/agg_select.html @@ -7,6 +7,6 @@ ng-model="agg.type" required auto-select-if-only-one="aggTypeOptions | aggFilter:agg.schema.aggFilter" - ng-options="agg as agg.title group by agg.group for agg in aggTypeOptions | aggFilter:agg.schema.aggFilter"> + ng-options="agg as agg.title group by agg.subtype for agg in aggTypeOptions | aggFilter:agg.schema.aggFilter"> diff --git a/src/ui/public/agg_types/metrics/bucket_avg.js b/src/ui/public/agg_types/metrics/bucket_avg.js index 5826e96f47ee5..dcfc7282248e8 100644 --- a/src/ui/public/agg_types/metrics/bucket_avg.js +++ b/src/ui/public/agg_types/metrics/bucket_avg.js @@ -2,7 +2,7 @@ import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_ag import { makeNestedLabel } from './lib/make_nested_label'; import SiblingPipelineAggHelperProvider from './lib/sibling_pipeline_agg_helper'; -export default function AggTypeMetricDerivativeProvider(Private) { +export default function AggTypesMetricsBucketAvgProvider(Private) { const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); const siblingPipelineHelper = Private(SiblingPipelineAggHelperProvider); @@ -10,7 +10,7 @@ export default function AggTypeMetricDerivativeProvider(Private) { name: 'avg_bucket', title: 'Average Bucket', makeLabel: agg => makeNestedLabel(agg, 'overall average'), - group: 'Pipeline Aggregations', + subtype: siblingPipelineHelper.subtype, params: [ ...siblingPipelineHelper.params() ] diff --git a/src/ui/public/agg_types/metrics/bucket_max.js b/src/ui/public/agg_types/metrics/bucket_max.js index 639e94326feee..82a6b834de719 100644 --- a/src/ui/public/agg_types/metrics/bucket_max.js +++ b/src/ui/public/agg_types/metrics/bucket_max.js @@ -2,7 +2,7 @@ import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_ag import { makeNestedLabel } from './lib/make_nested_label'; import SiblingPipelineAggHelperProvider from './lib/sibling_pipeline_agg_helper'; -export default function AggTypeMetricDerivativeProvider(Private) { +export default function AggTypesMetricsBucketMaxProvider(Private) { const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); const siblingPipelineHelper = Private(SiblingPipelineAggHelperProvider); @@ -10,7 +10,7 @@ export default function AggTypeMetricDerivativeProvider(Private) { name: 'max_bucket', title: 'Max Bucket', makeLabel: agg => makeNestedLabel(agg, 'overall max'), - group: 'Pipeline Aggregations', + subtype: siblingPipelineHelper.subtype, params: [ ...siblingPipelineHelper.params() ] diff --git a/src/ui/public/agg_types/metrics/bucket_min.js b/src/ui/public/agg_types/metrics/bucket_min.js index fdda8d3310868..588c308b100a7 100644 --- a/src/ui/public/agg_types/metrics/bucket_min.js +++ b/src/ui/public/agg_types/metrics/bucket_min.js @@ -2,7 +2,7 @@ import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_ag import { makeNestedLabel } from './lib/make_nested_label'; import SiblingPipelineAggHelperProvider from './lib/sibling_pipeline_agg_helper'; -export default function AggTypeMetricDerivativeProvider(Private) { +export default function AggTypesMetricsBucketMinProvider(Private) { const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); const siblingPipelineHelper = Private(SiblingPipelineAggHelperProvider); @@ -10,7 +10,7 @@ export default function AggTypeMetricDerivativeProvider(Private) { name: 'min_bucket', title: 'Min Bucket', makeLabel: agg => makeNestedLabel(agg, 'overall min'), - group: 'Pipeline Aggregations', + subtype: siblingPipelineHelper.subtype, params: [ ...siblingPipelineHelper.params() ] diff --git a/src/ui/public/agg_types/metrics/bucket_sum.js b/src/ui/public/agg_types/metrics/bucket_sum.js index e732c1d830068..a4c3c5f265228 100644 --- a/src/ui/public/agg_types/metrics/bucket_sum.js +++ b/src/ui/public/agg_types/metrics/bucket_sum.js @@ -2,8 +2,7 @@ import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_ag import { makeNestedLabel } from './lib/make_nested_label'; import SiblingPipelineAggHelperProvider from './lib/sibling_pipeline_agg_helper'; - -export default function AggTypeMetricDerivativeProvider(Private) { +export default function AggTypesMetricsBucketSumProvider(Private) { const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); const siblingPipelineHelper = Private(SiblingPipelineAggHelperProvider); @@ -11,7 +10,7 @@ export default function AggTypeMetricDerivativeProvider(Private) { name: 'sum_bucket', title: 'Sum Bucket', makeLabel: agg => makeNestedLabel(agg, 'overall sum'), - group: 'Pipeline Aggregations', + subtype: siblingPipelineHelper.subtype, params: [ ...siblingPipelineHelper.params() ] diff --git a/src/ui/public/agg_types/metrics/cumulative_sum.js b/src/ui/public/agg_types/metrics/cumulative_sum.js index 8e7fc93ce9a31..d9856704acffc 100644 --- a/src/ui/public/agg_types/metrics/cumulative_sum.js +++ b/src/ui/public/agg_types/metrics/cumulative_sum.js @@ -9,6 +9,7 @@ export default function AggTypeMetricComulativeSumProvider(Private) { return new MetricAggType({ name: 'cumulative_sum', title: 'Cumulative Sum', + subtype: parentPipelineAggHelper.subtype, makeLabel: agg => makeNestedLabel(agg, 'cumulative sum'), params: [ ...parentPipelineAggHelper.params() diff --git a/src/ui/public/agg_types/metrics/derivative.js b/src/ui/public/agg_types/metrics/derivative.js index b184d6e431cc3..cc17b871a9030 100644 --- a/src/ui/public/agg_types/metrics/derivative.js +++ b/src/ui/public/agg_types/metrics/derivative.js @@ -9,7 +9,7 @@ export default function AggTypeMetricDerivativeProvider(Private) { return new MetricAggType({ name: 'derivative', title: 'Derivative', - group: 'Pipeline Aggregations', + subtype: parentPipelineAggHelper.subtype, makeLabel: agg => makeNestedLabel(agg, 'derivative'), params: [ ...parentPipelineAggHelper.params() diff --git a/src/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.js b/src/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.js index b55209b3ad08e..623eb9cd493d5 100644 --- a/src/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.js +++ b/src/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.js @@ -22,6 +22,7 @@ const ParentPipelineAggHelperProvider = function (Private) { ])).all[0]; return { + subtype: 'Pipeline Aggregations', params: function () { return [ { diff --git a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_controller.js b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_controller.js index 4d08761826e0c..2a16b232c3a47 100644 --- a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_controller.js +++ b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_controller.js @@ -4,18 +4,10 @@ const siblingPipelineAggController = function (type) { return function ($scope) { $scope.aggType = type; - //$scope.aggParam = $scope.agg.params[type]; $scope.aggTitle = type === 'customMetric' ? 'Metric' : 'Bucket'; $scope.aggGroup = type === 'customMetric' ? 'metrics' : 'buckets'; $scope.safeMakeLabel = safeMakeLabel; - $scope.rejectAgg = function (agg) { - const invalidAggs = ['top_hits', 'percentiles', 'percentile_ranks', 'median', 'std_dev']; - return Boolean(invalidAggs.find(agg.type.name)); - }; - - //$scope.$watch(`agg.params.${type}`, updateAgg); - function updateAgg() { const agg = $scope.agg; const params = agg.params; diff --git a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js index c7774f2165140..c16b632b42ddc 100644 --- a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js +++ b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js @@ -11,8 +11,11 @@ const SiblingPipelineAggHelperProvider = function (Private) { const AggConfig = Private(VisAggConfigProvider); const Schemas = Private(VisSchemasProvider); - const metricAggFilter = ['!top_hits', '!percentiles', '!percentile_ranks', '!median', '!std_dev', - '!sum_bucket', '!avg_bucket', '!min_bucket', '!max_bucket']; + const metricAggFilter = [ + '!top_hits', '!percentiles', '!percentile_ranks', '!median', '!std_dev', + '!sum_bucket', '!avg_bucket', '!min_bucket', '!max_bucket', + '!derivative', '!moving_avg', '!serial_diff', '!cumulative_sum' + ]; const metricAggSchema = (new Schemas([ { @@ -34,6 +37,7 @@ const SiblingPipelineAggHelperProvider = function (Private) { ])).all[0]; return { + subtype: 'Pipeline Aggregations', params: function () { return [ { diff --git a/src/ui/public/agg_types/metrics/metric_agg_type.js b/src/ui/public/agg_types/metrics/metric_agg_type.js index 45a4193960430..4f0dc5f298c1c 100644 --- a/src/ui/public/agg_types/metrics/metric_agg_type.js +++ b/src/ui/public/agg_types/metrics/metric_agg_type.js @@ -17,7 +17,7 @@ export default function MetricAggTypeProvider(Private) { }, this); } - MetricAggType.prototype.group = 'Basic Aggregations'; + MetricAggType.prototype.subtype = 'Basic Aggregations'; /** * Read the values for this metric from the * @param {[type]} bucket [description] diff --git a/src/ui/public/agg_types/metrics/moving_avg.js b/src/ui/public/agg_types/metrics/moving_avg.js index 520d4cc25e233..a9ea5e6d8e020 100644 --- a/src/ui/public/agg_types/metrics/moving_avg.js +++ b/src/ui/public/agg_types/metrics/moving_avg.js @@ -9,6 +9,7 @@ export default function AggTypeMetricMovingAvgProvider(Private) { return new MetricAggType({ name: 'moving_avg', title: 'Moving Avg', + subtype: parentPipelineAggHelper.subtype, makeLabel: agg => makeNestedLabel(agg, 'moving avg'), params: [ ...parentPipelineAggHelper.params() diff --git a/src/ui/public/agg_types/metrics/serial_diff.js b/src/ui/public/agg_types/metrics/serial_diff.js index 014c50ec2c1ea..c67363b6e5807 100644 --- a/src/ui/public/agg_types/metrics/serial_diff.js +++ b/src/ui/public/agg_types/metrics/serial_diff.js @@ -9,6 +9,7 @@ export default function AggTypeMetricSerialDiffProvider(Private) { return new MetricAggType({ name: 'serial_diff', title: 'Serial Diff', + subtype: parentPipelineAggHelper.subtype, makeLabel: agg => makeNestedLabel(agg, 'serial diff'), params: [ ...parentPipelineAggHelper.params() From 0fb1d935a2c6428c6caa1fdba9a13c3d10272476 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Wed, 22 Feb 2017 11:40:09 +0100 Subject: [PATCH 08/10] adding defaults --- src/ui/public/agg_types/index.js | 2 +- .../agg_types/metrics/lib/sibling_pipeline_agg_helper.js | 4 ++-- src/ui/public/agg_types/metrics/metric_agg_type.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ui/public/agg_types/index.js b/src/ui/public/agg_types/index.js index ee1cf7bf16e17..da5a5a6c94521 100644 --- a/src/ui/public/agg_types/index.js +++ b/src/ui/public/agg_types/index.js @@ -47,8 +47,8 @@ export default function AggTypeService(Private) { Private(AggTypesMetricsCumulativeSumProvider), Private(AggTypesMetricsMovingAvgProvider), Private(AggTypesMetricsSerialDiffProvider), - Private(AggTypesMetricsBucketSumProvider), Private(AggTypesMetricsBucketAvgProvider), + Private(AggTypesMetricsBucketSumProvider), Private(AggTypesMetricsBucketMinProvider), Private(AggTypesMetricsBucketMaxProvider), ], diff --git a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js index c16b632b42ddc..a902b01be0700 100644 --- a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js +++ b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js @@ -51,7 +51,7 @@ const SiblingPipelineAggHelperProvider = function (Private) { return this.makeAgg(agg, state); }, makeAgg: function (agg, state) { - state = state || {}; + state = state || { type: 'date_histogram' }; state.schema = bucketAggSchema; const orderAgg = new AggConfig(agg.vis, state); orderAgg.id = agg.id + '-bucket'; @@ -72,7 +72,7 @@ const SiblingPipelineAggHelperProvider = function (Private) { return this.makeAgg(agg, state); }, makeAgg: function (agg, state) { - state = state || {}; + state = state || { type: 'count' }; state.schema = metricAggSchema; const orderAgg = new AggConfig(agg.vis, state); orderAgg.id = agg.id + '-metric'; diff --git a/src/ui/public/agg_types/metrics/metric_agg_type.js b/src/ui/public/agg_types/metrics/metric_agg_type.js index 4f0dc5f298c1c..e0727243209c9 100644 --- a/src/ui/public/agg_types/metrics/metric_agg_type.js +++ b/src/ui/public/agg_types/metrics/metric_agg_type.js @@ -17,7 +17,7 @@ export default function MetricAggTypeProvider(Private) { }, this); } - MetricAggType.prototype.subtype = 'Basic Aggregations'; + MetricAggType.prototype.subtype = 'Metric Aggregations'; /** * Read the values for this metric from the * @param {[type]} bucket [description] From cc6c703ab119691372c2cdb8e01e64b0beb47bbe Mon Sep 17 00:00:00 2001 From: ppisljar Date: Tue, 28 Feb 2017 10:40:21 +0100 Subject: [PATCH 09/10] updated based on review --- .../public/agg_types/metrics/lib/parent_pipeline_agg_helper.js | 2 +- .../public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.js b/src/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.js index 623eb9cd493d5..6e1b2ce62df4c 100644 --- a/src/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.js +++ b/src/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.js @@ -22,7 +22,7 @@ const ParentPipelineAggHelperProvider = function (Private) { ])).all[0]; return { - subtype: 'Pipeline Aggregations', + subtype: 'Parent Pipeline Aggregations', params: function () { return [ { diff --git a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js index a902b01be0700..372d95feae499 100644 --- a/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js +++ b/src/ui/public/agg_types/metrics/lib/sibling_pipeline_agg_helper.js @@ -37,7 +37,7 @@ const SiblingPipelineAggHelperProvider = function (Private) { ])).all[0]; return { - subtype: 'Pipeline Aggregations', + subtype: 'Sibling Pipeline Aggregations', params: function () { return [ { From 5848c744a74eb2321a269b6e6d76b6460da45c9b Mon Sep 17 00:00:00 2001 From: ppisljar Date: Wed, 1 Mar 2017 15:17:28 +0100 Subject: [PATCH 10/10] fixing error with stacking --- src/ui/public/vislib/lib/types/point_series.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/public/vislib/lib/types/point_series.js b/src/ui/public/vislib/lib/types/point_series.js index 3e6999c443735..624608637592a 100644 --- a/src/ui/public/vislib/lib/types/point_series.js +++ b/src/ui/public/vislib/lib/types/point_series.js @@ -4,7 +4,7 @@ export default function ColumnHandler(Private) { const createSerieFromParams = (cfg, seri) => { const matchingSeriParams = cfg.seriesParams ? cfg.seriesParams.find(seriConfig => { - return seri.label === seriConfig.data.label; + return seri.label.endsWith(seriConfig.data.label); }) : null;