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

[6.7][TSVB] Memory leak fix #65834

Closed
wants to merge 6 commits into from
Closed

Conversation

majagrubic
Copy link
Contributor

Summary

Applying TSVB fix to 6.7

Checklist

Delete any items that are not applicable to this PR.

For maintainers

@majagrubic majagrubic added backport test-matrix Use this label to ensure PRs are tested with matrix jobs labels May 8, 2020
@timroes
Copy link
Contributor

timroes commented May 8, 2020

@elasticmachine merge upstream

@kibanamachine
Copy link
Contributor

💔 Build Failed

@kibanamachine
Copy link
Contributor

💔 Build Failed

@majagrubic majagrubic changed the title Applying TSVB fix for 6.7 [6.7][TSVB] Memory leak fix May 8, 2020
@kibanamachine
Copy link
Contributor

💔 Build Failed

@kibanamachine
Copy link
Contributor

💚 Build Succeeded

Copy link
Contributor

@timroes timroes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code LGTM, No leftover set found.

@timroes
Copy link
Contributor

timroes commented May 8, 2020

Diff to 6.7.2:

diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/helpers/index.js src/legacy/core_plugins/metrics/server/lib/vis_data/helpers/index.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/helpers/index.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/helpers/index.js	2020-05-08 18:20:53.000000000 +0100
@@ -3,6 +3,16 @@
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
+exports.overwrite = undefined;
+
+var _overwrite = require('./overwrite');
+
+Object.defineProperty(exports, 'overwrite', {
+  enumerable: true,
+  get: function () {
+    return _overwrite.overwrite;
+  }
+});
 
 var _bucket_transform = require('./bucket_transform');
 
@@ -72,23 +82,4 @@
   mapBucket: _map_bucket2.default,
   parseSettings: _parse_settings2.default,
   unitToSeconds: _unit_to_seconds2.default
-}; /*
-    * Licensed to Elasticsearch B.V. under one or more contributor
-    * license agreements. See the NOTICE file distributed with
-    * this work for additional information regarding copyright
-    * ownership. Elasticsearch B.V. licenses this file to you under
-    * the Apache License, Version 2.0 (the "License"); you may
-    * not use this file except in compliance with the License.
-    * You may obtain a copy of the License at
-    *
-    *    http://www.apache.org/licenses/LICENSE-2.0
-    *
-    * Unless required by applicable law or agreed to in writing,
-    * software distributed under the License is distributed on an
-    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    * KIND, either express or implied.  See the License for the
-    * specific language governing permissions and limitations
-    * under the License.
-    */
-
-module.exports = exports['default'];
\ No newline at end of file
+};
\ No newline at end of file
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/helpers/overwrite.js src/legacy/core_plugins/metrics/server/lib/vis_data/helpers/overwrite.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/helpers/overwrite.js	1970-01-01 01:00:00.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/helpers/overwrite.js	2020-05-08 18:20:53.000000000 +0100
@@ -0,0 +1,163 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.isPlainObject = isPlainObject;
+exports.set = set;
+exports.overwrite = overwrite;
+/*
+* Licensed to Elasticsearch B.V. under one or more contributor
+* license agreements. See the NOTICE file distributed with
+  * this work for additional information regarding copyright
+* ownership. Elasticsearch B.V. licenses this file to you under
+* the Apache License, Version 2.0 (the "License"); you may
+* not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*    http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied.  See the License for the
+                                                        * specific language governing permissions and limitations
+* under the License.
+*/
+function isObjectInner(val) {
+  return val != null && typeof val === 'object' && Array.isArray(val) === false;
+}
+
+function isObjectObject(o) {
+  return isObjectInner(o) === true && Object.prototype.toString.call(o) === '[object Object]';
+}
+
+function isPlainObject(o) {
+  if (isObjectObject(o) === false) return false;
+
+  // If has modified constructor
+  const ctor = o.constructor;
+  if (typeof ctor !== 'function') return false;
+
+  // If has modified prototype
+  const prot = ctor.prototype;
+  if (isObjectObject(prot) === false) return false;
+
+  // If constructor does not have an Object-specific method
+  if (prot.hasOwnProperty('isPrototypeOf') === false) {
+    return false;
+  }
+
+  // Most likely a plain Object
+  return true;
+}
+
+function isObject(val) {
+  return val !== null && (typeof val === 'object' || typeof val === 'function');
+}
+
+function createKey(pattern, options) {
+  let id = pattern;
+  if (typeof options === 'undefined') {
+    return id + '';
+  }
+  const keys = Object.keys(options);
+  for (let i = 0; i < keys.length; i++) {
+    const key = keys[i];
+    id += ';' + key + '=' + String(options[key]);
+  }
+  return id;
+}
+
+function isValidKey(key) {
+  return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';
+}
+
+function set(target, path, value, options) {
+  if (!isObject(target)) {
+    return target;
+  }
+
+  const opts = options || {};
+  const isArray = Array.isArray(path);
+  if (!isArray && typeof path !== 'string') {
+    return target;
+  }
+
+  let merge = opts.merge;
+  if (merge && typeof merge !== 'function') {
+    merge = Object.assign;
+  }
+
+  const keys = (isArray ? path : split(path, opts)).filter(isValidKey);
+  const len = keys.length;
+  const orig = target;
+
+  if (!options && keys.length === 1) {
+    result(target, keys[0], value, merge);
+    return target;
+  }
+
+  for (let i = 0; i < len; i++) {
+    const prop = keys[i];
+
+    if (!isObject(target[prop])) {
+      target[prop] = {};
+    }
+
+    if (i === len - 1) {
+      result(target, prop, value, merge);
+      break;
+    }
+
+    target = target[prop];
+  }
+
+  return orig;
+}
+
+function result(target, path, value, merge) {
+  if (merge && isPlainObject(target[path]) && isPlainObject(value)) {
+    target[path] = merge({}, target[path], value);
+  } else {
+    target[path] = value;
+  }
+}
+
+function split(path, options) {
+  const id = createKey(path, options);
+  if (set.memo[id]) return set.memo[id];
+
+  const char = options && options.separator ? options.separator : '.';
+  let keys = [];
+  const res = [];
+
+  if (options && typeof options.split === 'function') {
+    keys = options.split(path);
+  } else {
+    keys = path.split(char);
+  }
+
+  for (let i = 0; i < keys.length; i++) {
+    let prop = keys[i];
+    while (prop && prop.slice(-1) === '\\' && keys[i + 1] != null) {
+      prop = prop.slice(0, -1) + char + keys[++i];
+    }
+    res.push(prop);
+  }
+  set.memo[id] = res;
+  return res;
+}
+
+set.memo = {};
+
+/**
+ * Set path in obj. Behaves like lodash `set`
+ * @param obj The object to mutate
+ * @param path The path of the sub-property to set
+ * @param val The value to set the sub-property to
+ */
+function overwrite(obj, path, val) {
+  set(obj, path, undefined);
+  set(obj, path, val);
+}
\ No newline at end of file
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/annotations/date_histogram.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/annotations/date_histogram.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/annotations/date_histogram.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/annotations/date_histogram.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,9 +5,7 @@
 });
 exports.default = dateHistogram;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
+var _helpers = require('../../helpers');
 
 var _get_bucket_size = require('../../helpers/get_bucket_size');
 
@@ -25,7 +23,7 @@
     const { bucketSize, intervalString } = (0, _get_bucket_size2.default)(req, 'auto');
     const { from, to } = (0, _get_timerange2.default)(req);
     const { timezone } = req.payload.timerange;
-    _lodash2.default.set(doc, `aggs.${annotation.id}.date_histogram`, {
+    (0, _helpers.overwrite)(doc, `aggs.${annotation.id}.date_histogram`, {
       field: timeField,
       interval: intervalString,
       min_doc_count: 0,
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/annotations/top_hits.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/annotations/top_hits.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/annotations/top_hits.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/annotations/top_hits.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,17 +5,13 @@
 });
 exports.default = topHits;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _helpers = require('../../helpers');
 
 function topHits(req, panel, annotation) {
   return next => doc => {
     const fields = annotation.fields && annotation.fields.split(/[,\s]+/) || [];
     const timeField = annotation.time_field;
-    _lodash2.default.set(doc, `aggs.${annotation.id}.aggs.hits.top_hits`, {
+    (0, _helpers.overwrite)(doc, `aggs.${annotation.id}.aggs.hits.top_hits`, {
       sort: [{
         [timeField]: { order: 'desc' }
       }],
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/date_histogram.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/date_histogram.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/date_histogram.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/date_histogram.js	2020-05-08 18:20:53.000000000 +0100
@@ -17,7 +17,7 @@
 
 var _get_interval_and_timefield2 = _interopRequireDefault(_get_interval_and_timefield);
 
-var _lodash = require('lodash');
+var _helpers = require('../../helpers');
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
@@ -47,7 +47,7 @@
     const { from, to } = (0, _offset_time2.default)(req, series.offset_time);
     const { timezone } = req.payload.timerange;
 
-    (0, _lodash.set)(doc, `aggs.${series.id}.aggs.timeseries.date_histogram`, {
+    (0, _helpers.overwrite)(doc, `aggs.${series.id}.aggs.timeseries.date_histogram`, {
       field: timeField,
       interval: intervalString,
       min_doc_count: 0,
@@ -57,7 +57,7 @@
         max: to.valueOf()
       }
     });
-    (0, _lodash.set)(doc, `aggs.${series.id}.meta`, {
+    (0, _helpers.overwrite)(doc, `aggs.${series.id}.meta`, {
       timeField,
       intervalString,
       bucketSize
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/filter_ratios.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/filter_ratios.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/filter_ratios.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/filter_ratios.js	2020-05-08 18:20:53.000000000 +0100
@@ -9,9 +9,7 @@
 
 var _bucket_transform2 = _interopRequireDefault(_bucket_transform);
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
+var _helpers = require('../../helpers');
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
@@ -40,10 +38,10 @@
   return next => doc => {
     if (series.metrics.some(filter)) {
       series.metrics.filter(filter).forEach(metric => {
-        _lodash2.default.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, {
+        (0, _helpers.overwrite)(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, {
           query_string: { query: metric.numerator || '*', analyze_wildcard: true }
         });
-        _lodash2.default.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, {
+        (0, _helpers.overwrite)(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, {
           query_string: { query: metric.denominator || '*', analyze_wildcard: true }
         });
 
@@ -61,13 +59,13 @@
             metricAgg = {};
           }
           const aggBody = { metric: metricAgg };
-          _lodash2.default.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
-          _lodash2.default.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.aggs`, aggBody);
+          (0, _helpers.overwrite)(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
+          (0, _helpers.overwrite)(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.aggs`, aggBody);
           numeratorPath = `${metric.id}-numerator>metric`;
           denominatorPath = `${metric.id}-denominator>metric`;
         }
 
-        _lodash2.default.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, {
+        (0, _helpers.overwrite)(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, {
           bucket_script: {
             buckets_path: {
               numerator: numeratorPath,
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/metric_buckets.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/metric_buckets.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/metric_buckets.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/metric_buckets.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,9 +5,7 @@
 });
 exports.default = metricBuckets;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
+var _helpers = require('../../helpers');
 
 var _get_bucket_size = require('../../helpers/get_bucket_size');
 
@@ -55,7 +53,7 @@
       if (fn) {
         try {
           const bucket = fn(metric, series.metrics, intervalString);
-          _lodash2.default.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, bucket);
+          (0, _helpers.overwrite)(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, bucket);
         } catch (e) {
           // meh
         }
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/sibling_buckets.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/sibling_buckets.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/sibling_buckets.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/sibling_buckets.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,9 +5,7 @@
 });
 exports.default = siblingBuckets;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
+var _helpers = require('../../helpers');
 
 var _get_bucket_size = require('../../helpers/get_bucket_size');
 
@@ -55,7 +53,7 @@
       if (fn) {
         try {
           const bucket = fn(metric, series.metrics, bucketSize);
-          _lodash2.default.set(doc, `aggs.${series.id}.aggs.${metric.id}`, bucket);
+          (0, _helpers.overwrite)(doc, `aggs.${series.id}.aggs.${metric.id}`, bucket);
         } catch (e) {
           // meh
         }
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_everything.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_everything.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_everything.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_everything.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,16 +5,12 @@
 });
 exports.default = splitByEverything;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _helpers = require('../../helpers');
 
 function splitByEverything(req, panel, series) {
   return next => doc => {
     if (series.split_mode === 'everything' || series.split_mode === 'terms' && !series.terms_field) {
-      _lodash2.default.set(doc, `aggs.${series.id}.filter.match_all`, {});
+      (0, _helpers.overwrite)(doc, `aggs.${series.id}.filter.match_all`, {});
     }
     return next(doc);
   };
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_filter.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_filter.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_filter.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_filter.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,17 +5,13 @@
 });
 exports.default = splitByFilter;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _helpers = require('../../helpers');
 
 function splitByFilter(req, panel, series) {
   return next => doc => {
     if (series.split_mode !== 'filter') return next(doc);
-    _lodash2.default.set(doc, `aggs.${series.id}.filter.query_string.query`, series.filter || '*');
-    _lodash2.default.set(doc, `aggs.${series.id}.filter.query_string.analyze_wildcard`, true);
+    (0, _helpers.overwrite)(doc, `aggs.${series.id}.filter.query_string.query`, series.filter || '*');
+    (0, _helpers.overwrite)(doc, `aggs.${series.id}.filter.query_string.analyze_wildcard`, true);
     return next(doc);
   };
 } /*
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_filters.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_filters.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_filters.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_filters.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,18 +5,14 @@
 });
 exports.default = splitByFilter;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _helpers = require('../../helpers');
 
 function splitByFilter(req, panel, series) {
   return next => doc => {
     if (series.split_mode === 'filters' && series.split_filters) {
       series.split_filters.forEach(filter => {
-        _lodash2.default.set(doc, `aggs.${series.id}.filters.filters.${filter.id}.query_string.query`, filter.filter || '*');
-        _lodash2.default.set(doc, `aggs.${series.id}.filters.filters.${filter.id}.query_string.analyze_wildcard`, true);
+        (0, _helpers.overwrite)(doc, `aggs.${series.id}.filters.filters.${filter.id}.query_string.query`, filter.filter || '*');
+        (0, _helpers.overwrite)(doc, `aggs.${series.id}.filters.filters.${filter.id}.query_string.analyze_wildcard`, true);
       });
     }
     return next(doc);
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_terms.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_terms.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_terms.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/series/split_by_terms.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,9 +5,7 @@
 });
 exports.default = splitByTerm;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
+var _helpers = require('../../helpers');
 
 var _basic_aggs = require('../../../../../common/basic_aggs');
 
@@ -46,19 +44,19 @@
   return next => doc => {
     if (series.split_mode === 'terms' && series.terms_field) {
       const direction = series.terms_direction || 'desc';
-      _lodash2.default.set(doc, `aggs.${series.id}.terms.field`, series.terms_field);
-      _lodash2.default.set(doc, `aggs.${series.id}.terms.size`, series.terms_size);
+      (0, _helpers.overwrite)(doc, `aggs.${series.id}.terms.field`, series.terms_field);
+      (0, _helpers.overwrite)(doc, `aggs.${series.id}.terms.size`, series.terms_size);
       const metric = series.metrics.find(item => item.id === series.terms_order_by);
       if (metric && metric.type !== 'count' && ~_basic_aggs2.default.indexOf(metric.type)) {
         const sortAggKey = `${series.terms_order_by}-SORT`;
         const fn = _bucket_transform2.default[metric.type];
         const bucketPath = (0, _get_buckets_path2.default)(series.terms_order_by, series.metrics).replace(series.terms_order_by, sortAggKey);
-        _lodash2.default.set(doc, `aggs.${series.id}.terms.order`, { [bucketPath]: direction });
-        _lodash2.default.set(doc, `aggs.${series.id}.aggs`, { [sortAggKey]: fn(metric) });
+        (0, _helpers.overwrite)(doc, `aggs.${series.id}.terms.order`, { [bucketPath]: direction });
+        (0, _helpers.overwrite)(doc, `aggs.${series.id}.aggs`, { [sortAggKey]: fn(metric) });
       } else if (['_term', '_count'].includes(series.terms_order_by)) {
-        _lodash2.default.set(doc, `aggs.${series.id}.terms.order`, { [series.terms_order_by]: direction });
+        (0, _helpers.overwrite)(doc, `aggs.${series.id}.terms.order`, { [series.terms_order_by]: direction });
       } else {
-        _lodash2.default.set(doc, `aggs.${series.id}.terms.order`, { _count: direction });
+        (0, _helpers.overwrite)(doc, `aggs.${series.id}.terms.order`, { _count: direction });
       }
     }
     return next(doc);
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/date_histogram.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/date_histogram.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/date_histogram.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/date_histogram.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,7 +5,7 @@
 });
 exports.default = dateHistogram;
 
-var _lodash = require('lodash');
+var _helpers = require('../../helpers');
 
 var _get_bucket_size = require('../../helpers/get_bucket_size');
 
@@ -30,7 +30,7 @@
     const { from, to } = (0, _get_timerange2.default)(req);
     panel.series.forEach(column => {
       const aggRoot = (0, _calculate_agg_root.calculateAggRoot)(doc, column);
-      (0, _lodash.set)(doc, `${aggRoot}.timeseries.date_histogram`, {
+      (0, _helpers.overwrite)(doc, `${aggRoot}.timeseries.date_histogram`, {
         field: timeField,
         interval: intervalString,
         min_doc_count: 0,
@@ -39,7 +39,7 @@
           max: to.valueOf()
         }
       });
-      (0, _lodash.set)(doc, aggRoot.replace(/\.aggs$/, '.meta'), {
+      (0, _helpers.overwrite)(doc, aggRoot.replace(/\.aggs$/, '.meta'), {
         timeField,
         intervalString,
         bucketSize
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/filter_ratios.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/filter_ratios.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/filter_ratios.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/filter_ratios.js	2020-05-08 18:20:53.000000000 +0100
@@ -9,9 +9,7 @@
 
 var _bucket_transform2 = _interopRequireDefault(_bucket_transform);
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
+var _helpers = require('../../helpers');
 
 var _calculate_agg_root = require('./calculate_agg_root');
 
@@ -44,10 +42,10 @@
       const aggRoot = (0, _calculate_agg_root.calculateAggRoot)(doc, column);
       if (column.metrics.some(filter)) {
         column.metrics.filter(filter).forEach(metric => {
-          _lodash2.default.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.filter`, {
+          (0, _helpers.overwrite)(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.filter`, {
             query_string: { query: metric.numerator || '*', analyze_wildcard: true }
           });
-          _lodash2.default.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-denominator.filter`, {
+          (0, _helpers.overwrite)(doc, `${aggRoot}.timeseries.aggs.${metric.id}-denominator.filter`, {
             query_string: { query: metric.denominator || '*', analyze_wildcard: true }
           });
 
@@ -61,13 +59,13 @@
                 field: metric.field
               })
             };
-            _lodash2.default.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
-            _lodash2.default.set(doc, `${aggBody}.timeseries.aggs.${metric.id}-denominator.aggs`, aggBody);
+            (0, _helpers.overwrite)(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
+            (0, _helpers.overwrite)(doc, `${aggBody}.timeseries.aggs.${metric.id}-denominator.aggs`, aggBody);
             numeratorPath = `${metric.id}-numerator>metric`;
             denominatorPath = `${metric.id}-denominator>metric`;
           }
 
-          _lodash2.default.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, {
+          (0, _helpers.overwrite)(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, {
             bucket_script: {
               buckets_path: {
                 numerator: numeratorPath,
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/metric_buckets.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/metric_buckets.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/metric_buckets.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/metric_buckets.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,9 +5,7 @@
 });
 exports.default = metricBuckets;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
+var _helpers = require('../../helpers');
 
 var _get_bucket_size = require('../../helpers/get_bucket_size');
 
@@ -36,7 +34,7 @@
         if (fn) {
           try {
             const bucket = fn(metric, column.metrics, intervalString);
-            _lodash2.default.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, bucket);
+            (0, _helpers.overwrite)(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, bucket);
           } catch (e) {
             // meh
           }
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/pivot.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/pivot.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/pivot.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/pivot.js	2020-05-08 18:20:53.000000000 +0100
@@ -7,6 +7,10 @@
 
 var _lodash = require('lodash');
 
+var _lodash2 = _interopRequireDefault(_lodash);
+
+var _helpers = require('../../helpers');
+
 var _basic_aggs = require('../../../../../common/basic_aggs');
 
 var _basic_aggs2 = _interopRequireDefault(_basic_aggs);
@@ -21,50 +25,49 @@
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
 function pivot(req, panel) {
   return next => doc => {
     const { sort } = req.payload.state;
     if (panel.pivot_id) {
-      (0, _lodash.set)(doc, 'aggs.pivot.terms.field', panel.pivot_id);
-      (0, _lodash.set)(doc, 'aggs.pivot.terms.size', panel.pivot_rows);
+      (0, _helpers.overwrite)(doc, 'aggs.pivot.terms.field', panel.pivot_id);
+      (0, _helpers.overwrite)(doc, 'aggs.pivot.terms.size', panel.pivot_rows);
       if (sort) {
         const series = panel.series.find(item => item.id === sort.column);
-        const metric = series && (0, _lodash.last)(series.metrics);
+        const metric = series && _lodash2.default.last(series.metrics);
         if (metric && metric.type === 'count') {
-          (0, _lodash.set)(doc, 'aggs.pivot.terms.order', { _count: sort.order });
+          (0, _helpers.overwrite)(doc, 'aggs.pivot.terms.order', { _count: sort.order });
         } else if (metric && _basic_aggs2.default.includes(metric.type)) {
           const sortAggKey = `${metric.id}-SORT`;
           const fn = _bucket_transform2.default[metric.type];
           const bucketPath = (0, _get_buckets_path2.default)(metric.id, series.metrics).replace(metric.id, sortAggKey);
-          (0, _lodash.set)(doc, `aggs.pivot.terms.order`, { [bucketPath]: sort.order });
-          (0, _lodash.set)(doc, `aggs.pivot.aggs`, { [sortAggKey]: fn(metric) });
+          (0, _helpers.overwrite)(doc, `aggs.pivot.terms.order`, { [bucketPath]: sort.order });
+          (0, _helpers.overwrite)(doc, `aggs.pivot.aggs`, { [sortAggKey]: fn(metric) });
         } else {
-          (0, _lodash.set)(doc, 'aggs.pivot.terms.order', { _term: (0, _lodash.get)(sort, 'order', 'asc') });
+          (0, _helpers.overwrite)(doc, 'aggs.pivot.terms.order', { _term: _lodash2.default.get(sort, 'order', 'asc') });
         }
       }
     } else {
-      (0, _lodash.set)(doc, 'aggs.pivot.filter.match_all', {});
+      (0, _helpers.overwrite)(doc, 'aggs.pivot.filter.match_all', {});
     }
     return next(doc);
   };
-}
+} /*
+   * Licensed to Elasticsearch B.V. under one or more contributor
+   * license agreements. See the NOTICE file distributed with
+   * this work for additional information regarding copyright
+   * ownership. Elasticsearch B.V. licenses this file to you under
+   * the Apache License, Version 2.0 (the "License"); you may
+   * not use this file except in compliance with the License.
+   * You may obtain a copy of the License at
+   *
+   *    http://www.apache.org/licenses/LICENSE-2.0
+   *
+   * Unless required by applicable law or agreed to in writing,
+   * software distributed under the License is distributed on an
+   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   * KIND, either express or implied.  See the License for the
+   * specific language governing permissions and limitations
+   * under the License.
+   */
+
 module.exports = exports['default'];
\ No newline at end of file
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/sibling_buckets.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/sibling_buckets.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/sibling_buckets.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/sibling_buckets.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,9 +5,7 @@
 });
 exports.default = siblingBuckets;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
+var _helpers = require('../../helpers');
 
 var _get_bucket_size = require('../../helpers/get_bucket_size');
 
@@ -36,7 +34,7 @@
         if (fn) {
           try {
             const bucket = fn(metric, column.metrics, bucketSize);
-            _lodash2.default.set(doc, `${aggRoot}.${metric.id}`, bucket);
+            (0, _helpers.overwrite)(doc, `${aggRoot}.${metric.id}`, bucket);
           } catch (e) {
             // meh
           }
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/split_by_everything.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/split_by_everything.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/split_by_everything.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/split_by_everything.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,20 +5,16 @@
 });
 exports.default = splitByEverything;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _helpers = require('../../helpers');
 
 function splitByEverything(req, panel) {
   return next => doc => {
     panel.series.filter(c => !(c.aggregate_by && c.aggregate_function)).forEach(column => {
       if (column.filter) {
-        _lodash2.default.set(doc, `aggs.pivot.aggs.${column.id}.filter.query_string.query`, column.filter);
-        _lodash2.default.set(doc, `aggs.pivot.aggs.${column.id}.filter.query_string.analyze_wildcard`, true);
+        (0, _helpers.overwrite)(doc, `aggs.pivot.aggs.${column.id}.filter.query_string.query`, column.filter);
+        (0, _helpers.overwrite)(doc, `aggs.pivot.aggs.${column.id}.filter.query_string.analyze_wildcard`, true);
       } else {
-        _lodash2.default.set(doc, `aggs.pivot.aggs.${column.id}.filter.match_all`, {});
+        (0, _helpers.overwrite)(doc, `aggs.pivot.aggs.${column.id}.filter.match_all`, {});
       }
     });
     return next(doc);
diff -ur --new-file src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/split_by_terms.js src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/split_by_terms.js
--- src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/split_by_terms.js	2019-04-29 10:30:08.000000000 +0100
+++ src/legacy/core_plugins/metrics/server/lib/vis_data/request_processors/table/split_by_terms.js	2020-05-08 18:20:53.000000000 +0100
@@ -5,20 +5,16 @@
 });
 exports.default = splitByTerm;
 
-var _lodash = require('lodash');
-
-var _lodash2 = _interopRequireDefault(_lodash);
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+var _helpers = require('../../helpers');
 
 function splitByTerm(req, panel) {
   return next => doc => {
     panel.series.filter(c => c.aggregate_by && c.aggregate_function).forEach(column => {
-      _lodash2.default.set(doc, `aggs.pivot.aggs.${column.id}.terms.field`, column.aggregate_by);
-      _lodash2.default.set(doc, `aggs.pivot.aggs.${column.id}.terms.size`, 100);
+      (0, _helpers.overwrite)(doc, `aggs.pivot.aggs.${column.id}.terms.field`, column.aggregate_by);
+      (0, _helpers.overwrite)(doc, `aggs.pivot.aggs.${column.id}.terms.size`, 100);
       if (column.filter) {
-        _lodash2.default.set(doc, `aggs.pivot.aggs.${column.id}.column_filter.filter.query_string.query`, column.filter);
-        _lodash2.default.set(doc, `aggs.pivot.aggs.${column.id}.column_filter.filter.query_string.analyze_wildcard`, true);
+        (0, _helpers.overwrite)(doc, `aggs.pivot.aggs.${column.id}.column_filter.filter.query_string.query`, column.filter);
+        (0, _helpers.overwrite)(doc, `aggs.pivot.aggs.${column.id}.column_filter.filter.query_string.analyze_wildcard`, true);
       }
     });
     return next(doc);

@timroes
Copy link
Contributor

timroes commented May 19, 2020

✔️ Done

@timroes timroes closed this May 19, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport test-matrix Use this label to ensure PRs are tested with matrix jobs
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants