From 600d74ccdf9e6609aab811ac5efe96cebb1c692d Mon Sep 17 00:00:00 2001 From: sushuang Date: Fri, 12 Jan 2018 14:08:40 +0800 Subject: [PATCH] Fix map and data zoom in empty mode. --- src/component/dataZoom/AxisProxy.js | 25 ++++- src/data/List.js | 39 ++++--- test/dataset-charts.html | 32 +++--- test/dataset-pivot.html | 151 ++++++++++++++++++++++++++++ 4 files changed, 217 insertions(+), 30 deletions(-) create mode 100644 test/dataset-pivot.html diff --git a/src/component/dataZoom/AxisProxy.js b/src/component/dataZoom/AxisProxy.js index f2ba20176..1cefeccbf 100644 --- a/src/component/dataZoom/AxisProxy.js +++ b/src/component/dataZoom/AxisProxy.js @@ -63,6 +63,12 @@ var AxisProxy = function (dimName, axisIndex, dataZoomModel, ecModel) { * @type {module: echarts/component/dataZoom/DataZoomModel} */ this._dataZoomModel = dataZoomModel; + + /** + * @readOnly + * @private + */ + this.hasSeriesStacked; }; AxisProxy.prototype = { @@ -238,10 +244,18 @@ AxisProxy.prototype = { return; } + var targetSeries = this.getTargetSeriesModels(); // Culculate data window and data extent, and record them. - this._dataExtent = calculateDataExtent( - this, this._dimName, this.getTargetSeriesModels() - ); + this._dataExtent = calculateDataExtent(this, this._dimName, targetSeries); + + this.hasSeriesStacked = false; + each(targetSeries, function (series) { + var data = series.getData(); + var dataDim = data.mapDimension(this._dimName); + if (data.isStacked(dataDim)) { + this.hasSeriesStacked = true; + } + }, this); var dataWindow = this.calculateDataWindow(dataZoomModel.option); @@ -294,11 +308,14 @@ AxisProxy.prototype = { var otherAxisModel = this.getOtherAxisModel(); if (dataZoomModel.get('$fromToolbox') && otherAxisModel - && otherAxisModel.get('type') === 'category' + && otherAxisModel.hasSeriesStacked ) { filterMode = 'empty'; } + // TODO + // filterMode 'weakFilter' and 'empty' is not optimized for huge data yet. + // Process series data each(seriesModels, function (seriesModel) { var seriesData = seriesModel.getData(); diff --git a/src/data/List.js b/src/data/List.js index c88e5b524..c91ef1b1d 100644 --- a/src/data/List.js +++ b/src/data/List.js @@ -664,7 +664,7 @@ listProto.getDataExtent = function (dim, stack) { var dimData = this._storage[dim]; var initialExtent = [Infinity, -Infinity]; - stack = (stack || false) && isStacked(this, dim); + stack = (stack || false) && this.isStacked(dim); if (!dimData) { return initialExtent; @@ -721,10 +721,10 @@ listProto.setApproximateExtent = function (extent, dim, stack) { this._approximateExtent[dim] = extent.slice(); }; -function isStacked(list, concreteDim) { - var dimensionInfo = list._dimensionInfos[concreteDim]; - return dimensionInfo && dimensionInfo.stackable && list.stackedOn; -} +listProto.isStacked = function (concreteDim) { + var dimensionInfo = this._dimensionInfos[concreteDim]; + return dimensionInfo && dimensionInfo.stackable && this.stackedOn; +}; /** * Get sum of data in one dimension @@ -1157,7 +1157,7 @@ listProto.selectRange = function (range, stack) { } if (!quickFinished) { if (dimSize === 1) { - stack = stack || isStacked(this, dim0); + stack = stack || this.isStacked(dim0); for (var i = 0; i < originalCount; i++) { var rawIndex = this.getRawIndex(i); var val = stack ? this.get(dim0, i, true) : this._getFast(dim0, rawIndex); @@ -1283,17 +1283,28 @@ listProto.map = function (dimensions, cb, stack, context) { var tmpRetValue = []; var chunkSize = this._chunkSize; - this.each(dimensions, function () { - var idx = arguments[arguments.length - 1]; - var retValue = cb && cb.apply(this, arguments); + var dimSize = dimensions.length; + var dataCount = this.count(); + var values = []; + + for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) { + for (var dimIndex = 0; dimIndex < dimSize; dimIndex++) { + values[dimIndex] = this.get(dimensions[dimIndex], dataIndex, stack); + } + values[dimSize] = dataIndex; + + var retValue = cb && cb.apply(context, values); if (retValue != null) { - // a number - if (typeof retValue === 'number') { + // a number or string (in oridinal dimension)? + if (typeof retValue !== 'object') { tmpRetValue[0] = retValue; retValue = tmpRetValue; } - var chunkIndex = Math.floor(idx / chunkSize); - var chunkOffset = idx % chunkSize; + + var rawIndex = this.getRawIndex(dataIndex); + var chunkIndex = Math.floor(rawIndex / chunkSize); + var chunkOffset = rawIndex % chunkSize; + for (var i = 0; i < retValue.length; i++) { var dim = dimensions[i]; var dimStore = storage[dim]; @@ -1302,7 +1313,7 @@ listProto.map = function (dimensions, cb, stack, context) { } } } - }, stack, context); + } return list; }; diff --git a/test/dataset-charts.html b/test/dataset-charts.html index d048f95b9..19e82abba 100644 --- a/test/dataset-charts.html +++ b/test/dataset-charts.html @@ -22,11 +22,11 @@ - +
@@ -67,6 +67,14 @@ [55.2, 67.1, 69.2, 72.4, 53.9, 39.1] ]; + var arrayRowsPairValueColumns = [ + ['2012', null, '2013', null, '2014', 'amount'], + [41.1, 2585, 30.4, 2473, 65.1, 3418], + [86.5, 2316, 92.1, 3255, 85.7, 2485], + [24.1, 1532, 67.2, 1452, 79.5, 4689], + [55.2, 5312, 67.1, 3266, 69.2, 1354] + ]; + // No 北京 上海 江苏 var nameValueGeo0 = [ {name: '天津', value: 514}, @@ -354,26 +362,26 @@ var option = { legend: {}, tooltip: {}, + xAxis: {}, + yAxis: {}, dataset: [{ - source: arrayRowsNoColumnHeader - }, { - source: arrayRowsNoRowHeader + source: arrayRowsPairValueColumns }], series: [{ - type: 'scatter', - radius: 50, - center: ['25%', '25%'], - sourceHeader: false + type: 'scatter' + }, { + type: 'scatter' + }, { + type: 'scatter' }] }; testHelper.create(echarts, 'layout5', { - title: 'no sourceHeader', + title: 'column (dimension name duplicated)', height: 400, option: option, dataTables: [ - arrayRowsNoColumnHeader, - arrayRowsNoRowHeader + arrayRowsPairValueColumns ], info: { legend: '', diff --git a/test/dataset-pivot.html b/test/dataset-pivot.html new file mode 100644 index 000000000..f8d33a25f --- /dev/null +++ b/test/dataset-pivot.html @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- GitLab