From b92535f000b86edee95850701d7cc22f7afdd847 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Tue, 7 Feb 2017 10:38:00 +0100 Subject: [PATCH 1/4] extracting to parent agg helper --- src/ui/public/agg_types/metrics/derivative.js | 51 +--------------- .../metrics/lib/parent_pipeline_agg_helper.js | 61 +++++++++++++++++++ 2 files changed, 64 insertions(+), 48 deletions(-) create mode 100644 src/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.js diff --git a/src/ui/public/agg_types/metrics/derivative.js b/src/ui/public/agg_types/metrics/derivative.js index 0051908ff29b0..01f075cc9d03b 100644 --- a/src/ui/public/agg_types/metrics/derivative.js +++ b/src/ui/public/agg_types/metrics/derivative.js @@ -1,62 +1,17 @@ import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_agg_type'; -import metricAggTemplate from 'ui/agg_types/controls/sub_agg.html'; -import _ from 'lodash'; -import VisAggConfigProvider from 'ui/vis/agg_config'; -import VisSchemasProvider from 'ui/vis/schemas'; +import ParentPipelineAggHelperProvider from './lib/parent_pipeline_agg_helper'; import { makeNestedLabel } from './lib/make_nested_label'; -import { parentPipelineAggController } from './lib/parent_pipeline_agg_controller'; -import { parentPipelineAggWritter } from './lib/parent_pipeline_agg_writter'; export default function AggTypeMetricDerivativeProvider(Private) { const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); - const AggConfig = Private(VisAggConfigProvider); - const Schemas = Private(VisSchemasProvider); - - const aggFilter = ['!top_hits', '!percentiles', '!percentile_ranks', '!median', '!std_dev']; - const orderAggSchema = (new Schemas([ - { - group: 'none', - name: 'orderAgg', - title: 'Order Agg', - aggFilter: aggFilter - } - ])).all[0]; + const parentPipelineAggHelper = Private(ParentPipelineAggHelperProvider); return new MetricAggType({ name: 'derivative', title: 'Derivative', makeLabel: agg => makeNestedLabel(agg, 'derivative'), params: [ - { - name: 'customMetric', - type: AggConfig, - default: null, - serialize: function (customMetric) { - return customMetric.toJSON(); - }, - deserialize: function (state, agg) { - return this.makeAgg(agg, state); - }, - makeAgg: function (termsAgg, state) { - state = state || { type: 'count' }; - state.schema = orderAggSchema; - const metricAgg = new AggConfig(termsAgg.vis, state); - metricAgg.id = termsAgg.id + '-metric'; - return metricAgg; - }, - write: _.noop - }, - { - name: 'buckets_path', - write: _.noop - }, - { - name: 'metricAgg', - editor: metricAggTemplate, - default: 'custom', - controller: parentPipelineAggController, - write: parentPipelineAggWritter - } + ...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 new file mode 100644 index 0000000000000..13c5ae6691711 --- /dev/null +++ b/src/ui/public/agg_types/metrics/lib/parent_pipeline_agg_helper.js @@ -0,0 +1,61 @@ +import metricAggTemplate from 'ui/agg_types/controls/sub_agg.html'; +import _ from 'lodash'; +import VisAggConfigProvider from 'ui/vis/agg_config'; +import VisSchemasProvider from 'ui/vis/schemas'; +import { parentPipelineAggController } from './lib/parent_pipeline_agg_controller'; +import { parentPipelineAggWritter } from './lib/parent_pipeline_agg_writter'; + +const ParentPipelineAggHelperProvider = 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]; + + return { + params: function () { + return [ + { + name: 'customMetric', + type: AggConfig, + default: null, + serialize: function (customMetric) { + return customMetric.toJSON(); + }, + deserialize: function (state, agg) { + return this.makeAgg(agg, state); + }, + makeAgg: function (termsAgg, state) { + state = state || { type: 'count' }; + state.schema = metricAggSchema; + const metricAgg = new AggConfig(termsAgg.vis, state); + metricAgg.id = termsAgg.id + '-metric'; + return metricAgg; + }, + write: _.noop + }, + { + name: 'buckets_path', + write: _.noop + }, + { + name: 'metricAgg', + editor: metricAggTemplate, + default: 'custom', + controller: parentPipelineAggController, + write: parentPipelineAggWritter + } + ]; + } + }; +}; + +export default ParentPipelineAggHelperProvider; From 457338f7c92e65c701ab0ff28b49a3b42181cdf7 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Tue, 7 Feb 2017 10:38:19 +0100 Subject: [PATCH 2/4] adding comulative sum agg --- src/ui/public/agg_types/index.js | 2 ++ .../public/agg_types/metrics/cumulative_sum.js | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 src/ui/public/agg_types/metrics/cumulative_sum.js diff --git a/src/ui/public/agg_types/index.js b/src/ui/public/agg_types/index.js index 25140ba77daf0..a163c0da9cb8d 100644 --- a/src/ui/public/agg_types/index.js +++ b/src/ui/public/agg_types/index.js @@ -12,6 +12,7 @@ import AggTypesMetricsCardinalityProvider from 'ui/agg_types/metrics/cardinality import AggTypesMetricsPercentilesProvider from 'ui/agg_types/metrics/percentiles'; import AggTypesMetricsPercentileRanksProvider from 'ui/agg_types/metrics/percentile_ranks'; import AggTypesMetricsDerivativeProvider from 'ui/agg_types/metrics/derivative'; +import AggTypesMetricsCumulativeSumProvider from 'ui/agg_types/metrics/cumulative_sum'; import AggTypesBucketsDateHistogramProvider from 'ui/agg_types/buckets/date_histogram'; import AggTypesBucketsHistogramProvider from 'ui/agg_types/buckets/histogram'; import AggTypesBucketsRangeProvider from 'ui/agg_types/buckets/range'; @@ -37,6 +38,7 @@ export default function AggTypeService(Private) { Private(AggTypesMetricsPercentileRanksProvider), Private(AggTypesMetricsTopHitProvider), Private(AggTypesMetricsDerivativeProvider), + Private(AggTypesMetricsCumulativeSumProvider), ], buckets: [ Private(AggTypesBucketsDateHistogramProvider), diff --git a/src/ui/public/agg_types/metrics/cumulative_sum.js b/src/ui/public/agg_types/metrics/cumulative_sum.js new file mode 100644 index 0000000000000..8e7fc93ce9a31 --- /dev/null +++ b/src/ui/public/agg_types/metrics/cumulative_sum.js @@ -0,0 +1,17 @@ +import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_agg_type'; +import ParentPipelineAggHelperProvider from './lib/parent_pipeline_agg_helper'; +import { makeNestedLabel } from './lib/make_nested_label'; + +export default function AggTypeMetricComulativeSumProvider(Private) { + const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); + const parentPipelineAggHelper = Private(ParentPipelineAggHelperProvider); + + return new MetricAggType({ + name: 'cumulative_sum', + title: 'Cumulative Sum', + makeLabel: agg => makeNestedLabel(agg, 'cumulative sum'), + params: [ + ...parentPipelineAggHelper.params() + ] + }); +} From c104481dc9db8288d1f932486ec55a0ed7b73120 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Tue, 7 Feb 2017 17:26:35 +0100 Subject: [PATCH 3/4] adding serial diff and moving avg --- src/ui/public/agg_types/metrics/moving_avg.js | 17 +++++++++++++++++ src/ui/public/agg_types/metrics/serial_diff.js | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 src/ui/public/agg_types/metrics/moving_avg.js create mode 100644 src/ui/public/agg_types/metrics/serial_diff.js diff --git a/src/ui/public/agg_types/metrics/moving_avg.js b/src/ui/public/agg_types/metrics/moving_avg.js new file mode 100644 index 0000000000000..7075e15dfbc92 --- /dev/null +++ b/src/ui/public/agg_types/metrics/moving_avg.js @@ -0,0 +1,17 @@ +import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_agg_type'; +import ParentPipelineAggHelperProvider from './lib/parent_pipeline_agg_helper'; +import { makeNestedLabel } from './lib/make_nested_label'; + +export default function AggTypeMetricComulativeSumProvider(Private) { + const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); + const parentPipelineAggHelper = Private(ParentPipelineAggHelperProvider); + + return new MetricAggType({ + name: 'moving_avg', + title: 'Moving Sum', + makeLabel: agg => makeNestedLabel(agg, 'moving sum'), + 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 new file mode 100644 index 0000000000000..63befe5d25551 --- /dev/null +++ b/src/ui/public/agg_types/metrics/serial_diff.js @@ -0,0 +1,17 @@ +import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_agg_type'; +import ParentPipelineAggHelperProvider from './lib/parent_pipeline_agg_helper'; +import { makeNestedLabel } from './lib/make_nested_label'; + +export default function AggTypeMetricComulativeSumProvider(Private) { + const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); + const parentPipelineAggHelper = Private(ParentPipelineAggHelperProvider); + + return new MetricAggType({ + name: 'serial_diff', + title: 'Serial Diff', + makeLabel: agg => makeNestedLabel(agg, 'serial diff'), + params: [ + ...parentPipelineAggHelper.params() + ] + }); +} From 02b3371a1ff2d4d43cb2caaa407348fe6eacd9ef Mon Sep 17 00:00:00 2001 From: ppisljar Date: Thu, 9 Feb 2017 13:43:20 +0100 Subject: [PATCH 4/4] adding tests --- .../agg_types/__tests__/metrics/derivative.js | 128 ---------------- .../__tests__/metrics/parent_pipeline.js | 144 ++++++++++++++++++ src/ui/public/agg_types/index.js | 4 + .../metrics/lib/parent_pipeline_agg_helper.js | 4 +- src/ui/public/agg_types/metrics/moving_avg.js | 6 +- .../public/agg_types/metrics/serial_diff.js | 2 +- 6 files changed, 154 insertions(+), 134 deletions(-) delete mode 100644 src/ui/public/agg_types/__tests__/metrics/derivative.js create mode 100644 src/ui/public/agg_types/__tests__/metrics/parent_pipeline.js diff --git a/src/ui/public/agg_types/__tests__/metrics/derivative.js b/src/ui/public/agg_types/__tests__/metrics/derivative.js deleted file mode 100644 index dae886a6a5c9f..0000000000000 --- a/src/ui/public/agg_types/__tests__/metrics/derivative.js +++ /dev/null @@ -1,128 +0,0 @@ -import _ from 'lodash'; -import expect from 'expect.js'; -import ngMock from 'ng_mock'; -import DerivativeProvider from 'ui/agg_types/metrics/derivative'; -import VisProvider from 'ui/vis'; -import StubbedIndexPattern from 'fixtures/stubbed_logstash_index_pattern'; - -describe('Derivative metric', function () { - let aggDsl; - let derivativeMetric; - let aggConfig; - - function init(settings) { - ngMock.module('kibana'); - ngMock.inject(function (Private) { - const Vis = Private(VisProvider); - const indexPattern = Private(StubbedIndexPattern); - derivativeMetric = Private(DerivativeProvider); - - const params = settings || { - metricAgg: '1', - customMetric: null - }; - - 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: 'derivative', - 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 Derivative of', function () { - init(); - expect(derivativeMetric.makeLabel(aggConfig)).to.eql('Derivative of Count'); - }); - - it('should return a label Derivative of max bytes', function () { - init({ - metricAgg: 'custom', - customMetric: { - id:'1-orderAgg', - type: 'max', - params: { field: 'bytes' }, - schema: 'orderAgg' - } - }); - expect(derivativeMetric.makeLabel(aggConfig)).to.eql('Derivative of Max bytes'); - }); - - it('should return a label prefixed with number of derivative', function () { - init({ - metricAgg: 'custom', - customMetric: { - id:'2-orderAgg', - type: 'derivative', - params: { - buckets_path: 'custom', - customMetric: { - id:'2-orderAgg-orderAgg', - type: 'count', - schema: 'orderAgg' - } - }, - schema: 'orderAgg' - } - }); - expect(derivativeMetric.makeLabel(aggConfig)).to.eql('2. derivative of Count'); - }); - - it('should set parent aggs', function () { - init({ - metricAgg: 'custom', - customMetric: { - id:'2-metric', - type: 'max', - params: { field: 'bytes' }, - schema: 'orderAgg' - } - }); - expect(aggDsl.derivative.buckets_path).to.be('2-metric'); - expect(aggDsl.parentAggs['2-metric'].max.field).to.be('bytes'); - }); - - it('should set nested parent aggs', function () { - init({ - metricAgg: 'custom', - customMetric: { - id:'2-metric', - type: 'derivative', - params: { - buckets_path: 'custom', - customMetric: { - id:'2-metric-metric', - type: 'max', - params: { field: 'bytes' }, - schema: 'orderAgg' - } - }, - schema: 'orderAgg' - } - }); - expect(aggDsl.derivative.buckets_path).to.be('2-metric'); - expect(aggDsl.parentAggs['2-metric'].derivative.buckets_path).to.be('2-metric-metric'); - }); - -}); diff --git a/src/ui/public/agg_types/__tests__/metrics/parent_pipeline.js b/src/ui/public/agg_types/__tests__/metrics/parent_pipeline.js new file mode 100644 index 0000000000000..d719084d31a15 --- /dev/null +++ b/src/ui/public/agg_types/__tests__/metrics/parent_pipeline.js @@ -0,0 +1,144 @@ +import _ from 'lodash'; +import expect from 'expect.js'; +import ngMock from 'ng_mock'; +import DerivativeProvider from 'ui/agg_types/metrics/derivative'; +import CumulativeSumProvider from 'ui/agg_types/metrics/cumulative_sum'; +import MovingAvgProvider from 'ui/agg_types/metrics/moving_avg'; +import SerialDiffProvider from 'ui/agg_types/metrics/serial_diff'; +import VisProvider from 'ui/vis'; +import StubbedIndexPattern from 'fixtures/stubbed_logstash_index_pattern'; + +const metrics = [ + { name: 'derivative', title: 'Derivative', provider: DerivativeProvider }, + { name: 'cumulative_sum', title: 'Cumulative Sum', provider: CumulativeSumProvider }, + { name: 'moving_avg', title: 'Moving Avg', provider: MovingAvgProvider }, + { name: 'serial_diff', title: 'Serial Diff', provider: SerialDiffProvider }, +]; + +describe('parent 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 || { + metricAgg: '1', + customMetric: null + }; + + 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 return a label ${metric.title} of max bytes`, function () { + init({ + metricAgg: 'custom', + customMetric: { + id:'1-orderAgg', + type: 'max', + params: { field: 'bytes' }, + schema: 'orderAgg' + } + }); + expect(metricAgg.makeLabel(aggConfig)).to.eql(`${metric.title} of Max bytes`); + }); + + it(`should return a label prefixed with number of ${metric.title.toLowerCase()}`, function () { + init({ + metricAgg: 'custom', + customMetric: { + id:'2-orderAgg', + type: metric.name, + params: { + buckets_path: 'custom', + customMetric: { + id:'2-orderAgg-orderAgg', + type: 'count', + schema: 'orderAgg' + } + }, + schema: 'orderAgg' + } + }); + expect(metricAgg.makeLabel(aggConfig)).to.eql(`2. ${metric.title.toLowerCase()} of Count`); + }); + + it('should set parent aggs', function () { + init({ + metricAgg: 'custom', + customMetric: { + id:'2-metric', + type: 'max', + params: { field: 'bytes' }, + schema: 'orderAgg' + } + }); + expect(aggDsl[metric.name].buckets_path).to.be('2-metric'); + expect(aggDsl.parentAggs['2-metric'].max.field).to.be('bytes'); + }); + + it('should set nested parent aggs', function () { + init({ + metricAgg: 'custom', + customMetric: { + id:'2-metric', + type: metric.name, + params: { + buckets_path: 'custom', + customMetric: { + id:'2-metric-metric', + type: 'max', + params: { field: 'bytes' }, + schema: 'orderAgg' + } + }, + schema: 'orderAgg' + } + }); + expect(aggDsl[metric.name].buckets_path).to.be('2-metric'); + expect(aggDsl.parentAggs['2-metric'][metric.name].buckets_path).to.be('2-metric-metric'); + }); + + }); + }); + +}); diff --git a/src/ui/public/agg_types/index.js b/src/ui/public/agg_types/index.js index a163c0da9cb8d..5f735860e0cf7 100644 --- a/src/ui/public/agg_types/index.js +++ b/src/ui/public/agg_types/index.js @@ -13,6 +13,8 @@ import AggTypesMetricsPercentilesProvider from 'ui/agg_types/metrics/percentiles import AggTypesMetricsPercentileRanksProvider from 'ui/agg_types/metrics/percentile_ranks'; import AggTypesMetricsDerivativeProvider from 'ui/agg_types/metrics/derivative'; import AggTypesMetricsCumulativeSumProvider from 'ui/agg_types/metrics/cumulative_sum'; +import AggTypesMetricsMovingAvgProvider from 'ui/agg_types/metrics/moving_avg'; +import AggTypesMetricsSerialDiffProvider from 'ui/agg_types/metrics/serial_diff'; import AggTypesBucketsDateHistogramProvider from 'ui/agg_types/buckets/date_histogram'; import AggTypesBucketsHistogramProvider from 'ui/agg_types/buckets/histogram'; import AggTypesBucketsRangeProvider from 'ui/agg_types/buckets/range'; @@ -39,6 +41,8 @@ export default function AggTypeService(Private) { Private(AggTypesMetricsTopHitProvider), Private(AggTypesMetricsDerivativeProvider), Private(AggTypesMetricsCumulativeSumProvider), + Private(AggTypesMetricsMovingAvgProvider), + Private(AggTypesMetricsSerialDiffProvider) ], buckets: [ Private(AggTypesBucketsDateHistogramProvider), 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 13c5ae6691711..12ed05b104a41 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 @@ -2,8 +2,8 @@ import metricAggTemplate from 'ui/agg_types/controls/sub_agg.html'; import _ from 'lodash'; import VisAggConfigProvider from 'ui/vis/agg_config'; import VisSchemasProvider from 'ui/vis/schemas'; -import { parentPipelineAggController } from './lib/parent_pipeline_agg_controller'; -import { parentPipelineAggWritter } from './lib/parent_pipeline_agg_writter'; +import { parentPipelineAggController } from './parent_pipeline_agg_controller'; +import { parentPipelineAggWritter } from './parent_pipeline_agg_writter'; const ParentPipelineAggHelperProvider = function (Private) { diff --git a/src/ui/public/agg_types/metrics/moving_avg.js b/src/ui/public/agg_types/metrics/moving_avg.js index 7075e15dfbc92..520d4cc25e233 100644 --- a/src/ui/public/agg_types/metrics/moving_avg.js +++ b/src/ui/public/agg_types/metrics/moving_avg.js @@ -2,14 +2,14 @@ import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_ag import ParentPipelineAggHelperProvider from './lib/parent_pipeline_agg_helper'; import { makeNestedLabel } from './lib/make_nested_label'; -export default function AggTypeMetricComulativeSumProvider(Private) { +export default function AggTypeMetricMovingAvgProvider(Private) { const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); const parentPipelineAggHelper = Private(ParentPipelineAggHelperProvider); return new MetricAggType({ name: 'moving_avg', - title: 'Moving Sum', - makeLabel: agg => makeNestedLabel(agg, 'moving sum'), + title: 'Moving Avg', + 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 63befe5d25551..014c50ec2c1ea 100644 --- a/src/ui/public/agg_types/metrics/serial_diff.js +++ b/src/ui/public/agg_types/metrics/serial_diff.js @@ -2,7 +2,7 @@ import AggTypesMetricsMetricAggTypeProvider from 'ui/agg_types/metrics/metric_ag import ParentPipelineAggHelperProvider from './lib/parent_pipeline_agg_helper'; import { makeNestedLabel } from './lib/make_nested_label'; -export default function AggTypeMetricComulativeSumProvider(Private) { +export default function AggTypeMetricSerialDiffProvider(Private) { const MetricAggType = Private(AggTypesMetricsMetricAggTypeProvider); const parentPipelineAggHelper = Private(ParentPipelineAggHelperProvider);