| /* | |
| * 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 * as zrUtil from 'zrender/src/core/util'; | |
| import SeriesData from '../../data/SeriesData'; | |
| import prepareSeriesDataSchema from '../../data/helper/createDimensions'; | |
| import {getDimensionTypeByAxis} from '../../data/helper/dimensionHelper'; | |
| import {getDataItemValue} from '../../util/model'; | |
| import CoordinateSystem from '../../core/CoordinateSystem'; | |
| import {getCoordSysInfoBySeries} from '../../model/referHelper'; | |
| import { createSourceFromSeriesDataOption, Source } from '../../data/Source'; | |
| import {enableDataStack} from '../../data/helper/dataStackHelper'; | |
| import {makeSeriesEncodeForAxisCoordSys} from '../../data/helper/sourceHelper'; | |
| import { | |
| SOURCE_FORMAT_ORIGINAL, | |
| DimensionDefinitionLoose, | |
| DimensionDefinition, | |
| OptionSourceData, | |
| EncodeDefaulter | |
| } from '../../util/types'; | |
| import SeriesModel from '../../model/Series'; | |
| import DataStore from '../../data/DataStore'; | |
| import SeriesDimensionDefine from '../../data/SeriesDimensionDefine'; | |
| function getCoordSysDimDefs( | |
| seriesModel: SeriesModel, | |
| coordSysInfo: ReturnType<typeof getCoordSysInfoBySeries> | |
| ) { | |
| const coordSysName = seriesModel.get('coordinateSystem'); | |
| const registeredCoordSys = CoordinateSystem.get(coordSysName); | |
| let coordSysDimDefs: DimensionDefinitionLoose[]; | |
| if (coordSysInfo && coordSysInfo.coordSysDims) { | |
| coordSysDimDefs = zrUtil.map(coordSysInfo.coordSysDims, function (dim) { | |
| const dimInfo = { | |
| name: dim | |
| } as DimensionDefinition; | |
| const axisModel = coordSysInfo.axisMap.get(dim); | |
| if (axisModel) { | |
| const axisType = axisModel.get('type'); | |
| dimInfo.type = getDimensionTypeByAxis(axisType); | |
| } | |
| return dimInfo; | |
| }); | |
| } | |
| if (!coordSysDimDefs) { | |
| // Get dimensions from registered coordinate system | |
| coordSysDimDefs = (registeredCoordSys && ( | |
| registeredCoordSys.getDimensionsInfo | |
| ? registeredCoordSys.getDimensionsInfo() | |
| : registeredCoordSys.dimensions.slice() | |
| )) || ['x', 'y']; | |
| } | |
| return coordSysDimDefs; | |
| } | |
| function injectOrdinalMeta( | |
| dimInfoList: SeriesDimensionDefine[], | |
| createInvertedIndices: boolean, | |
| coordSysInfo: ReturnType<typeof getCoordSysInfoBySeries> | |
| ) { | |
| let firstCategoryDimIndex: number; | |
| let hasNameEncode: boolean; | |
| coordSysInfo && zrUtil.each(dimInfoList, function (dimInfo, dimIndex) { | |
| const coordDim = dimInfo.coordDim; | |
| const categoryAxisModel = coordSysInfo.categoryAxisMap.get(coordDim); | |
| if (categoryAxisModel) { | |
| if (firstCategoryDimIndex == null) { | |
| firstCategoryDimIndex = dimIndex; | |
| } | |
| dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta(); | |
| if (createInvertedIndices) { | |
| dimInfo.createInvertedIndices = true; | |
| } | |
| } | |
| if (dimInfo.otherDims.itemName != null) { | |
| hasNameEncode = true; | |
| } | |
| }); | |
| if (!hasNameEncode && firstCategoryDimIndex != null) { | |
| dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0; | |
| } | |
| return firstCategoryDimIndex; | |
| } | |
| /** | |
| * Caution: there are side effects to `sourceManager` in this method. | |
| * Should better only be called in `Series['getInitialData']`. | |
| */ | |
| function createSeriesData( | |
| sourceRaw: OptionSourceData | null | undefined, | |
| seriesModel: SeriesModel, | |
| opt?: { | |
| generateCoord?: string | |
| useEncodeDefaulter?: boolean | EncodeDefaulter | |
| // By default: auto. If `true`, create inverted indices for all ordinal dimension on coordSys. | |
| createInvertedIndices?: boolean | |
| } | |
| ): SeriesData { | |
| opt = opt || {}; | |
| const sourceManager = seriesModel.getSourceManager(); | |
| let source; | |
| let isOriginalSource = false; | |
| if (sourceRaw) { | |
| isOriginalSource = true; | |
| source = createSourceFromSeriesDataOption(sourceRaw); | |
| } | |
| else { | |
| source = sourceManager.getSource(); | |
| // Is series.data. not dataset. | |
| isOriginalSource = source.sourceFormat === SOURCE_FORMAT_ORIGINAL; | |
| } | |
| const coordSysInfo = getCoordSysInfoBySeries(seriesModel); | |
| const coordSysDimDefs = getCoordSysDimDefs(seriesModel, coordSysInfo); | |
| const useEncodeDefaulter = opt.useEncodeDefaulter; | |
| const encodeDefaulter = zrUtil.isFunction(useEncodeDefaulter) | |
| ? useEncodeDefaulter | |
| : useEncodeDefaulter | |
| ? zrUtil.curry(makeSeriesEncodeForAxisCoordSys, coordSysDimDefs, seriesModel) | |
| : null; | |
| const createDimensionOptions = { | |
| coordDimensions: coordSysDimDefs, | |
| generateCoord: opt.generateCoord, | |
| encodeDefine: seriesModel.getEncode(), | |
| encodeDefaulter: encodeDefaulter, | |
| canOmitUnusedDimensions: !isOriginalSource | |
| }; | |
| const schema = prepareSeriesDataSchema(source, createDimensionOptions); | |
| const firstCategoryDimIndex = injectOrdinalMeta( | |
| schema.dimensions, opt.createInvertedIndices, coordSysInfo | |
| ); | |
| const store = !isOriginalSource ? sourceManager.getSharedDataStore(schema) : null; | |
| const stackCalculationInfo = enableDataStack(seriesModel, { schema, store }); | |
| const data = new SeriesData(schema, seriesModel); | |
| data.setCalculationInfo(stackCalculationInfo); | |
| const dimValueGetter = | |
| firstCategoryDimIndex != null | |
| && isNeedCompleteOrdinalData(source) | |
| ? function (this: DataStore, itemOpt: any, dimName: string, dataIndex: number, dimIndex: number) { | |
| // Use dataIndex as ordinal value in categoryAxis | |
| return dimIndex === firstCategoryDimIndex | |
| ? dataIndex | |
| : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex); | |
| } | |
| : null; | |
| data.hasItemOption = false; | |
| data.initData( | |
| // Try to reuse the data store in sourceManager if using dataset. | |
| isOriginalSource ? source : store, | |
| null, | |
| dimValueGetter | |
| ); | |
| return data; | |
| } | |
| function isNeedCompleteOrdinalData(source: Source) { | |
| if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) { | |
| const sampleItem = firstDataNotNull(source.data as ArrayLike<any> || []); | |
| return !zrUtil.isArray(getDataItemValue(sampleItem)); | |
| } | |
| } | |
| function firstDataNotNull(arr: ArrayLike<any>) { | |
| let i = 0; | |
| while (i < arr.length && arr[i] == null) { | |
| i++; | |
| } | |
| return arr[i]; | |
| } | |
| export default createSeriesData; |