|  | /* | 
|  | * 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; |