| |
| /* |
| * 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. |
| */ |
| |
| |
| /** |
| * AUTO-GENERATED FILE. DO NOT MODIFY. |
| */ |
| |
| /* |
| * 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. |
| */ |
| import { each, isString } from 'zrender/lib/core/util.js'; |
| import { isSeriesDataSchema } from './SeriesDataSchema.js'; |
| /** |
| * 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 seriesModel |
| * @param dimensionsInput The same as the input of <module:echarts/data/SeriesData>. |
| * The input will be modified. |
| * @param opt |
| * @param opt.stackedCoordDimension Specify a coord dimension if needed. |
| * @param opt.byIndex=false |
| * @return calculationInfo |
| * { |
| * stackedDimension: string |
| * stackedByDimension: string |
| * isStackedByIndex: boolean |
| * stackedOverDimension: string |
| * stackResultDimension: string |
| * } |
| */ |
| export function enableDataStack(seriesModel, dimensionsInput, opt) { |
| opt = opt || {}; |
| var byIndex = opt.byIndex; |
| var stackedCoordDimension = opt.stackedCoordDimension; |
| var dimensionDefineList; |
| var schema; |
| var store; |
| if (isLegacyDimensionsInput(dimensionsInput)) { |
| dimensionDefineList = dimensionsInput; |
| } else { |
| schema = dimensionsInput.schema; |
| dimensionDefineList = schema.dimensions; |
| store = dimensionsInput.store; |
| } |
| // Compatibal: when `stack` is set as '', do not stack. |
| var mayStack = !!(seriesModel && seriesModel.get('stack')); |
| var stackedByDimInfo; |
| var stackedDimInfo; |
| var stackResultDimension; |
| var stackedOverDimension; |
| each(dimensionDefineList, function (dimensionInfo, index) { |
| if (isString(dimensionInfo)) { |
| dimensionDefineList[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. |
| // Also need to use seriesModel.id as postfix because different |
| // series may share same data store. The stack dimension needs to be distinguished. |
| stackResultDimension = '__\0ecstackresult_' + seriesModel.id; |
| stackedOverDimension = '__\0ecstackedover_' + seriesModel.id; |
| // Create inverted index to fast query index by value. |
| if (stackedByDimInfo) { |
| stackedByDimInfo.createInvertedIndices = true; |
| } |
| var stackedDimCoordDim_1 = stackedDimInfo.coordDim; |
| var stackedDimType = stackedDimInfo.type; |
| var stackedDimCoordIndex_1 = 0; |
| each(dimensionDefineList, function (dimensionInfo) { |
| if (dimensionInfo.coordDim === stackedDimCoordDim_1) { |
| stackedDimCoordIndex_1++; |
| } |
| }); |
| var stackedOverDimensionDefine = { |
| name: stackResultDimension, |
| coordDim: stackedDimCoordDim_1, |
| coordDimIndex: stackedDimCoordIndex_1, |
| type: stackedDimType, |
| isExtraCoord: true, |
| isCalculationCoord: true, |
| storeDimIndex: dimensionDefineList.length |
| }; |
| var stackResultDimensionDefine = { |
| 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_1 + 1, |
| type: stackedDimType, |
| isExtraCoord: true, |
| isCalculationCoord: true, |
| storeDimIndex: dimensionDefineList.length + 1 |
| }; |
| if (schema) { |
| if (store) { |
| stackedOverDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackedOverDimension, stackedDimType); |
| stackResultDimensionDefine.storeDimIndex = store.ensureCalculationDimension(stackResultDimension, stackedDimType); |
| } |
| schema.appendCalculationDimension(stackedOverDimensionDefine); |
| schema.appendCalculationDimension(stackResultDimensionDefine); |
| } else { |
| dimensionDefineList.push(stackedOverDimensionDefine); |
| dimensionDefineList.push(stackResultDimensionDefine); |
| } |
| } |
| return { |
| stackedDimension: stackedDimInfo && stackedDimInfo.name, |
| stackedByDimension: stackedByDimInfo && stackedByDimInfo.name, |
| isStackedByIndex: byIndex, |
| stackedOverDimension: stackedOverDimension, |
| stackResultDimension: stackResultDimension |
| }; |
| } |
| function isLegacyDimensionsInput(dimensionsInput) { |
| return !isSeriesDataSchema(dimensionsInput.schema); |
| } |
| export function isDimensionStacked(data, stackedDim) { |
| // 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'); |
| } |
| export function getStackedDimension(data, targetDim) { |
| return isDimensionStacked(data, targetDim) ? data.getCalculationInfo('stackResultDimension') : targetDim; |
| } |