From f0a981e2f348e629705004fc0c19329e0503b803 Mon Sep 17 00:00:00 2001 From: Spencer Alger Date: Fri, 13 Feb 2015 16:10:13 -0700 Subject: [PATCH] [dateHistogram] only use bucket bounds and auto interval when the time field is the indexPatterns time field --- .../point_series/_ordered_date_axis.js | 7 ++++-- .../agg_types/buckets/_interval_options.js | 6 +++-- .../agg_types/buckets/date_histogram.js | 21 +++++++++++------- .../components/agg_types/controls/field.html | 3 ++- .../components/time_buckets/time_buckets.js | 22 +++++++++++-------- src/kibana/components/vis/_agg_config.js | 5 +++++ 6 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/kibana/components/agg_response/point_series/_ordered_date_axis.js b/src/kibana/components/agg_response/point_series/_ordered_date_axis.js index 3fbd64517cfd..674252377714 100644 --- a/src/kibana/components/agg_response/point_series/_ordered_date_axis.js +++ b/src/kibana/components/agg_response/point_series/_ordered_date_axis.js @@ -4,7 +4,8 @@ define(function (require) { return function orderedDateAxis(vis, chart) { var aspects = chart.aspects; - var buckets = aspects.x.agg.buckets; + var xAgg = aspects.x.agg; + var buckets = xAgg.buckets; var format = buckets.getScaledDateFormat(); chart.xAxisFormatter = function (val) { @@ -16,8 +17,10 @@ define(function (require) { interval: buckets.getInterval(), }; + var axisOnTimeField = xAgg.fieldName() === xAgg.vis.indexPattern.timeFieldName; var bounds = buckets.getBounds(); - if (bounds) { + + if (bounds && axisOnTimeField) { chart.ordered.min = bounds.min; chart.ordered.max = bounds.max; } diff --git a/src/kibana/components/agg_types/buckets/_interval_options.js b/src/kibana/components/agg_types/buckets/_interval_options.js index 2e2fd220113c..fcc38469b49d 100644 --- a/src/kibana/components/agg_types/buckets/_interval_options.js +++ b/src/kibana/components/agg_types/buckets/_interval_options.js @@ -10,8 +10,10 @@ define(function (require) { { display: 'Auto', val: 'auto', - enabled: function (aggConfig) { - return !!aggConfig.vis.indexPattern.timeFieldName; + enabled: function (agg) { + // not only do we need a time field, but the selected field needs + // to be the time field. (see #3028) + return agg.fieldIsTimeField(); } }, { diff --git a/src/kibana/components/agg_types/buckets/date_histogram.js b/src/kibana/components/agg_types/buckets/date_histogram.js index c0b933b82510..0786dc16d060 100644 --- a/src/kibana/components/agg_types/buckets/date_histogram.js +++ b/src/kibana/components/agg_types/buckets/date_histogram.js @@ -8,6 +8,12 @@ define(function (require) { var tzOffset = moment().format('Z'); + function setBounds(agg, force) { + if (agg.buckets._alreadySet && !force) return; + agg.buckets._alreadySet = true; + agg.buckets.setBounds(agg.fieldIsTimeField() && timefilter.getActiveBounds()); + } + require('filters/field_type'); return new BucketAggType({ @@ -32,7 +38,8 @@ define(function (require) { buckets = new TimeBuckets(); buckets.setInterval(_.get(this, ['params', 'interval'])); - buckets.setBounds(timefilter.getActiveBounds()); + setBounds(this); + return buckets; } } @@ -44,6 +51,9 @@ define(function (require) { filterFieldTypes: 'date', default: function (agg) { return agg.vis.indexPattern.timeFieldName; + }, + onChange: function (agg) { + setBounds(agg, true); } }, @@ -54,15 +64,10 @@ define(function (require) { options: Private(require('components/agg_types/buckets/_interval_options')), editor: require('text!components/agg_types/controls/interval.html'), onRequest: function (agg) { - // flag that prevents us from clobbering on subsequest calls to write() - agg.buckets._sentToEs = true; - agg.buckets.setBounds(timefilter.getActiveBounds()); + setBounds(agg, true); }, write: function (agg, output) { - if (!agg.buckets._sentToEs) { - agg.buckets.setBounds(timefilter.getActiveBounds()); - } - + setBounds(agg); agg.buckets.setInterval(agg.params.interval); var interval = agg.buckets.getInterval(); diff --git a/src/kibana/components/agg_types/controls/field.html b/src/kibana/components/agg_types/controls/field.html index 5d5a3269510c..6661fbaf46d0 100644 --- a/src/kibana/components/agg_types/controls/field.html +++ b/src/kibana/components/agg_types/controls/field.html @@ -22,7 +22,8 @@ name="field" required ng-model="agg.params.field" - ng-options="field as field.displayName group by field.type for field in indexedFields"> + ng-options="field as field.displayName group by field.type for field in indexedFields" + ng-change="aggParam.onChange(agg)"> \ No newline at end of file diff --git a/src/kibana/components/time_buckets/time_buckets.js b/src/kibana/components/time_buckets/time_buckets.js index 4492045a65ea..3960e4f29e97 100644 --- a/src/kibana/components/time_buckets/time_buckets.js +++ b/src/kibana/components/time_buckets/time_buckets.js @@ -292,10 +292,10 @@ define(function (require) { } function cacheBreaker(prop) { - var breaker = breakers[prop]; - var setup = breaker.setup; - var changes = breaker.changes; - var deps = breaker.deps; + var resource = resources[breakers[prop]]; + var setup = resource.setup; + var changes = resource.changes; + var deps = resource.deps; var fn = self[prop]; return { @@ -304,7 +304,7 @@ define(function (require) { var ret = fn.apply(self, arguments); if (changes.call(self, prev)) { - cache = _.omit(cache, deps); + cache = {}; } return ret; @@ -330,8 +330,13 @@ define(function (require) { }; var breakers = { - setBounds: { - deps: ['getBounds', 'hasBounds', 'getDuration', 'getInterval', 'getScaledDateFormat'], + setBounds: 'bounds', + clearBounds: 'bounds', + setInterval: 'interval' + }; + + var resources = { + bounds: { setup: function () { return [self._lb, self._ub]; }, @@ -339,8 +344,7 @@ define(function (require) { return !sameMoment(prev[0], self._lb) || !sameMoment(prev[1], self._ub); } }, - setInterval: { - deps: ['getInterval', 'getScaledDateFormat'], + interval: { setup: function () { return self._i; }, diff --git a/src/kibana/components/vis/_agg_config.js b/src/kibana/components/vis/_agg_config.js index ad0168fe28b5..6762510b8ac1 100644 --- a/src/kibana/components/vis/_agg_config.js +++ b/src/kibana/components/vis/_agg_config.js @@ -282,6 +282,11 @@ define(function (require) { return field ? (field.displayName || this.fieldName()) : ''; }; + AggConfig.prototype.fieldIsTimeField = function () { + var timeFieldName = this.vis.indexPattern.timeFieldName; + return timeFieldName && this.fieldName() === timeFieldName; + }; + return AggConfig; }; });