| 
/* 
 | 
* 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 { createHashMap, isObject, retrieve2 } from 'zrender/lib/core/util.js'; 
 | 
import { makeInner } from '../../util/model.js'; 
 | 
import { shouldRetrieveDataByName } from '../Source.js'; 
 | 
var inner = makeInner(); 
 | 
var dimTypeShort = { 
 | 
  float: 'f', 
 | 
  int: 'i', 
 | 
  ordinal: 'o', 
 | 
  number: 'n', 
 | 
  time: 't' 
 | 
}; 
 | 
/** 
 | 
 * Represents the dimension requirement of a series. 
 | 
 * 
 | 
 * NOTICE: 
 | 
 * When there are too many dimensions in dataset and many series, only the used dimensions 
 | 
 * (i.e., used by coord sys and declared in `series.encode`) are add to `dimensionDefineList`. 
 | 
 * But users may query data by other unused dimension names. 
 | 
 * In this case, users can only query data if and only if they have defined dimension names 
 | 
 * via ec option, so we provide `getDimensionIndexFromSource`, which only query them from 
 | 
 * `source` dimensions. 
 | 
 */ 
 | 
var SeriesDataSchema = /** @class */function () { 
 | 
  function SeriesDataSchema(opt) { 
 | 
    this.dimensions = opt.dimensions; 
 | 
    this._dimOmitted = opt.dimensionOmitted; 
 | 
    this.source = opt.source; 
 | 
    this._fullDimCount = opt.fullDimensionCount; 
 | 
    this._updateDimOmitted(opt.dimensionOmitted); 
 | 
  } 
 | 
  SeriesDataSchema.prototype.isDimensionOmitted = function () { 
 | 
    return this._dimOmitted; 
 | 
  }; 
 | 
  SeriesDataSchema.prototype._updateDimOmitted = function (dimensionOmitted) { 
 | 
    this._dimOmitted = dimensionOmitted; 
 | 
    if (!dimensionOmitted) { 
 | 
      return; 
 | 
    } 
 | 
    if (!this._dimNameMap) { 
 | 
      this._dimNameMap = ensureSourceDimNameMap(this.source); 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * @caution Can only be used when `dimensionOmitted: true`. 
 | 
   * 
 | 
   * Get index by user defined dimension name (i.e., not internal generate name). 
 | 
   * That is, get index from `dimensionsDefine`. 
 | 
   * If no `dimensionsDefine`, or no name get, return -1. 
 | 
   */ 
 | 
  SeriesDataSchema.prototype.getSourceDimensionIndex = function (dimName) { 
 | 
    return retrieve2(this._dimNameMap.get(dimName), -1); 
 | 
  }; 
 | 
  /** 
 | 
   * @caution Can only be used when `dimensionOmitted: true`. 
 | 
   * 
 | 
   * Notice: may return `null`/`undefined` if user not specify dimension names. 
 | 
   */ 
 | 
  SeriesDataSchema.prototype.getSourceDimension = function (dimIndex) { 
 | 
    var dimensionsDefine = this.source.dimensionsDefine; 
 | 
    if (dimensionsDefine) { 
 | 
      return dimensionsDefine[dimIndex]; 
 | 
    } 
 | 
  }; 
 | 
  SeriesDataSchema.prototype.makeStoreSchema = function () { 
 | 
    var dimCount = this._fullDimCount; 
 | 
    var willRetrieveDataByName = shouldRetrieveDataByName(this.source); 
 | 
    var makeHashStrict = !shouldOmitUnusedDimensions(dimCount); 
 | 
    // If source don't have dimensions or series don't omit unsed dimensions. 
 | 
    // Generate from seriesDimList directly 
 | 
    var dimHash = ''; 
 | 
    var dims = []; 
 | 
    for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < dimCount; fullDimIdx++) { 
 | 
      var property = void 0; 
 | 
      var type = void 0; 
 | 
      var ordinalMeta = void 0; 
 | 
      var seriesDimDef = this.dimensions[seriesDimIdx]; 
 | 
      // The list has been sorted by `storeDimIndex` asc. 
 | 
      if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { 
 | 
        property = willRetrieveDataByName ? seriesDimDef.name : null; 
 | 
        type = seriesDimDef.type; 
 | 
        ordinalMeta = seriesDimDef.ordinalMeta; 
 | 
        seriesDimIdx++; 
 | 
      } else { 
 | 
        var sourceDimDef = this.getSourceDimension(fullDimIdx); 
 | 
        if (sourceDimDef) { 
 | 
          property = willRetrieveDataByName ? sourceDimDef.name : null; 
 | 
          type = sourceDimDef.type; 
 | 
        } 
 | 
      } 
 | 
      dims.push({ 
 | 
        property: property, 
 | 
        type: type, 
 | 
        ordinalMeta: ordinalMeta 
 | 
      }); 
 | 
      // If retrieving data by index, 
 | 
      //   use <index, type, ordinalMeta> to determine whether data can be shared. 
 | 
      //   (Because in this case there might be no dimension name defined in dataset, but indices always exists). 
 | 
      //   (Indices are always 0, 1, 2, ..., so we can ignore them to shorten the hash). 
 | 
      // Otherwise if retrieving data by property name (like `data: [{aa: 123, bb: 765}, ...]`), 
 | 
      //   use <property, type, ordinalMeta> in hash. 
 | 
      if (willRetrieveDataByName && property != null 
 | 
      // For data stack, we have make sure each series has its own dim on this store. 
 | 
      // So we do not add property to hash to make sure they can share this store. 
 | 
      && (!seriesDimDef || !seriesDimDef.isCalculationCoord)) { 
 | 
        dimHash += makeHashStrict 
 | 
        // Use escape character '`' in case that property name contains '$'. 
 | 
        ? property.replace(/\`/g, '`1').replace(/\$/g, '`2') 
 | 
        // For better performance, when there are large dimensions, tolerant this defects that hardly meet. 
 | 
        : property; 
 | 
      } 
 | 
      dimHash += '$'; 
 | 
      dimHash += dimTypeShort[type] || 'f'; 
 | 
      if (ordinalMeta) { 
 | 
        dimHash += ordinalMeta.uid; 
 | 
      } 
 | 
      dimHash += '$'; 
 | 
    } 
 | 
    // Source from endpoint(usually series) will be read differently 
 | 
    // when seriesLayoutBy or startIndex(which is affected by sourceHeader) are different. 
 | 
    // So we use this three props as key. 
 | 
    var source = this.source; 
 | 
    var hash = [source.seriesLayoutBy, source.startIndex, dimHash].join('$$'); 
 | 
    return { 
 | 
      dimensions: dims, 
 | 
      hash: hash 
 | 
    }; 
 | 
  }; 
 | 
  SeriesDataSchema.prototype.makeOutputDimensionNames = function () { 
 | 
    var result = []; 
 | 
    for (var fullDimIdx = 0, seriesDimIdx = 0; fullDimIdx < this._fullDimCount; fullDimIdx++) { 
 | 
      var name_1 = void 0; 
 | 
      var seriesDimDef = this.dimensions[seriesDimIdx]; 
 | 
      // The list has been sorted by `storeDimIndex` asc. 
 | 
      if (seriesDimDef && seriesDimDef.storeDimIndex === fullDimIdx) { 
 | 
        if (!seriesDimDef.isCalculationCoord) { 
 | 
          name_1 = seriesDimDef.name; 
 | 
        } 
 | 
        seriesDimIdx++; 
 | 
      } else { 
 | 
        var sourceDimDef = this.getSourceDimension(fullDimIdx); 
 | 
        if (sourceDimDef) { 
 | 
          name_1 = sourceDimDef.name; 
 | 
        } 
 | 
      } 
 | 
      result.push(name_1); 
 | 
    } 
 | 
    return result; 
 | 
  }; 
 | 
  SeriesDataSchema.prototype.appendCalculationDimension = function (dimDef) { 
 | 
    this.dimensions.push(dimDef); 
 | 
    dimDef.isCalculationCoord = true; 
 | 
    this._fullDimCount++; 
 | 
    // If append dimension on a data store, consider the store 
 | 
    // might be shared by different series, series dimensions not 
 | 
    // really map to store dimensions. 
 | 
    this._updateDimOmitted(true); 
 | 
  }; 
 | 
  return SeriesDataSchema; 
 | 
}(); 
 | 
export { SeriesDataSchema }; 
 | 
export function isSeriesDataSchema(schema) { 
 | 
  return schema instanceof SeriesDataSchema; 
 | 
} 
 | 
export function createDimNameMap(dimsDef) { 
 | 
  var dataDimNameMap = createHashMap(); 
 | 
  for (var i = 0; i < (dimsDef || []).length; i++) { 
 | 
    var dimDefItemRaw = dimsDef[i]; 
 | 
    var userDimName = isObject(dimDefItemRaw) ? dimDefItemRaw.name : dimDefItemRaw; 
 | 
    if (userDimName != null && dataDimNameMap.get(userDimName) == null) { 
 | 
      dataDimNameMap.set(userDimName, i); 
 | 
    } 
 | 
  } 
 | 
  return dataDimNameMap; 
 | 
} 
 | 
export function ensureSourceDimNameMap(source) { 
 | 
  var innerSource = inner(source); 
 | 
  return innerSource.dimNameMap || (innerSource.dimNameMap = createDimNameMap(source.dimensionsDefine)); 
 | 
} 
 | 
export function shouldOmitUnusedDimensions(dimCount) { 
 | 
  return dimCount > 30; 
 | 
} 
 |