mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 09:19:04 -04:00
Applying TSVB fixes to 7.6
This commit is contained in:
parent
f882f9c15d
commit
c685aaccf0
23 changed files with 135 additions and 81 deletions
|
@ -138,6 +138,7 @@
|
|||
"@types/node-forge": "^0.9.0",
|
||||
"@types/react-grid-layout": "^0.16.7",
|
||||
"@types/recompose": "^0.30.5",
|
||||
"@types/set-value": "^2.0.0",
|
||||
"JSONStream": "1.3.5",
|
||||
"abortcontroller-polyfill": "^1.3.0",
|
||||
"angular": "^1.7.9",
|
||||
|
@ -253,6 +254,7 @@
|
|||
"script-loader": "0.7.2",
|
||||
"seedrandom": "^3.0.5",
|
||||
"semver": "^5.5.0",
|
||||
"set-value": "^3.0.2",
|
||||
"style-loader": "0.23.1",
|
||||
"symbol-observable": "^1.2.0",
|
||||
"tar": "4.4.13",
|
||||
|
|
|
@ -29,6 +29,8 @@ import { getTimerange } from './get_timerange';
|
|||
import { mapBucket } from './map_bucket';
|
||||
import { parseSettings } from './parse_settings';
|
||||
|
||||
export { overwrite } from './overwrite';
|
||||
|
||||
export const helpers = {
|
||||
bucketTransform,
|
||||
getAggValue,
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
import set from 'set-value';
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
export function overwrite(obj, path, val) {
|
||||
set(obj, path, undefined);
|
||||
set(obj, path, val);
|
||||
}
|
|
@ -16,11 +16,10 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
import _ from 'lodash';
|
||||
import { dateHistogramInterval } from '../../../../../../data/server';
|
||||
import { getBucketSize } from '../../helpers/get_bucket_size';
|
||||
import { getTimerange } from '../../helpers/get_timerange';
|
||||
import { overwrite } from '../../helpers';
|
||||
|
||||
export function dateHistogram(
|
||||
req,
|
||||
|
@ -36,7 +35,7 @@ export function dateHistogram(
|
|||
const { from, to } = getTimerange(req);
|
||||
const timezone = capabilities.searchTimezone;
|
||||
|
||||
_.set(doc, `aggs.${annotation.id}.date_histogram`, {
|
||||
overwrite(doc, `aggs.${annotation.id}.date_histogram`, {
|
||||
field: timeField,
|
||||
min_doc_count: 0,
|
||||
time_zone: timezone,
|
||||
|
|
|
@ -17,13 +17,13 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import _ from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
|
||||
export function topHits(req, panel, annotation) {
|
||||
return next => doc => {
|
||||
const fields = (annotation.fields && annotation.fields.split(/[,\s]+/)) || [];
|
||||
const timeField = annotation.time_field;
|
||||
_.set(doc, `aggs.${annotation.id}.aggs.hits.top_hits`, {
|
||||
overwrite(doc, `aggs.${annotation.id}.aggs.hits.top_hits`, {
|
||||
sort: [
|
||||
{
|
||||
[timeField]: { order: 'desc' },
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { set } from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { dateHistogramInterval } from '../../../../../../data/server';
|
||||
import { getBucketSize } from '../../helpers/get_bucket_size';
|
||||
import { offsetTime } from '../../offset_time';
|
||||
|
@ -33,7 +33,7 @@ export function dateHistogram(req, panel, series, esQueryConfig, indexPatternObj
|
|||
const { from, to } = offsetTime(req, series.offset_time);
|
||||
const timezone = capabilities.searchTimezone;
|
||||
|
||||
set(doc, `aggs.${series.id}.aggs.timeseries.date_histogram`, {
|
||||
overwrite(doc, `aggs.${series.id}.aggs.timeseries.date_histogram`, {
|
||||
field: timeField,
|
||||
min_doc_count: 0,
|
||||
time_zone: timezone,
|
||||
|
@ -46,7 +46,7 @@ export function dateHistogram(req, panel, series, esQueryConfig, indexPatternObj
|
|||
};
|
||||
|
||||
const getDateHistogramForEntireTimerangeMode = () =>
|
||||
set(doc, `aggs.${series.id}.aggs.timeseries.auto_date_histogram`, {
|
||||
overwrite(doc, `aggs.${series.id}.aggs.timeseries.auto_date_histogram`, {
|
||||
field: timeField,
|
||||
buckets: 1,
|
||||
});
|
||||
|
@ -57,7 +57,7 @@ export function dateHistogram(req, panel, series, esQueryConfig, indexPatternObj
|
|||
|
||||
// master
|
||||
|
||||
set(doc, `aggs.${series.id}.meta`, {
|
||||
overwrite(doc, `aggs.${series.id}.meta`, {
|
||||
timeField,
|
||||
intervalString,
|
||||
bucketSize,
|
||||
|
|
|
@ -19,16 +19,16 @@
|
|||
|
||||
const filter = metric => metric.type === 'filter_ratio';
|
||||
import { bucketTransform } from '../../helpers/bucket_transform';
|
||||
import _ from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
|
||||
export function ratios(req, panel, series) {
|
||||
return next => doc => {
|
||||
if (series.metrics.some(filter)) {
|
||||
series.metrics.filter(filter).forEach(metric => {
|
||||
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, {
|
||||
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, {
|
||||
query_string: { query: metric.numerator || '*', analyze_wildcard: true },
|
||||
});
|
||||
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, {
|
||||
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, {
|
||||
query_string: { query: metric.denominator || '*', analyze_wildcard: true },
|
||||
});
|
||||
|
||||
|
@ -46,8 +46,12 @@ export function ratios(req, panel, series) {
|
|||
metricAgg = {};
|
||||
}
|
||||
const aggBody = { metric: metricAgg };
|
||||
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
|
||||
_.set(
|
||||
overwrite(
|
||||
doc,
|
||||
`aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.aggs`,
|
||||
aggBody
|
||||
);
|
||||
overwrite(
|
||||
doc,
|
||||
`aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.aggs`,
|
||||
aggBody
|
||||
|
@ -56,7 +60,7 @@ export function ratios(req, panel, series) {
|
|||
denominatorPath = `${metric.id}-denominator>metric`;
|
||||
}
|
||||
|
||||
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, {
|
||||
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, {
|
||||
bucket_script: {
|
||||
buckets_path: {
|
||||
numerator: numeratorPath,
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import _ from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { getBucketSize } from '../../helpers/get_bucket_size';
|
||||
import { bucketTransform } from '../../helpers/bucket_transform';
|
||||
import { getIntervalAndTimefield } from '../../get_interval_and_timefield';
|
||||
|
@ -33,7 +33,7 @@ export function metricBuckets(req, panel, series, esQueryConfig, indexPatternObj
|
|||
if (fn) {
|
||||
try {
|
||||
const bucket = fn(metric, series.metrics, intervalString);
|
||||
_.set(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, bucket);
|
||||
overwrite(doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}`, bucket);
|
||||
} catch (e) {
|
||||
// meh
|
||||
}
|
||||
|
|
|
@ -16,9 +16,10 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
const { set, get, isEmpty } = require('lodash');
|
||||
import { overwrite } from '../../helpers';
|
||||
import _ from 'lodash';
|
||||
|
||||
const isEmptyFilter = (filter = {}) => Boolean(filter.match_all) && isEmpty(filter.match_all);
|
||||
const isEmptyFilter = (filter = {}) => Boolean(filter.match_all) && _.isEmpty(filter.match_all);
|
||||
const hasSiblingPipelineAggregation = (aggs = {}) => Object.keys(aggs).length > 1;
|
||||
|
||||
/* For grouping by the 'Everything', the splitByEverything request processor
|
||||
|
@ -30,12 +31,12 @@ const hasSiblingPipelineAggregation = (aggs = {}) => Object.keys(aggs).length >
|
|||
*
|
||||
*/
|
||||
function removeEmptyTopLevelAggregation(doc, series) {
|
||||
const filter = get(doc, `aggs.${series.id}.filter`);
|
||||
const filter = _.get(doc, `aggs.${series.id}.filter`);
|
||||
|
||||
if (isEmptyFilter(filter) && !hasSiblingPipelineAggregation(doc.aggs[series.id].aggs)) {
|
||||
const meta = get(doc, `aggs.${series.id}.meta`);
|
||||
set(doc, `aggs`, doc.aggs[series.id].aggs);
|
||||
set(doc, `aggs.timeseries.meta`, meta);
|
||||
const meta = _.get(doc, `aggs.${series.id}.meta`);
|
||||
overwrite(doc, `aggs`, doc.aggs[series.id].aggs);
|
||||
overwrite(doc, `aggs.timeseries.meta`, meta);
|
||||
}
|
||||
|
||||
return doc;
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import _ from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { getBucketSize } from '../../helpers/get_bucket_size';
|
||||
import { bucketTransform } from '../../helpers/bucket_transform';
|
||||
import { getIntervalAndTimefield } from '../../get_interval_and_timefield';
|
||||
|
@ -40,7 +40,7 @@ export function siblingBuckets(
|
|||
if (fn) {
|
||||
try {
|
||||
const bucket = fn(metric, series.metrics, bucketSize);
|
||||
_.set(doc, `aggs.${series.id}.aggs.${metric.id}`, bucket);
|
||||
overwrite(doc, `aggs.${series.id}.aggs.${metric.id}`, bucket);
|
||||
} catch (e) {
|
||||
// meh
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import _ from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
|
||||
export function splitByEverything(req, panel, series) {
|
||||
return next => doc => {
|
||||
|
@ -25,7 +25,7 @@ export function splitByEverything(req, panel, series) {
|
|||
series.split_mode === 'everything' ||
|
||||
(series.split_mode === 'terms' && !series.terms_field)
|
||||
) {
|
||||
_.set(doc, `aggs.${series.id}.filter.match_all`, {});
|
||||
overwrite(doc, `aggs.${series.id}.filter.match_all`, {});
|
||||
}
|
||||
return next(doc);
|
||||
};
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { set } from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { esQuery } from '../../../../../../../../plugins/data/server';
|
||||
|
||||
export function splitByFilter(req, panel, series, esQueryConfig, indexPattern) {
|
||||
|
@ -26,7 +26,7 @@ export function splitByFilter(req, panel, series, esQueryConfig, indexPattern) {
|
|||
return next(doc);
|
||||
}
|
||||
|
||||
set(
|
||||
overwrite(
|
||||
doc,
|
||||
`aggs.${series.id}.filter`,
|
||||
esQuery.buildEsQuery(indexPattern, [series.filter], [], esQueryConfig)
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { set } from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { esQuery } from '../../../../../../../../plugins/data/server';
|
||||
|
||||
export function splitByFilters(req, panel, series, esQueryConfig, indexPattern) {
|
||||
|
@ -26,7 +26,7 @@ export function splitByFilters(req, panel, series, esQueryConfig, indexPattern)
|
|||
series.split_filters.forEach(filter => {
|
||||
const builtEsQuery = esQuery.buildEsQuery(indexPattern, [filter.filter], [], esQueryConfig);
|
||||
|
||||
set(doc, `aggs.${series.id}.filters.filters.${filter.id}`, builtEsQuery);
|
||||
overwrite(doc, `aggs.${series.id}.filters.filters.${filter.id}`, builtEsQuery);
|
||||
});
|
||||
}
|
||||
return next(doc);
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { set } from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { basicAggs } from '../../../../../common/basic_aggs';
|
||||
import { getBucketsPath } from '../../helpers/get_buckets_path';
|
||||
import { bucketTransform } from '../../helpers/bucket_transform';
|
||||
|
@ -27,13 +27,13 @@ export function splitByTerms(req, panel, series) {
|
|||
if (series.split_mode === 'terms' && series.terms_field) {
|
||||
const direction = series.terms_direction || 'desc';
|
||||
const metric = series.metrics.find(item => item.id === series.terms_order_by);
|
||||
set(doc, `aggs.${series.id}.terms.field`, series.terms_field);
|
||||
set(doc, `aggs.${series.id}.terms.size`, series.terms_size);
|
||||
overwrite(doc, `aggs.${series.id}.terms.field`, series.terms_field);
|
||||
overwrite(doc, `aggs.${series.id}.terms.size`, series.terms_size);
|
||||
if (series.terms_include) {
|
||||
set(doc, `aggs.${series.id}.terms.include`, series.terms_include);
|
||||
overwrite(doc, `aggs.${series.id}.terms.include`, series.terms_include);
|
||||
}
|
||||
if (series.terms_exclude) {
|
||||
set(doc, `aggs.${series.id}.terms.exclude`, series.terms_exclude);
|
||||
overwrite(doc, `aggs.${series.id}.terms.exclude`, series.terms_exclude);
|
||||
}
|
||||
if (metric && metric.type !== 'count' && ~basicAggs.indexOf(metric.type)) {
|
||||
const sortAggKey = `${series.terms_order_by}-SORT`;
|
||||
|
@ -42,12 +42,12 @@ export function splitByTerms(req, panel, series) {
|
|||
series.terms_order_by,
|
||||
sortAggKey
|
||||
);
|
||||
set(doc, `aggs.${series.id}.terms.order`, { [bucketPath]: direction });
|
||||
set(doc, `aggs.${series.id}.aggs`, { [sortAggKey]: fn(metric) });
|
||||
overwrite(doc, `aggs.${series.id}.terms.order`, { [bucketPath]: direction });
|
||||
overwrite(doc, `aggs.${series.id}.aggs`, { [sortAggKey]: fn(metric) });
|
||||
} else if (['_key', '_count'].includes(series.terms_order_by)) {
|
||||
set(doc, `aggs.${series.id}.terms.order`, { [series.terms_order_by]: direction });
|
||||
overwrite(doc, `aggs.${series.id}.terms.order`, { [series.terms_order_by]: direction });
|
||||
} else {
|
||||
set(doc, `aggs.${series.id}.terms.order`, { _count: direction });
|
||||
overwrite(doc, `aggs.${series.id}.terms.order`, { _count: direction });
|
||||
}
|
||||
}
|
||||
return next(doc);
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { set } from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { dateHistogramInterval } from '../../../../../../data/server';
|
||||
import { getBucketSize } from '../../helpers/get_bucket_size';
|
||||
import { isLastValueTimerangeMode } from '../../helpers/get_timerange_mode';
|
||||
|
@ -40,7 +40,7 @@ export function dateHistogram(req, panel, esQueryConfig, indexPatternObject, cap
|
|||
panel.series.forEach(column => {
|
||||
const aggRoot = calculateAggRoot(doc, column);
|
||||
|
||||
set(doc, `${aggRoot}.timeseries.date_histogram`, {
|
||||
overwrite(doc, `${aggRoot}.timeseries.date_histogram`, {
|
||||
field: timeField,
|
||||
min_doc_count: 0,
|
||||
time_zone: timezone,
|
||||
|
@ -51,7 +51,7 @@ export function dateHistogram(req, panel, esQueryConfig, indexPatternObject, cap
|
|||
...dateHistogramInterval(intervalString),
|
||||
});
|
||||
|
||||
set(doc, aggRoot.replace(/\.aggs$/, '.meta'), {
|
||||
overwrite(doc, aggRoot.replace(/\.aggs$/, '.meta'), {
|
||||
timeField,
|
||||
intervalString,
|
||||
bucketSize,
|
||||
|
@ -63,12 +63,12 @@ export function dateHistogram(req, panel, esQueryConfig, indexPatternObject, cap
|
|||
panel.series.forEach(column => {
|
||||
const aggRoot = calculateAggRoot(doc, column);
|
||||
|
||||
set(doc, `${aggRoot}.timeseries.auto_date_histogram`, {
|
||||
overwrite(doc, `${aggRoot}.timeseries.auto_date_histogram`, {
|
||||
field: timeField,
|
||||
buckets: 1,
|
||||
});
|
||||
|
||||
set(doc, aggRoot.replace(/\.aggs$/, '.meta'), meta);
|
||||
overwrite(doc, aggRoot.replace(/\.aggs$/, '.meta'), meta);
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
const filter = metric => metric.type === 'filter_ratio';
|
||||
import { bucketTransform } from '../../helpers/bucket_transform';
|
||||
import _ from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { calculateAggRoot } from './calculate_agg_root';
|
||||
|
||||
export function ratios(req, panel) {
|
||||
|
@ -28,10 +28,10 @@ export function ratios(req, panel) {
|
|||
const aggRoot = calculateAggRoot(doc, column);
|
||||
if (column.metrics.some(filter)) {
|
||||
column.metrics.filter(filter).forEach(metric => {
|
||||
_.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.filter`, {
|
||||
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.filter`, {
|
||||
query_string: { query: metric.numerator || '*', analyze_wildcard: true },
|
||||
});
|
||||
_.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-denominator.filter`, {
|
||||
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}-denominator.filter`, {
|
||||
query_string: { query: metric.denominator || '*', analyze_wildcard: true },
|
||||
});
|
||||
|
||||
|
@ -45,13 +45,13 @@ export function ratios(req, panel) {
|
|||
field: metric.field,
|
||||
}),
|
||||
};
|
||||
_.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
|
||||
_.set(doc, `${aggBody}.timeseries.aggs.${metric.id}-denominator.aggs`, aggBody);
|
||||
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.aggs`, aggBody);
|
||||
overwrite(doc, `${aggBody}.timeseries.aggs.${metric.id}-denominator.aggs`, aggBody);
|
||||
numeratorPath = `${metric.id}-numerator>metric`;
|
||||
denominatorPath = `${metric.id}-denominator>metric`;
|
||||
}
|
||||
|
||||
_.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, {
|
||||
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, {
|
||||
bucket_script: {
|
||||
buckets_path: {
|
||||
numerator: numeratorPath,
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import _ from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { getBucketSize } from '../../helpers/get_bucket_size';
|
||||
import { bucketTransform } from '../../helpers/bucket_transform';
|
||||
import { getIntervalAndTimefield } from '../../get_interval_and_timefield';
|
||||
|
@ -36,7 +36,7 @@ export function metricBuckets(req, panel, esQueryConfig, indexPatternObject) {
|
|||
if (fn) {
|
||||
try {
|
||||
const bucket = fn(metric, column.metrics, intervalString);
|
||||
_.set(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, bucket);
|
||||
overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, bucket);
|
||||
} catch (e) {
|
||||
// meh
|
||||
}
|
||||
|
|
|
@ -16,9 +16,11 @@
|
|||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
const { set, get, isEmpty, forEach } = require('lodash');
|
||||
import _ from 'lodash';
|
||||
|
||||
const isEmptyFilter = (filter = {}) => Boolean(filter.match_all) && isEmpty(filter.match_all);
|
||||
import { overwrite } from '../../helpers';
|
||||
|
||||
const isEmptyFilter = (filter = {}) => Boolean(filter.match_all) && _.isEmpty(filter.match_all);
|
||||
const hasSiblingPipelineAggregation = (aggs = {}) => Object.keys(aggs).length > 1;
|
||||
|
||||
/* Last query handler in the chain. You can use this handler
|
||||
|
@ -29,26 +31,26 @@ const hasSiblingPipelineAggregation = (aggs = {}) => Object.keys(aggs).length >
|
|||
*/
|
||||
export function normalizeQuery() {
|
||||
return () => doc => {
|
||||
const series = get(doc, 'aggs.pivot.aggs');
|
||||
const series = _.get(doc, 'aggs.pivot.aggs');
|
||||
const normalizedSeries = {};
|
||||
|
||||
forEach(series, (value, seriesId) => {
|
||||
const filter = get(value, `filter`);
|
||||
_.forEach(series, (value, seriesId) => {
|
||||
const filter = _.get(value, `filter`);
|
||||
|
||||
if (isEmptyFilter(filter) && !hasSiblingPipelineAggregation(value.aggs)) {
|
||||
const agg = get(value, 'aggs.timeseries');
|
||||
const agg = _.get(value, 'aggs.timeseries');
|
||||
const meta = {
|
||||
...get(value, 'meta'),
|
||||
..._.get(value, 'meta'),
|
||||
seriesId,
|
||||
};
|
||||
set(normalizedSeries, `${seriesId}`, agg);
|
||||
set(normalizedSeries, `${seriesId}.meta`, meta);
|
||||
overwrite(normalizedSeries, `${seriesId}`, agg);
|
||||
overwrite(normalizedSeries, `${seriesId}.meta`, meta);
|
||||
} else {
|
||||
set(normalizedSeries, `${seriesId}`, value);
|
||||
overwrite(normalizedSeries, `${seriesId}`, value);
|
||||
}
|
||||
});
|
||||
|
||||
set(doc, 'aggs.pivot.aggs', normalizedSeries);
|
||||
overwrite(doc, 'aggs.pivot.aggs', normalizedSeries);
|
||||
|
||||
return doc;
|
||||
};
|
||||
|
|
|
@ -17,7 +17,8 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { get, set, last } from 'lodash';
|
||||
import { get, last } from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
|
||||
import { basicAggs } from '../../../../../common/basic_aggs';
|
||||
import { getBucketsPath } from '../../helpers/get_buckets_path';
|
||||
|
@ -27,13 +28,13 @@ export function pivot(req, panel) {
|
|||
return next => doc => {
|
||||
const { sort } = req.payload.state;
|
||||
if (panel.pivot_id) {
|
||||
set(doc, 'aggs.pivot.terms.field', panel.pivot_id);
|
||||
set(doc, 'aggs.pivot.terms.size', panel.pivot_rows);
|
||||
overwrite(doc, 'aggs.pivot.terms.field', panel.pivot_id);
|
||||
overwrite(doc, 'aggs.pivot.terms.size', panel.pivot_rows);
|
||||
if (sort) {
|
||||
const series = panel.series.find(item => item.id === sort.column);
|
||||
const metric = series && last(series.metrics);
|
||||
if (metric && metric.type === 'count') {
|
||||
set(doc, 'aggs.pivot.terms.order', { _count: sort.order });
|
||||
overwrite(doc, 'aggs.pivot.terms.order', { _count: sort.order });
|
||||
} else if (metric && basicAggs.includes(metric.type)) {
|
||||
const sortAggKey = `${metric.id}-SORT`;
|
||||
const fn = bucketTransform[metric.type];
|
||||
|
@ -41,16 +42,16 @@ export function pivot(req, panel) {
|
|||
metric.id,
|
||||
sortAggKey
|
||||
);
|
||||
set(doc, `aggs.pivot.terms.order`, { [bucketPath]: sort.order });
|
||||
set(doc, `aggs.pivot.aggs`, { [sortAggKey]: fn(metric) });
|
||||
overwrite(doc, `aggs.pivot.terms.order`, { [bucketPath]: sort.order });
|
||||
overwrite(doc, `aggs.pivot.aggs`, { [sortAggKey]: fn(metric) });
|
||||
} else {
|
||||
set(doc, 'aggs.pivot.terms.order', {
|
||||
overwrite(doc, 'aggs.pivot.terms.order', {
|
||||
_key: get(sort, 'order', 'asc'),
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
set(doc, 'aggs.pivot.filter.match_all', {});
|
||||
overwrite(doc, 'aggs.pivot.filter.match_all', {});
|
||||
}
|
||||
return next(doc);
|
||||
};
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import _ from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { getBucketSize } from '../../helpers/get_bucket_size';
|
||||
import { bucketTransform } from '../../helpers/bucket_transform';
|
||||
import { getIntervalAndTimefield } from '../../get_interval_and_timefield';
|
||||
|
@ -36,7 +36,7 @@ export function siblingBuckets(req, panel, esQueryConfig, indexPatternObject) {
|
|||
if (fn) {
|
||||
try {
|
||||
const bucket = fn(metric, column.metrics, bucketSize);
|
||||
_.set(doc, `${aggRoot}.${metric.id}`, bucket);
|
||||
overwrite(doc, `${aggRoot}.${metric.id}`, bucket);
|
||||
} catch (e) {
|
||||
// meh
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { set } from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { esQuery } from '../../../../../../../../plugins/data/server';
|
||||
|
||||
export function splitByEverything(req, panel, esQueryConfig, indexPattern) {
|
||||
|
@ -26,13 +26,13 @@ export function splitByEverything(req, panel, esQueryConfig, indexPattern) {
|
|||
.filter(c => !(c.aggregate_by && c.aggregate_function))
|
||||
.forEach(column => {
|
||||
if (column.filter) {
|
||||
set(
|
||||
overwrite(
|
||||
doc,
|
||||
`aggs.pivot.aggs.${column.id}.filter`,
|
||||
esQuery.buildEsQuery(indexPattern, [column.filter], [], esQueryConfig)
|
||||
);
|
||||
} else {
|
||||
set(doc, `aggs.pivot.aggs.${column.id}.filter.match_all`, {});
|
||||
overwrite(doc, `aggs.pivot.aggs.${column.id}.filter.match_all`, {});
|
||||
}
|
||||
});
|
||||
return next(doc);
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
* under the License.
|
||||
*/
|
||||
|
||||
import { set } from 'lodash';
|
||||
import { overwrite } from '../../helpers';
|
||||
import { esQuery } from '../../../../../../../../plugins/data/server';
|
||||
|
||||
export function splitByTerms(req, panel, esQueryConfig, indexPattern) {
|
||||
|
@ -25,11 +25,11 @@ export function splitByTerms(req, panel, esQueryConfig, indexPattern) {
|
|||
panel.series
|
||||
.filter(c => c.aggregate_by && c.aggregate_function)
|
||||
.forEach(column => {
|
||||
set(doc, `aggs.pivot.aggs.${column.id}.terms.field`, column.aggregate_by);
|
||||
set(doc, `aggs.pivot.aggs.${column.id}.terms.size`, 100);
|
||||
overwrite(doc, `aggs.pivot.aggs.${column.id}.terms.field`, column.aggregate_by);
|
||||
overwrite(doc, `aggs.pivot.aggs.${column.id}.terms.size`, 100);
|
||||
|
||||
if (column.filter) {
|
||||
set(
|
||||
overwrite(
|
||||
doc,
|
||||
`aggs.pivot.aggs.${column.id}.column_filter.filter`,
|
||||
esQuery.buildEsQuery(indexPattern, [column.filter], [], esQueryConfig)
|
||||
|
|
12
yarn.lock
12
yarn.lock
|
@ -4703,6 +4703,11 @@
|
|||
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-5.5.0.tgz#146c2a29ee7d3bae4bf2fcb274636e264c813c45"
|
||||
integrity sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==
|
||||
|
||||
"@types/set-value@^2.0.0":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/set-value/-/set-value-2.0.0.tgz#63d386b103926dcf49b50e16e0f6dd49983046be"
|
||||
integrity sha512-k8dCJEC80F/mbsIOZ5Hj3YSzTVVVBwMdtP/M9Rtc2TM4F5etVd+2UG8QUiAUfbXm4fABedL2tBZnrBheY7UwpA==
|
||||
|
||||
"@types/shot@*":
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/shot/-/shot-4.0.0.tgz#7545500c489b65c69b5bc5446ba4fef3bd26af92"
|
||||
|
@ -26268,6 +26273,13 @@ set-value@^2.0.0, set-value@^2.0.1:
|
|||
is-plain-object "^2.0.3"
|
||||
split-string "^3.0.1"
|
||||
|
||||
set-value@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/set-value/-/set-value-3.0.2.tgz#74e8ecd023c33d0f77199d415409a40f21e61b90"
|
||||
integrity sha512-npjkVoz+ank0zjlV9F47Fdbjfj/PfXyVhZvGALWsyIYU/qrMzpi6avjKW3/7KeSU2Df3I46BrN1xOI1+6vW0hA==
|
||||
dependencies:
|
||||
is-plain-object "^2.0.4"
|
||||
|
||||
setimmediate@^1.0.4, setimmediate@^1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue