From ae90aae65d6d9a50398512f9155a782a1c0b18c6 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Wed, 30 Jan 2019 03:01:31 -0800 Subject: [PATCH 1/8] fixing vislib legend filters --- src/ui/public/agg_response/point_series/_add_to_siri.js | 1 + src/ui/public/vis/vis_filters.js | 3 ++- src/ui/public/vis/vis_types/vislib_vis_legend.js | 8 ++++++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/ui/public/agg_response/point_series/_add_to_siri.js b/src/ui/public/agg_response/point_series/_add_to_siri.js index 34372819c2413..ac017a87e669f 100644 --- a/src/ui/public/agg_response/point_series/_add_to_siri.js +++ b/src/ui/public/agg_response/point_series/_add_to_siri.js @@ -29,6 +29,7 @@ export function addToSiri(series, point, id, label, agg) { label: label == null ? id : label, aggLabel: agg.type ? agg.type.makeLabel(agg) : label, aggId: agg.parentId ? agg.parentId : agg.id, + aggConfigResult: agg, count: 0, values: [point] }); diff --git a/src/ui/public/vis/vis_filters.js b/src/ui/public/vis/vis_filters.js index 3085788c49c1f..743fc07b9bda6 100644 --- a/src/ui/public/vis/vis_filters.js +++ b/src/ui/public/vis/vis_filters.js @@ -83,6 +83,7 @@ const VisFiltersProvider = (Private, getAppState) => { const filter = (event, { simulate } = {}) => { let data = event.datum.aggConfigResult; + const shallow = event.shallow; const filters = []; while (data) { if (data.type === 'bucket') { @@ -98,7 +99,7 @@ const VisFiltersProvider = (Private, getAppState) => { } filters.push(filter); } - data = data.$parent; + data = shallow ? null : data.$parent; } if (!simulate) { const appState = getAppState(); diff --git a/src/ui/public/vis/vis_types/vislib_vis_legend.js b/src/ui/public/vis/vis_types/vislib_vis_legend.js index 9b17ed9433b4e..9ef9a9cc68472 100644 --- a/src/ui/public/vis/vis_types/vislib_vis_legend.js +++ b/src/ui/public/vis/vis_types/vislib_vis_legend.js @@ -102,11 +102,15 @@ uiModules.get('kibana') }; $scope.filter = function (legendData, negate) { - $scope.vis.API.events.filter({ datum: legendData.values, negate: negate }); + const value = Array.isArray(legendData.values) ? legendData.values[0] : legendData.values; + const datum = { aggConfigResult: value.aggConfigResult.$parent }; + $scope.vis.API.events.filter({ datum, negate: negate, shallow: true }); }; $scope.canFilter = function (legendData) { - const filters = visFilters.filter({ datum: legendData.values }, { simulate: true }); + const value = Array.isArray(legendData.values) ? legendData.values[0] : legendData.values; + const datum = { aggConfigResult: value.aggConfigResult.$parent }; + const filters = visFilters.filter({ datum, shallow: true }, { simulate: true }); return filters.length; }; From 22c0fba93e1143e74dbf1d2f0a943316d12d9a37 Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Thu, 31 Jan 2019 04:41:21 -0800 Subject: [PATCH 2/8] adding tests for vilisb legend filtering (#29604) --- test/functional/apps/visualize/_pie_chart.js | 63 +++++++++++++++++++ .../apps/visualize/_vertical_bar_chart.js | 11 ++++ 2 files changed, 74 insertions(+) diff --git a/test/functional/apps/visualize/_pie_chart.js b/test/functional/apps/visualize/_pie_chart.js index 23c6850910fc2..4e8334d45b100 100644 --- a/test/functional/apps/visualize/_pie_chart.js +++ b/test/functional/apps/visualize/_pie_chart.js @@ -213,6 +213,69 @@ export default function ({ getService, getPageObjects }) { }); }); describe('multi series slice', () => { + before(async () => { + log.debug('navigateToApp visualize'); + await PageObjects.visualize.navigateToNewVisualization(); + log.debug('clickPieChart'); + await PageObjects.visualize.clickPieChart(); + await PageObjects.visualize.clickNewSearch(); + log.debug('Set absolute time range from \"' + fromTime + '\" to \"' + toTime + '\"'); + await PageObjects.header.setAbsoluteRange(fromTime, toTime); + log.debug('select bucket Split Slices'); + await PageObjects.visualize.clickBucket('Split Slices'); + log.debug('Click aggregation Histogram'); + await PageObjects.visualize.selectAggregation('Histogram'); + log.debug('Click field memory'); + await PageObjects.visualize.selectField('memory'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.common.sleep(1003); + log.debug('setNumericInterval 4000'); + await PageObjects.visualize.setNumericInterval('40000'); + log.debug('Toggle previous editor'); + await PageObjects.visualize.toggleAggregationEditor(2); + await PageObjects.visualize.clickAddBucket(); + log.debug('select bucket Split Slices'); + await PageObjects.visualize.clickBucket('Split Slices'); + await PageObjects.visualize.selectAggregation('Terms'); + await PageObjects.visualize.selectField('geo.dest'); + await PageObjects.visualize.clickGo(); + }); + + it ('should show correct chart', async () => { + const expectedTableData = [ [ '0', '55', 'CN', '14' ], [ '0', '55', 'IN', '9' ], [ '0', '55', 'MX', '3' ], + [ '0', '55', 'US', '3' ], [ '0', '55', 'BR', '2' ], [ '40,000', '50', 'CN', '7' ], + [ '40,000', '50', 'IN', '7' ], [ '40,000', '50', 'US', '5' ], [ '40,000', '50', 'MY', '3' ], + [ '40,000', '50', 'ET', '2' ], [ '80,000', '41', 'CN', '9' ], [ '80,000', '41', 'IN', '4' ], + [ '80,000', '41', 'US', '4' ], [ '80,000', '41', 'BR', '3' ], [ '80,000', '41', 'IT', '2' ], + [ '120,000', '43', 'CN', '8' ], [ '120,000', '43', 'IN', '5' ], [ '120,000', '43', 'US', '4' ], + [ '120,000', '43', 'JP', '3' ], [ '120,000', '43', 'RU', '3' ], [ '160,000', '44', 'CN', '15' ], + [ '160,000', '44', 'IN', '5' ], [ '160,000', '44', 'IQ', '2' ], [ '160,000', '44', 'JP', '2' ], + [ '160,000', '44', 'NG', '2' ], [ '200,000', '40', 'IN', '7' ], [ '200,000', '40', 'CN', '6' ], + [ '200,000', '40', 'MX', '3' ], [ '200,000', '40', 'BR', '2' ], [ '200,000', '40', 'ID', '2' ], + [ '240,000', '46', 'CN', '6' ], [ '240,000', '46', 'IN', '6' ], [ '240,000', '46', 'US', '6' ], + [ '240,000', '46', 'NG', '3' ], [ '240,000', '46', 'CH', '2' ], [ '280,000', '39', 'CN', '11' ], + [ '280,000', '39', 'IN', '5' ], [ '280,000', '39', 'BR', '2' ], [ '280,000', '39', 'IT', '2' ], + [ '280,000', '39', 'NG', '2' ], [ '320,000', '40', 'CN', '7' ], [ '320,000', '40', 'US', '6' ], + [ '320,000', '40', 'MX', '4' ], [ '320,000', '40', 'BD', '2' ], [ '320,000', '40', 'ID', '2' ], + [ '360,000', '47', 'IN', '8' ], [ '360,000', '47', 'CN', '6' ], [ '360,000', '47', 'US', '4' ], + [ '360,000', '47', 'BD', '3' ], [ '360,000', '47', 'BR', '2' ] ]; + + await inspector.open(); + await inspector.setTablePageSize(50); + await inspector.expectTableData(expectedTableData); + await inspector.close(); + }); + + it('should correctly filter on legend', async () => { + const expectedTableData = [ '0', 'CN', '40,000', 'CN', '80,000', 'CN', '120,000', 'CN', '160,000', 'CN', + '200,000', 'CN', '240,000', 'CN', '280,000', 'CN', '320,000', 'CN', '360,000', 'CN' ]; + await PageObjects.visualize.filterLegend('CN'); + await PageObjects.visualize.waitForVisualization(); + await pieChart.expectPieChartLabels(expectedTableData); + await filterBar.removeFilter('geo.dest'); + await PageObjects.visualize.waitForVisualization(); + }); + it('should still showing pie chart when a subseries have zero data', async function () { await PageObjects.visualize.navigateToNewVisualization(); log.debug('clickPieChart'); diff --git a/test/functional/apps/visualize/_vertical_bar_chart.js b/test/functional/apps/visualize/_vertical_bar_chart.js index 330f99d53340d..0954f4e5e7f88 100644 --- a/test/functional/apps/visualize/_vertical_bar_chart.js +++ b/test/functional/apps/visualize/_vertical_bar_chart.js @@ -23,6 +23,7 @@ export default function ({ getService, getPageObjects }) { const log = getService('log'); const retry = getService('retry'); const inspector = getService('inspector'); + const filterBar = getService('filterBar'); const PageObjects = getPageObjects(['common', 'visualize', 'header']); describe('vertical bar chart', function () { @@ -257,6 +258,16 @@ export default function ({ getService, getPageObjects }) { const legendEntries = await PageObjects.visualize.getLegendEntries(); expect(legendEntries).to.eql(expectedEntries); }); + + it ('should correctly filter by legend', async () => { + await PageObjects.visualize.filterLegend('200'); + await PageObjects.visualize.waitForVisualization(); + const legendEntries = await PageObjects.visualize.getLegendEntries(); + const expectedEntries = ['200']; + expect(legendEntries).to.eql(expectedEntries); + await filterBar.removeFilter('response.raw'); + await PageObjects.visualize.waitForVisualization(); + }); }); describe('vertical bar with multiple splits', function () { From fea974897f57ca3ba710a36e7e260f3288ff0f77 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Thu, 31 Jan 2019 17:44:35 +0100 Subject: [PATCH 3/8] Remove shallow option --- src/ui/public/vis/vis_filters.js | 3 +-- src/ui/public/vis/vis_types/vislib_vis_legend.js | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/ui/public/vis/vis_filters.js b/src/ui/public/vis/vis_filters.js index 743fc07b9bda6..3085788c49c1f 100644 --- a/src/ui/public/vis/vis_filters.js +++ b/src/ui/public/vis/vis_filters.js @@ -83,7 +83,6 @@ const VisFiltersProvider = (Private, getAppState) => { const filter = (event, { simulate } = {}) => { let data = event.datum.aggConfigResult; - const shallow = event.shallow; const filters = []; while (data) { if (data.type === 'bucket') { @@ -99,7 +98,7 @@ const VisFiltersProvider = (Private, getAppState) => { } filters.push(filter); } - data = shallow ? null : data.$parent; + data = data.$parent; } if (!simulate) { const appState = getAppState(); diff --git a/src/ui/public/vis/vis_types/vislib_vis_legend.js b/src/ui/public/vis/vis_types/vislib_vis_legend.js index 9ef9a9cc68472..38c54be06a07f 100644 --- a/src/ui/public/vis/vis_types/vislib_vis_legend.js +++ b/src/ui/public/vis/vis_types/vislib_vis_legend.js @@ -104,13 +104,13 @@ uiModules.get('kibana') $scope.filter = function (legendData, negate) { const value = Array.isArray(legendData.values) ? legendData.values[0] : legendData.values; const datum = { aggConfigResult: value.aggConfigResult.$parent }; - $scope.vis.API.events.filter({ datum, negate: negate, shallow: true }); + $scope.vis.API.events.filter({ datum, negate: negate }); }; $scope.canFilter = function (legendData) { const value = Array.isArray(legendData.values) ? legendData.values[0] : legendData.values; const datum = { aggConfigResult: value.aggConfigResult.$parent }; - const filters = visFilters.filter({ datum, shallow: true }, { simulate: true }); + const filters = visFilters.filter({ datum }, { simulate: true }); return filters.length; }; From b795a68a11813c8f17c8424c2e6e12e61352b7ad Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Fri, 1 Feb 2019 11:21:15 +0100 Subject: [PATCH 4/8] Revert "Remove shallow option" This reverts commit fea974897f57ca3ba710a36e7e260f3288ff0f77. --- src/ui/public/vis/vis_filters.js | 3 ++- src/ui/public/vis/vis_types/vislib_vis_legend.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ui/public/vis/vis_filters.js b/src/ui/public/vis/vis_filters.js index 3085788c49c1f..743fc07b9bda6 100644 --- a/src/ui/public/vis/vis_filters.js +++ b/src/ui/public/vis/vis_filters.js @@ -83,6 +83,7 @@ const VisFiltersProvider = (Private, getAppState) => { const filter = (event, { simulate } = {}) => { let data = event.datum.aggConfigResult; + const shallow = event.shallow; const filters = []; while (data) { if (data.type === 'bucket') { @@ -98,7 +99,7 @@ const VisFiltersProvider = (Private, getAppState) => { } filters.push(filter); } - data = data.$parent; + data = shallow ? null : data.$parent; } if (!simulate) { const appState = getAppState(); diff --git a/src/ui/public/vis/vis_types/vislib_vis_legend.js b/src/ui/public/vis/vis_types/vislib_vis_legend.js index 38c54be06a07f..9ef9a9cc68472 100644 --- a/src/ui/public/vis/vis_types/vislib_vis_legend.js +++ b/src/ui/public/vis/vis_types/vislib_vis_legend.js @@ -104,13 +104,13 @@ uiModules.get('kibana') $scope.filter = function (legendData, negate) { const value = Array.isArray(legendData.values) ? legendData.values[0] : legendData.values; const datum = { aggConfigResult: value.aggConfigResult.$parent }; - $scope.vis.API.events.filter({ datum, negate: negate }); + $scope.vis.API.events.filter({ datum, negate: negate, shallow: true }); }; $scope.canFilter = function (legendData) { const value = Array.isArray(legendData.values) ? legendData.values[0] : legendData.values; const datum = { aggConfigResult: value.aggConfigResult.$parent }; - const filters = visFilters.filter({ datum }, { simulate: true }); + const filters = visFilters.filter({ datum, shallow: true }, { simulate: true }); return filters.length; }; From d1f2c6a97f9fcdad738190dc0a74466ac0dfb21d Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Fri, 1 Feb 2019 11:22:05 +0100 Subject: [PATCH 5/8] Align test with master --- test/functional/apps/visualize/_pie_chart.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/functional/apps/visualize/_pie_chart.js b/test/functional/apps/visualize/_pie_chart.js index 4e8334d45b100..2a64a7f2630ca 100644 --- a/test/functional/apps/visualize/_pie_chart.js +++ b/test/functional/apps/visualize/_pie_chart.js @@ -362,9 +362,14 @@ export default function ({ getService, getPageObjects }) { }); it ('correctly applies filter', async () => { - const expectedTableData = [[ 'win 8', '560', 'CN', '560' ]]; + const expectedTableData = [ + [ 'win 8', '560', 'CN', '560' ], + [ 'win 7', '537', 'CN', '537' ], + [ 'win xp', '526', 'CN', '526' ], + [ 'ios', '478', 'CN', '478' ], + [ 'osx', '228', 'CN', '228' ] + ]; await PageObjects.visualize.filterLegend('CN'); - await PageObjects.visualize.applyFilters(); await PageObjects.header.waitUntilLoadingHasFinished(); await inspector.open(); await inspector.setTablePageSize(50); From 8bc4e84d0488b7d39476c095be4404dd8c665935 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Mon, 11 Feb 2019 05:32:08 -0800 Subject: [PATCH 6/8] make sure legendentries have correct data set --- .../agg_response/hierarchical/build_hierarchical_data.js | 2 +- src/ui/public/agg_response/point_series/_add_to_siri.js | 2 +- src/ui/public/agg_response/point_series/_get_point.js | 3 +++ src/ui/public/vis/vis_types/vislib_vis_legend.js | 8 ++------ src/ui/public/vislib/lib/data.js | 2 +- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/ui/public/agg_response/hierarchical/build_hierarchical_data.js b/src/ui/public/agg_response/hierarchical/build_hierarchical_data.js index 1393bba064a78..be5ad83cd3273 100644 --- a/src/ui/public/agg_response/hierarchical/build_hierarchical_data.js +++ b/src/ui/public/agg_response/hierarchical/build_hierarchical_data.js @@ -46,7 +46,7 @@ export function BuildHierarchicalDataProvider(Private) { let slice = dataLevel.find(slice => slice.name === name); if (!slice) { - slice = { name, size, parent, aggConfig, aggConfigResult: metricColumn, children: [] }; + slice = { name, size, parent, aggConfig, aggConfigResult: bucketColumn, children: [] }; dataLevel.push(slice); } parent = slice; diff --git a/src/ui/public/agg_response/point_series/_add_to_siri.js b/src/ui/public/agg_response/point_series/_add_to_siri.js index ac017a87e669f..7482eda4038c0 100644 --- a/src/ui/public/agg_response/point_series/_add_to_siri.js +++ b/src/ui/public/agg_response/point_series/_add_to_siri.js @@ -29,7 +29,7 @@ export function addToSiri(series, point, id, label, agg) { label: label == null ? id : label, aggLabel: agg.type ? agg.type.makeLabel(agg) : label, aggId: agg.parentId ? agg.parentId : agg.id, - aggConfigResult: agg, + aggConfigResult: point.seriesRow, count: 0, values: [point] }); diff --git a/src/ui/public/agg_response/point_series/_get_point.js b/src/ui/public/agg_response/point_series/_get_point.js index cd46cc7e1217d..c21f4e8506c21 100644 --- a/src/ui/public/agg_response/point_series/_get_point.js +++ b/src/ui/public/agg_response/point_series/_get_point.js @@ -43,14 +43,17 @@ export function getPoint(x, series, yScale, row, y, z) { } if (series) { + const seriesRow = row[series.i]; const seriesArray = series.length ? series : [ series ]; point.aggConfig = seriesArray[0].aggConfig; point.series = seriesArray.map(s => s.aggConfig.fieldFormatter()(unwrap(row[s.i]))).join(' - '); + point.seriesRow = seriesRow; } else if (y) { // If the data is not split up with a series aspect, then // each point's "series" becomes the y-agg that produced it point.aggConfig = y.aggConfig; point.series = y.title; + point.seriesRow = y; } if (yScale) { diff --git a/src/ui/public/vis/vis_types/vislib_vis_legend.js b/src/ui/public/vis/vis_types/vislib_vis_legend.js index 9ef9a9cc68472..2764879140f79 100644 --- a/src/ui/public/vis/vis_types/vislib_vis_legend.js +++ b/src/ui/public/vis/vis_types/vislib_vis_legend.js @@ -102,15 +102,11 @@ uiModules.get('kibana') }; $scope.filter = function (legendData, negate) { - const value = Array.isArray(legendData.values) ? legendData.values[0] : legendData.values; - const datum = { aggConfigResult: value.aggConfigResult.$parent }; - $scope.vis.API.events.filter({ datum, negate: negate, shallow: true }); + $scope.vis.API.events.filter({ datum: legendData, negate: negate, shallow: true }); }; $scope.canFilter = function (legendData) { - const value = Array.isArray(legendData.values) ? legendData.values[0] : legendData.values; - const datum = { aggConfigResult: value.aggConfigResult.$parent }; - const filters = visFilters.filter({ datum, shallow: true }, { simulate: true }); + const filters = visFilters.filter({ datum: legendData, shallow: true }, { simulate: true }); return filters.length; }; diff --git a/src/ui/public/vislib/lib/data.js b/src/ui/public/vislib/lib/data.js index 0f019dd1fcd74..04a67358fe58d 100644 --- a/src/ui/public/vislib/lib/data.js +++ b/src/ui/public/vislib/lib/data.js @@ -304,7 +304,7 @@ export function VislibLibDataProvider(Private) { _.forEach(array, function (obj) { names.push({ label: obj.name, - values: obj, + aggConfigResult: obj.aggConfigResult, index: index }); From 6ec3abce7ac15811cf80faadd44cdd9871ff2fc2 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Mon, 11 Feb 2019 06:52:07 -0800 Subject: [PATCH 7/8] updating unit tests --- .../hierarchical/__tests__/build_hierarchical_data.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/public/agg_response/hierarchical/__tests__/build_hierarchical_data.js b/src/ui/public/agg_response/hierarchical/__tests__/build_hierarchical_data.js index e3086607d23ce..d064443dcd699 100644 --- a/src/ui/public/agg_response/hierarchical/__tests__/build_hierarchical_data.js +++ b/src/ui/public/agg_response/hierarchical/__tests__/build_hierarchical_data.js @@ -175,7 +175,7 @@ describe('buildHierarchicalData', function () { expect(results.rows[0].slices).to.have.property('children'); expect(results.rows[0].slices.children).to.have.length(2); expect(results.rows[0].slices.children[0]).to.have.property('aggConfigResult'); - expect(results.rows[0].slices.children[0].aggConfigResult.$parent.$parent).to.have.property('key', 'png'); + expect(results.rows[0].slices.children[0].aggConfigResult.$parent).to.have.property('key', 'png'); }); }); From b9ec4811b6e843980f982b3ef0b277ebbd67cf29 Mon Sep 17 00:00:00 2001 From: ppisljar Date: Wed, 13 Feb 2019 01:23:37 -0800 Subject: [PATCH 8/8] fixing assignign series info for multiple series splits --- src/ui/public/agg_response/point_series/_get_point.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ui/public/agg_response/point_series/_get_point.js b/src/ui/public/agg_response/point_series/_get_point.js index c21f4e8506c21..f4e8f9bbfc201 100644 --- a/src/ui/public/agg_response/point_series/_get_point.js +++ b/src/ui/public/agg_response/point_series/_get_point.js @@ -43,11 +43,10 @@ export function getPoint(x, series, yScale, row, y, z) { } if (series) { - const seriesRow = row[series.i]; const seriesArray = series.length ? series : [ series ]; point.aggConfig = seriesArray[0].aggConfig; point.series = seriesArray.map(s => s.aggConfig.fieldFormatter()(unwrap(row[s.i]))).join(' - '); - point.seriesRow = seriesRow; + point.seriesRow = row[seriesArray[0].i]; } else if (y) { // If the data is not split up with a series aspect, then // each point's "series" becomes the y-agg that produced it