| 
/* 
 | 
* 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 { SERIES_LAYOUT_BY_COLUMN, SOURCE_FORMAT_OBJECT_ROWS, SOURCE_FORMAT_ARRAY_ROWS } from '../../util/types.js'; 
 | 
import { normalizeToArray } from '../../util/model.js'; 
 | 
import { createHashMap, bind, each, hasOwn, map, clone, isObject, extend, isNumber } from 'zrender/lib/core/util.js'; 
 | 
import { getRawSourceItemGetter, getRawSourceDataCounter, getRawSourceValueGetter } from './dataProvider.js'; 
 | 
import { parseDataValue } from './dataValueHelper.js'; 
 | 
import { log, makePrintable, throwError } from '../../util/log.js'; 
 | 
import { createSource, detectSourceFormat } from '../Source.js'; 
 | 
/** 
 | 
 * TODO: disable writable. 
 | 
 * This structure will be exposed to users. 
 | 
 */ 
 | 
var ExternalSource = /** @class */function () { 
 | 
  function ExternalSource() {} 
 | 
  ExternalSource.prototype.getRawData = function () { 
 | 
    // Only built-in transform available. 
 | 
    throw new Error('not supported'); 
 | 
  }; 
 | 
  ExternalSource.prototype.getRawDataItem = function (dataIndex) { 
 | 
    // Only built-in transform available. 
 | 
    throw new Error('not supported'); 
 | 
  }; 
 | 
  ExternalSource.prototype.cloneRawData = function () { 
 | 
    return; 
 | 
  }; 
 | 
  /** 
 | 
   * @return If dimension not found, return null/undefined. 
 | 
   */ 
 | 
  ExternalSource.prototype.getDimensionInfo = function (dim) { 
 | 
    return; 
 | 
  }; 
 | 
  /** 
 | 
   * dimensions defined if and only if either: 
 | 
   * (a) dataset.dimensions are declared. 
 | 
   * (b) dataset data include dimensions definitions in data (detected or via specified `sourceHeader`). 
 | 
   * If dimensions are defined, `dimensionInfoAll` is corresponding to 
 | 
   * the defined dimensions. 
 | 
   * Otherwise, `dimensionInfoAll` is determined by data columns. 
 | 
   * @return Always return an array (even empty array). 
 | 
   */ 
 | 
  ExternalSource.prototype.cloneAllDimensionInfo = function () { 
 | 
    return; 
 | 
  }; 
 | 
  ExternalSource.prototype.count = function () { 
 | 
    return; 
 | 
  }; 
 | 
  /** 
 | 
   * Only support by dimension index. 
 | 
   * No need to support by dimension name in transform function, 
 | 
   * because transform function is not case-specific, no need to use name literally. 
 | 
   */ 
 | 
  ExternalSource.prototype.retrieveValue = function (dataIndex, dimIndex) { 
 | 
    return; 
 | 
  }; 
 | 
  ExternalSource.prototype.retrieveValueFromItem = function (dataItem, dimIndex) { 
 | 
    return; 
 | 
  }; 
 | 
  ExternalSource.prototype.convertValue = function (rawVal, dimInfo) { 
 | 
    return parseDataValue(rawVal, dimInfo); 
 | 
  }; 
 | 
  return ExternalSource; 
 | 
}(); 
 | 
export { ExternalSource }; 
 | 
function createExternalSource(internalSource, externalTransform) { 
 | 
  var extSource = new ExternalSource(); 
 | 
  var data = internalSource.data; 
 | 
  var sourceFormat = extSource.sourceFormat = internalSource.sourceFormat; 
 | 
  var sourceHeaderCount = internalSource.startIndex; 
 | 
  var errMsg = ''; 
 | 
  if (internalSource.seriesLayoutBy !== SERIES_LAYOUT_BY_COLUMN) { 
 | 
    // For the logic simplicity in transformer, only 'culumn' is 
 | 
    // supported in data transform. Otherwise, the `dimensionsDefine` 
 | 
    // might be detected by 'row', which probably confuses users. 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      errMsg = '`seriesLayoutBy` of upstream dataset can only be "column" in data transform.'; 
 | 
    } 
 | 
    throwError(errMsg); 
 | 
  } 
 | 
  // [MEMO] 
 | 
  // Create a new dimensions structure for exposing. 
 | 
  // Do not expose all dimension info to users directly. 
 | 
  // Because the dimension is probably auto detected from data and not might reliable. 
 | 
  // Should not lead the transformers to think that is reliable and return it. 
 | 
  // See [DIMENSION_INHERIT_RULE] in `sourceManager.ts`. 
 | 
  var dimensions = []; 
 | 
  var dimsByName = {}; 
 | 
  var dimsDef = internalSource.dimensionsDefine; 
 | 
  if (dimsDef) { 
 | 
    each(dimsDef, function (dimDef, idx) { 
 | 
      var name = dimDef.name; 
 | 
      var dimDefExt = { 
 | 
        index: idx, 
 | 
        name: name, 
 | 
        displayName: dimDef.displayName 
 | 
      }; 
 | 
      dimensions.push(dimDefExt); 
 | 
      // Users probably do not specify dimension name. For simplicity, data transform 
 | 
      // does not generate dimension name. 
 | 
      if (name != null) { 
 | 
        // Dimension name should not be duplicated. 
 | 
        // For simplicity, data transform forbids name duplication, do not generate 
 | 
        // new name like module `completeDimensions.ts` did, but just tell users. 
 | 
        var errMsg_1 = ''; 
 | 
        if (hasOwn(dimsByName, name)) { 
 | 
          if (process.env.NODE_ENV !== 'production') { 
 | 
            errMsg_1 = 'dimension name "' + name + '" duplicated.'; 
 | 
          } 
 | 
          throwError(errMsg_1); 
 | 
        } 
 | 
        dimsByName[name] = dimDefExt; 
 | 
      } 
 | 
    }); 
 | 
  } 
 | 
  // If dimension definitions are not defined and can not be detected. 
 | 
  // e.g., pure data `[[11, 22], ...]`. 
 | 
  else { 
 | 
    for (var i = 0; i < internalSource.dimensionsDetectedCount || 0; i++) { 
 | 
      // Do not generete name or anything others. The consequence process in 
 | 
      // `transform` or `series` probably have there own name generation strategry. 
 | 
      dimensions.push({ 
 | 
        index: i 
 | 
      }); 
 | 
    } 
 | 
  } 
 | 
  // Implement public methods: 
 | 
  var rawItemGetter = getRawSourceItemGetter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); 
 | 
  if (externalTransform.__isBuiltIn) { 
 | 
    extSource.getRawDataItem = function (dataIndex) { 
 | 
      return rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); 
 | 
    }; 
 | 
    extSource.getRawData = bind(getRawData, null, internalSource); 
 | 
  } 
 | 
  extSource.cloneRawData = bind(cloneRawData, null, internalSource); 
 | 
  var rawCounter = getRawSourceDataCounter(sourceFormat, SERIES_LAYOUT_BY_COLUMN); 
 | 
  extSource.count = bind(rawCounter, null, data, sourceHeaderCount, dimensions); 
 | 
  var rawValueGetter = getRawSourceValueGetter(sourceFormat); 
 | 
  extSource.retrieveValue = function (dataIndex, dimIndex) { 
 | 
    var rawItem = rawItemGetter(data, sourceHeaderCount, dimensions, dataIndex); 
 | 
    return retrieveValueFromItem(rawItem, dimIndex); 
 | 
  }; 
 | 
  var retrieveValueFromItem = extSource.retrieveValueFromItem = function (dataItem, dimIndex) { 
 | 
    if (dataItem == null) { 
 | 
      return; 
 | 
    } 
 | 
    var dimDef = dimensions[dimIndex]; 
 | 
    // When `dimIndex` is `null`, `rawValueGetter` return the whole item. 
 | 
    if (dimDef) { 
 | 
      return rawValueGetter(dataItem, dimIndex, dimDef.name); 
 | 
    } 
 | 
  }; 
 | 
  extSource.getDimensionInfo = bind(getDimensionInfo, null, dimensions, dimsByName); 
 | 
  extSource.cloneAllDimensionInfo = bind(cloneAllDimensionInfo, null, dimensions); 
 | 
  return extSource; 
 | 
} 
 | 
function getRawData(upstream) { 
 | 
  var sourceFormat = upstream.sourceFormat; 
 | 
  if (!isSupportedSourceFormat(sourceFormat)) { 
 | 
    var errMsg = ''; 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      errMsg = '`getRawData` is not supported in source format ' + sourceFormat; 
 | 
    } 
 | 
    throwError(errMsg); 
 | 
  } 
 | 
  return upstream.data; 
 | 
} 
 | 
function cloneRawData(upstream) { 
 | 
  var sourceFormat = upstream.sourceFormat; 
 | 
  var data = upstream.data; 
 | 
  if (!isSupportedSourceFormat(sourceFormat)) { 
 | 
    var errMsg = ''; 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      errMsg = '`cloneRawData` is not supported in source format ' + sourceFormat; 
 | 
    } 
 | 
    throwError(errMsg); 
 | 
  } 
 | 
  if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { 
 | 
    var result = []; 
 | 
    for (var i = 0, len = data.length; i < len; i++) { 
 | 
      // Not strictly clone for performance 
 | 
      result.push(data[i].slice()); 
 | 
    } 
 | 
    return result; 
 | 
  } else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { 
 | 
    var result = []; 
 | 
    for (var i = 0, len = data.length; i < len; i++) { 
 | 
      // Not strictly clone for performance 
 | 
      result.push(extend({}, data[i])); 
 | 
    } 
 | 
    return result; 
 | 
  } 
 | 
} 
 | 
function getDimensionInfo(dimensions, dimsByName, dim) { 
 | 
  if (dim == null) { 
 | 
    return; 
 | 
  } 
 | 
  // Keep the same logic as `List::getDimension` did. 
 | 
  if (isNumber(dim) 
 | 
  // If being a number-like string but not being defined a dimension name. 
 | 
  || !isNaN(dim) && !hasOwn(dimsByName, dim)) { 
 | 
    return dimensions[dim]; 
 | 
  } else if (hasOwn(dimsByName, dim)) { 
 | 
    return dimsByName[dim]; 
 | 
  } 
 | 
} 
 | 
function cloneAllDimensionInfo(dimensions) { 
 | 
  return clone(dimensions); 
 | 
} 
 | 
var externalTransformMap = createHashMap(); 
 | 
export function registerExternalTransform(externalTransform) { 
 | 
  externalTransform = clone(externalTransform); 
 | 
  var type = externalTransform.type; 
 | 
  var errMsg = ''; 
 | 
  if (!type) { 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      errMsg = 'Must have a `type` when `registerTransform`.'; 
 | 
    } 
 | 
    throwError(errMsg); 
 | 
  } 
 | 
  var typeParsed = type.split(':'); 
 | 
  if (typeParsed.length !== 2) { 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      errMsg = 'Name must include namespace like "ns:regression".'; 
 | 
    } 
 | 
    throwError(errMsg); 
 | 
  } 
 | 
  // Namespace 'echarts:xxx' is official namespace, where the transforms should 
 | 
  // be called directly via 'xxx' rather than 'echarts:xxx'. 
 | 
  var isBuiltIn = false; 
 | 
  if (typeParsed[0] === 'echarts') { 
 | 
    type = typeParsed[1]; 
 | 
    isBuiltIn = true; 
 | 
  } 
 | 
  externalTransform.__isBuiltIn = isBuiltIn; 
 | 
  externalTransformMap.set(type, externalTransform); 
 | 
} 
 | 
export function applyDataTransform(rawTransOption, sourceList, infoForPrint) { 
 | 
  var pipedTransOption = normalizeToArray(rawTransOption); 
 | 
  var pipeLen = pipedTransOption.length; 
 | 
  var errMsg = ''; 
 | 
  if (!pipeLen) { 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      errMsg = 'If `transform` declared, it should at least contain one transform.'; 
 | 
    } 
 | 
    throwError(errMsg); 
 | 
  } 
 | 
  for (var i = 0, len = pipeLen; i < len; i++) { 
 | 
    var transOption = pipedTransOption[i]; 
 | 
    sourceList = applySingleDataTransform(transOption, sourceList, infoForPrint, pipeLen === 1 ? null : i); 
 | 
    // piped transform only support single input, except the fist one. 
 | 
    // piped transform only support single output, except the last one. 
 | 
    if (i !== len - 1) { 
 | 
      sourceList.length = Math.max(sourceList.length, 1); 
 | 
    } 
 | 
  } 
 | 
  return sourceList; 
 | 
} 
 | 
function applySingleDataTransform(transOption, upSourceList, infoForPrint, 
 | 
// If `pipeIndex` is null/undefined, no piped transform. 
 | 
pipeIndex) { 
 | 
  var errMsg = ''; 
 | 
  if (!upSourceList.length) { 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      errMsg = 'Must have at least one upstream dataset.'; 
 | 
    } 
 | 
    throwError(errMsg); 
 | 
  } 
 | 
  if (!isObject(transOption)) { 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      errMsg = 'transform declaration must be an object rather than ' + typeof transOption + '.'; 
 | 
    } 
 | 
    throwError(errMsg); 
 | 
  } 
 | 
  var transType = transOption.type; 
 | 
  var externalTransform = externalTransformMap.get(transType); 
 | 
  if (!externalTransform) { 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      errMsg = 'Can not find transform on type "' + transType + '".'; 
 | 
    } 
 | 
    throwError(errMsg); 
 | 
  } 
 | 
  // Prepare source 
 | 
  var extUpSourceList = map(upSourceList, function (upSource) { 
 | 
    return createExternalSource(upSource, externalTransform); 
 | 
  }); 
 | 
  var resultList = normalizeToArray(externalTransform.transform({ 
 | 
    upstream: extUpSourceList[0], 
 | 
    upstreamList: extUpSourceList, 
 | 
    config: clone(transOption.config) 
 | 
  })); 
 | 
  if (process.env.NODE_ENV !== 'production') { 
 | 
    if (transOption.print) { 
 | 
      var printStrArr = map(resultList, function (extSource) { 
 | 
        var pipeIndexStr = pipeIndex != null ? ' === pipe index: ' + pipeIndex : ''; 
 | 
        return ['=== dataset index: ' + infoForPrint.datasetIndex + pipeIndexStr + ' ===', '- transform result data:', makePrintable(extSource.data), '- transform result dimensions:', makePrintable(extSource.dimensions)].join('\n'); 
 | 
      }).join('\n'); 
 | 
      log(printStrArr); 
 | 
    } 
 | 
  } 
 | 
  return map(resultList, function (result, resultIndex) { 
 | 
    var errMsg = ''; 
 | 
    if (!isObject(result)) { 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        errMsg = 'A transform should not return some empty results.'; 
 | 
      } 
 | 
      throwError(errMsg); 
 | 
    } 
 | 
    if (!result.data) { 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        errMsg = 'Transform result data should be not be null or undefined'; 
 | 
      } 
 | 
      throwError(errMsg); 
 | 
    } 
 | 
    var sourceFormat = detectSourceFormat(result.data); 
 | 
    if (!isSupportedSourceFormat(sourceFormat)) { 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        errMsg = 'Transform result data should be array rows or object rows.'; 
 | 
      } 
 | 
      throwError(errMsg); 
 | 
    } 
 | 
    var resultMetaRawOption; 
 | 
    var firstUpSource = upSourceList[0]; 
 | 
    /** 
 | 
     * Intuitively, the end users known the content of the original `dataset.source`, 
 | 
     * calucating the transform result in mind. 
 | 
     * Suppose the original `dataset.source` is: 
 | 
     * ```js 
 | 
     * [ 
 | 
     *     ['product', '2012', '2013', '2014', '2015'], 
 | 
     *     ['AAA', 41.1, 30.4, 65.1, 53.3], 
 | 
     *     ['BBB', 86.5, 92.1, 85.7, 83.1], 
 | 
     *     ['CCC', 24.1, 67.2, 79.5, 86.4] 
 | 
     * ] 
 | 
     * ``` 
 | 
     * The dimension info have to be detected from the source data. 
 | 
     * Some of the transformers (like filter, sort) will follow the dimension info 
 | 
     * of upstream, while others use new dimensions (like aggregate). 
 | 
     * Transformer can output a field `dimensions` to define the its own output dimensions. 
 | 
     * We also allow transformers to ignore the output `dimensions` field, and 
 | 
     * inherit the upstream dimensions definition. It can reduce the burden of handling 
 | 
     * dimensions in transformers. 
 | 
     * 
 | 
     * See also [DIMENSION_INHERIT_RULE] in `sourceManager.ts`. 
 | 
     */ 
 | 
    if (firstUpSource && resultIndex === 0 
 | 
    // If transformer returns `dimensions`, it means that the transformer has different 
 | 
    // dimensions definitions. We do not inherit anything from upstream. 
 | 
    && !result.dimensions) { 
 | 
      var startIndex = firstUpSource.startIndex; 
 | 
      // We copy the header of upstream to the result, because: 
 | 
      // (1) The returned data always does not contain header line and can not be used 
 | 
      // as dimension-detection. In this case we can not use "detected dimensions" of 
 | 
      // upstream directly, because it might be detected based on different `seriesLayoutBy`. 
 | 
      // (2) We should support that the series read the upstream source in `seriesLayoutBy: 'row'`. 
 | 
      // So the original detected header should be add to the result, otherwise they can not be read. 
 | 
      if (startIndex) { 
 | 
        result.data = firstUpSource.data.slice(0, startIndex).concat(result.data); 
 | 
      } 
 | 
      resultMetaRawOption = { 
 | 
        seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, 
 | 
        sourceHeader: startIndex, 
 | 
        dimensions: firstUpSource.metaRawOption.dimensions 
 | 
      }; 
 | 
    } else { 
 | 
      resultMetaRawOption = { 
 | 
        seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, 
 | 
        sourceHeader: 0, 
 | 
        dimensions: result.dimensions 
 | 
      }; 
 | 
    } 
 | 
    return createSource(result.data, resultMetaRawOption, null); 
 | 
  }); 
 | 
} 
 | 
function isSupportedSourceFormat(sourceFormat) { 
 | 
  return sourceFormat === SOURCE_FORMAT_ARRAY_ROWS || sourceFormat === SOURCE_FORMAT_OBJECT_ROWS; 
 | 
} 
 |