You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					182 lines
				
				6.5 KiB
			
		
		
			
		
	
	
					182 lines
				
				6.5 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								* Licensed to the Apache Software Foundation (ASF) under one
							 | 
						||
| 
								 | 
							
								* or more contributor license agreements.  See the NOTICE file
							 | 
						||
| 
								 | 
							
								* distributed with this work for additional information
							 | 
						||
| 
								 | 
							
								* regarding copyright ownership.  The ASF 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.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _util = require("zrender/lib/core/util");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var each = _util.each;
							 | 
						||
| 
								 | 
							
								var isString = _util.isString;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								* Licensed to the Apache Software Foundation (ASF) under one
							 | 
						||
| 
								 | 
							
								* or more contributor license agreements.  See the NOTICE file
							 | 
						||
| 
								 | 
							
								* distributed with this work for additional information
							 | 
						||
| 
								 | 
							
								* regarding copyright ownership.  The ASF 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.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Note that it is too complicated to support 3d stack by value
							 | 
						||
| 
								 | 
							
								 * (have to create two-dimension inverted index), so in 3d case
							 | 
						||
| 
								 | 
							
								 * we just support that stacked by index.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param {module:echarts/model/Series} seriesModel
							 | 
						||
| 
								 | 
							
								 * @param {Array.<string|Object>} dimensionInfoList The same as the input of <module:echarts/data/List>.
							 | 
						||
| 
								 | 
							
								 *        The input dimensionInfoList will be modified.
							 | 
						||
| 
								 | 
							
								 * @param {Object} [opt]
							 | 
						||
| 
								 | 
							
								 * @param {boolean} [opt.stackedCoordDimension=''] Specify a coord dimension if needed.
							 | 
						||
| 
								 | 
							
								 * @param {boolean} [opt.byIndex=false]
							 | 
						||
| 
								 | 
							
								 * @return {Object} calculationInfo
							 | 
						||
| 
								 | 
							
								 * {
							 | 
						||
| 
								 | 
							
								 *     stackedDimension: string
							 | 
						||
| 
								 | 
							
								 *     stackedByDimension: string
							 | 
						||
| 
								 | 
							
								 *     isStackedByIndex: boolean
							 | 
						||
| 
								 | 
							
								 *     stackedOverDimension: string
							 | 
						||
| 
								 | 
							
								 *     stackResultDimension: string
							 | 
						||
| 
								 | 
							
								 * }
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function enableDataStack(seriesModel, dimensionInfoList, opt) {
							 | 
						||
| 
								 | 
							
								  opt = opt || {};
							 | 
						||
| 
								 | 
							
								  var byIndex = opt.byIndex;
							 | 
						||
| 
								 | 
							
								  var stackedCoordDimension = opt.stackedCoordDimension; // Compatibal: when `stack` is set as '', do not stack.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var mayStack = !!(seriesModel && seriesModel.get('stack'));
							 | 
						||
| 
								 | 
							
								  var stackedByDimInfo;
							 | 
						||
| 
								 | 
							
								  var stackedDimInfo;
							 | 
						||
| 
								 | 
							
								  var stackResultDimension;
							 | 
						||
| 
								 | 
							
								  var stackedOverDimension;
							 | 
						||
| 
								 | 
							
								  each(dimensionInfoList, function (dimensionInfo, index) {
							 | 
						||
| 
								 | 
							
								    if (isString(dimensionInfo)) {
							 | 
						||
| 
								 | 
							
								      dimensionInfoList[index] = dimensionInfo = {
							 | 
						||
| 
								 | 
							
								        name: dimensionInfo
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (mayStack && !dimensionInfo.isExtraCoord) {
							 | 
						||
| 
								 | 
							
								      // Find the first ordinal dimension as the stackedByDimInfo.
							 | 
						||
| 
								 | 
							
								      if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) {
							 | 
						||
| 
								 | 
							
								        stackedByDimInfo = dimensionInfo;
							 | 
						||
| 
								 | 
							
								      } // Find the first stackable dimension as the stackedDimInfo.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (!stackedDimInfo && dimensionInfo.type !== 'ordinal' && dimensionInfo.type !== 'time' && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim)) {
							 | 
						||
| 
								 | 
							
								        stackedDimInfo = dimensionInfo;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (stackedDimInfo && !byIndex && !stackedByDimInfo) {
							 | 
						||
| 
								 | 
							
								    // Compatible with previous design, value axis (time axis) only stack by index.
							 | 
						||
| 
								 | 
							
								    // It may make sense if the user provides elaborately constructed data.
							 | 
						||
| 
								 | 
							
								    byIndex = true;
							 | 
						||
| 
								 | 
							
								  } // Add stack dimension, they can be both calculated by coordinate system in `unionExtent`.
							 | 
						||
| 
								 | 
							
								  // That put stack logic in List is for using conveniently in echarts extensions, but it
							 | 
						||
| 
								 | 
							
								  // might not be a good way.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (stackedDimInfo) {
							 | 
						||
| 
								 | 
							
								    // Use a weird name that not duplicated with other names.
							 | 
						||
| 
								 | 
							
								    stackResultDimension = '__\0ecstackresult';
							 | 
						||
| 
								 | 
							
								    stackedOverDimension = '__\0ecstackedover'; // Create inverted index to fast query index by value.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (stackedByDimInfo) {
							 | 
						||
| 
								 | 
							
								      stackedByDimInfo.createInvertedIndices = true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var stackedDimCoordDim = stackedDimInfo.coordDim;
							 | 
						||
| 
								 | 
							
								    var stackedDimType = stackedDimInfo.type;
							 | 
						||
| 
								 | 
							
								    var stackedDimCoordIndex = 0;
							 | 
						||
| 
								 | 
							
								    each(dimensionInfoList, function (dimensionInfo) {
							 | 
						||
| 
								 | 
							
								      if (dimensionInfo.coordDim === stackedDimCoordDim) {
							 | 
						||
| 
								 | 
							
								        stackedDimCoordIndex++;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    dimensionInfoList.push({
							 | 
						||
| 
								 | 
							
								      name: stackResultDimension,
							 | 
						||
| 
								 | 
							
								      coordDim: stackedDimCoordDim,
							 | 
						||
| 
								 | 
							
								      coordDimIndex: stackedDimCoordIndex,
							 | 
						||
| 
								 | 
							
								      type: stackedDimType,
							 | 
						||
| 
								 | 
							
								      isExtraCoord: true,
							 | 
						||
| 
								 | 
							
								      isCalculationCoord: true
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    stackedDimCoordIndex++;
							 | 
						||
| 
								 | 
							
								    dimensionInfoList.push({
							 | 
						||
| 
								 | 
							
								      name: stackedOverDimension,
							 | 
						||
| 
								 | 
							
								      // This dimension contains stack base (generally, 0), so do not set it as
							 | 
						||
| 
								 | 
							
								      // `stackedDimCoordDim` to avoid extent calculation, consider log scale.
							 | 
						||
| 
								 | 
							
								      coordDim: stackedOverDimension,
							 | 
						||
| 
								 | 
							
								      coordDimIndex: stackedDimCoordIndex,
							 | 
						||
| 
								 | 
							
								      type: stackedDimType,
							 | 
						||
| 
								 | 
							
								      isExtraCoord: true,
							 | 
						||
| 
								 | 
							
								      isCalculationCoord: true
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return {
							 | 
						||
| 
								 | 
							
								    stackedDimension: stackedDimInfo && stackedDimInfo.name,
							 | 
						||
| 
								 | 
							
								    stackedByDimension: stackedByDimInfo && stackedByDimInfo.name,
							 | 
						||
| 
								 | 
							
								    isStackedByIndex: byIndex,
							 | 
						||
| 
								 | 
							
								    stackedOverDimension: stackedOverDimension,
							 | 
						||
| 
								 | 
							
								    stackResultDimension: stackResultDimension
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @param {module:echarts/data/List} data
							 | 
						||
| 
								 | 
							
								 * @param {string} stackedDim
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function isDimensionStacked(data, stackedDim
							 | 
						||
| 
								 | 
							
								/*, stackedByDim*/
							 | 
						||
| 
								 | 
							
								) {
							 | 
						||
| 
								 | 
							
								  // Each single series only maps to one pair of axis. So we do not need to
							 | 
						||
| 
								 | 
							
								  // check stackByDim, whatever stacked by a dimension or stacked by index.
							 | 
						||
| 
								 | 
							
								  return !!stackedDim && stackedDim === data.getCalculationInfo('stackedDimension'); // && (
							 | 
						||
| 
								 | 
							
								  //     stackedByDim != null
							 | 
						||
| 
								 | 
							
								  //         ? stackedByDim === data.getCalculationInfo('stackedByDimension')
							 | 
						||
| 
								 | 
							
								  //         : data.getCalculationInfo('isStackedByIndex')
							 | 
						||
| 
								 | 
							
								  // );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @param {module:echarts/data/List} data
							 | 
						||
| 
								 | 
							
								 * @param {string} targetDim
							 | 
						||
| 
								 | 
							
								 * @param {string} [stackedByDim] If not input this parameter, check whether
							 | 
						||
| 
								 | 
							
								 *                                stacked by index.
							 | 
						||
| 
								 | 
							
								 * @return {string} dimension
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function getStackedDimension(data, targetDim) {
							 | 
						||
| 
								 | 
							
								  return isDimensionStacked(data, targetDim) ? data.getCalculationInfo('stackResultDimension') : targetDim;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								exports.enableDataStack = enableDataStack;
							 | 
						||
| 
								 | 
							
								exports.isDimensionStacked = isDimensionStacked;
							 | 
						||
| 
								 | 
							
								exports.getStackedDimension = getStackedDimension;
							 |