(
// TODO: TYPE completeDimensions type
source: Source | OptionSourceData,
opt?: PrepareSeriesDataSchemaParams
)
| 98 | * @return The results are always sorted by `storeDimIndex` asc. |
| 99 | */ |
| 100 | export default function prepareSeriesDataSchema( |
| 101 | // TODO: TYPE completeDimensions type |
| 102 | source: Source | OptionSourceData, |
| 103 | opt?: PrepareSeriesDataSchemaParams |
| 104 | ): SeriesDataSchema { |
| 105 | if (!isSourceInstance(source)) { |
| 106 | source = createSourceFromSeriesDataOption(source as OptionSourceData); |
| 107 | } |
| 108 | |
| 109 | opt = opt || {}; |
| 110 | |
| 111 | const sysDims = opt.coordDimensions || []; |
| 112 | const dimsDef = opt.dimensionsDefine || source.dimensionsDefine || []; |
| 113 | const coordDimNameMap = createHashMap<true, DimensionName>(); |
| 114 | const resultList: SeriesDimensionDefine[] = []; |
| 115 | const dimCount = getDimCount(source, sysDims, dimsDef, opt.dimensionsCount); |
| 116 | |
| 117 | // Try to ignore unused dimensions if sharing a high dimension datastore |
| 118 | // 30 is an experience value. |
| 119 | const omitUnusedDimensions = opt.canOmitUnusedDimensions && shouldOmitUnusedDimensions(dimCount); |
| 120 | |
| 121 | const isUsingSourceDimensionsDef = dimsDef === source.dimensionsDefine; |
| 122 | const dataDimNameMap = isUsingSourceDimensionsDef |
| 123 | ? ensureSourceDimNameMap(source) : createDimNameMap(dimsDef); |
| 124 | |
| 125 | let encodeDef = opt.encodeDefine; |
| 126 | if (!encodeDef && opt.encodeDefaulter) { |
| 127 | encodeDef = opt.encodeDefaulter(source, dimCount); |
| 128 | } |
| 129 | const encodeDefMap = createHashMap<DimensionIndex[] | false, DimensionName>(encodeDef as any); |
| 130 | |
| 131 | const indicesMap = new CtorInt32Array(dimCount); |
| 132 | for (let i = 0; i < indicesMap.length; i++) { |
| 133 | indicesMap[i] = -1; |
| 134 | } |
| 135 | |
| 136 | function getResultItem(dimIdx: number) { |
| 137 | const idx = indicesMap[dimIdx]; |
| 138 | if (idx < 0) { |
| 139 | const dimDefItemRaw = dimsDef[dimIdx]; |
| 140 | const dimDefItem = isObject(dimDefItemRaw) ? dimDefItemRaw : { name: dimDefItemRaw }; |
| 141 | const resultItem = new SeriesDimensionDefine(); |
| 142 | const userDimName = dimDefItem.name; |
| 143 | if (userDimName != null && dataDimNameMap.get(userDimName) != null) { |
| 144 | // Only if `series.dimensions` is defined in option |
| 145 | // displayName, will be set, and dimension will be displayed vertically in |
| 146 | // tooltip by default. |
| 147 | resultItem.name = resultItem.displayName = userDimName; |
| 148 | } |
| 149 | dimDefItem.type != null && (resultItem.type = dimDefItem.type); |
| 150 | dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName); |
| 151 | const newIdx = resultList.length; |
| 152 | indicesMap[dimIdx] = newIdx; |
| 153 | resultItem.storeDimIndex = dimIdx; |
| 154 | resultList.push(resultItem); |
| 155 | return resultItem; |
| 156 | } |
| 157 | return resultList[idx]; |
no test coverage detected
searching dependent graphs…