docs: function (dimensions, hostModel) {
  
      dimensions = dimensions || ['x', 'y'];
  
      var dimensionInfos = {};
      var dimensionNames = [];
      var invertedIndicesMap = {};
  
      for (var i = 0; i < dimensions.length; i++) {
          // Use the original dimensions[i], where other flag props may exists.
          var dimensionInfo = dimensions[i];
  
          if (zrUtil.isString(dimensionInfo)) {
              dimensionInfo = {name: dimensionInfo};
          }
  
          var dimensionName = dimensionInfo.name;
          dimensionInfo.type = dimensionInfo.type || 'float';
          if (!dimensionInfo.coordDim) {
              dimensionInfo.coordDim = dimensionName;
              dimensionInfo.coordDimIndex = 0;
          }
  
          dimensionInfo.otherDims = dimensionInfo.otherDims || {};
          dimensionNames.push(dimensionName);
          dimensionInfos[dimensionName] = dimensionInfo;
  
          dimensionInfo.index = i;
  
          if (dimensionInfo.createInvertedIndices) {
              invertedIndicesMap[dimensionName] = [];
          }
      }
  
      /**
       * @readOnly
       * @type {Array.<string>}
       */
      this.dimensions = dimensionNames;
  
      /**
       * Infomation of each data dimension, like data type.
       * @type {Object}
       */
      this._dimensionInfos = dimensionInfos;
  
      /**
       * @type {module:echarts/model/Model}
       */
      this.hostModel = hostModel;
  
      /**
       * @type {module:echarts/model/Model}
       */
      this.dataType;
  
      /**
       * Indices stores the indices of data subset after filtered.
       * This data subset will be used in chart.
       * @type {Array.<number>}
       * @readOnly
       */
      this._indices = null;
  
      this._count = 0;
      this._rawCount = 0;
  
      /**
       * Data storage
       * @type {Object.<key, Array.<TypedArray|Array>>}
       * @private
       */
      this._storage = {};
  
      /**
       * @type {Array.<string>}
       */
      this._nameList = [];
      /**
       * @type {Array.<string>}
       */
      this._idList = [];
  
      /**
       * Models of data option is stored sparse for optimizing memory cost
       * @type {Array.<module:echarts/model/Model>}
       * @private
       */
      this._optionModels = [];
  
      /**
       * Global visual properties after visual coding
       * @type {Object}
       * @private
       */
      this._visual = {};
  
      /**
       * Globel layout properties.
       * @type {Object}
       * @private
       */
      this._layout = {};
  
      /**
       * Item visual properties after visual coding
       * @type {Array.<Object>}
       * @private
       */
      this._itemVisuals = [];
  
      /**
       * Key: visual type, Value: boolean
       * @type {Object}
       * @readOnly
       */
      this.hasItemVisual = {};
  
      /**
       * Item layout properties after layout
       * @type {Array.<Object>}
       * @private
       */
      this._itemLayouts = [];
  
      /**
       * Graphic elemnents
       * @type {Array.<module:zrender/Element>}
       * @private
       */
      this._graphicEls = [];
  
      /**
       * Max size of each chunk.
       * @type {number}
       * @private
       */
      this._chunkSize = 1e5;
  
      /**
       * @type {number}
       * @private
       */
      this._chunkCount = 0;
  
      /**
       * @type {Array.<Array|Object>}
       * @private
       */
      this._rawData;
  
      /**
       * Raw extent will not be cloned, but only transfered.
       * It will not be calculated util needed.
       * key: dim,
       * value: {end: number, extent: Array.<number>}
       * @type {Object}
       * @private
       */
      this._rawExtent = {};
  
      /**
       * @type {Object}
       * @private
       */
      this._extent = {};
  
      /**
       * key: dim
       * value: extent
       * @type {Object}
       * @private
       */
      this._approximateExtent = {};
  
      /**
       * Cache summary info for fast visit. See "dimensionHelper".
       * @type {Object}
       * @private
       */
      this._dimensionsSummary = summarizeDimensions(this);
  
      /**
       * @type {Object.<Array|TypedArray>}
       * @private
       */
      this._invertedIndicesMap = invertedIndicesMap;
  
      /**
       * @type {Object}
       * @private
       */
      this._calculationInfo = {};
  }