You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					167 lines
				
				4.7 KiB
			
		
		
			
		
	
	
					167 lines
				
				4.7 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								* 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.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _util = require("zrender/lib/core/util");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var createHashMap = _util.createHashMap;
							 | 
						||
| 
								 | 
							
								var isObject = _util.isObject;
							 | 
						||
| 
								 | 
							
								var map = _util.map;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								* 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.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @constructor
							 | 
						||
| 
								 | 
							
								 * @param {Object} [opt]
							 | 
						||
| 
								 | 
							
								 * @param {Object} [opt.categories=[]]
							 | 
						||
| 
								 | 
							
								 * @param {Object} [opt.needCollect=false]
							 | 
						||
| 
								 | 
							
								 * @param {Object} [opt.deduplication=false]
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function OrdinalMeta(opt) {
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @readOnly
							 | 
						||
| 
								 | 
							
								   * @type {Array.<string>}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								  this.categories = opt.categories || [];
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @private
							 | 
						||
| 
								 | 
							
								   * @type {boolean}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this._needCollect = opt.needCollect;
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @private
							 | 
						||
| 
								 | 
							
								   * @type {boolean}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this._deduplication = opt.deduplication;
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * @private
							 | 
						||
| 
								 | 
							
								   * @type {boolean}
							 | 
						||
| 
								 | 
							
								   */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this._map;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @param {module:echarts/model/Model} axisModel
							 | 
						||
| 
								 | 
							
								 * @return {module:echarts/data/OrdinalMeta}
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								OrdinalMeta.createByAxisModel = function (axisModel) {
							 | 
						||
| 
								 | 
							
								  var option = axisModel.option;
							 | 
						||
| 
								 | 
							
								  var data = option.data;
							 | 
						||
| 
								 | 
							
								  var categories = data && map(data, getName);
							 | 
						||
| 
								 | 
							
								  return new OrdinalMeta({
							 | 
						||
| 
								 | 
							
								    categories: categories,
							 | 
						||
| 
								 | 
							
								    needCollect: !categories,
							 | 
						||
| 
								 | 
							
								    // deduplication is default in axis.
							 | 
						||
| 
								 | 
							
								    deduplication: option.dedplication !== false
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var proto = OrdinalMeta.prototype;
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @param {string} category
							 | 
						||
| 
								 | 
							
								 * @return {number} ordinal
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								proto.getOrdinal = function (category) {
							 | 
						||
| 
								 | 
							
								  return getOrCreateMap(this).get(category);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @param {*} category
							 | 
						||
| 
								 | 
							
								 * @return {number} The ordinal. If not found, return NaN.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								proto.parseAndCollect = function (category) {
							 | 
						||
| 
								 | 
							
								  var index;
							 | 
						||
| 
								 | 
							
								  var needCollect = this._needCollect; // The value of category dim can be the index of the given category set.
							 | 
						||
| 
								 | 
							
								  // This feature is only supported when !needCollect, because we should
							 | 
						||
| 
								 | 
							
								  // consider a common case: a value is 2017, which is a number but is
							 | 
						||
| 
								 | 
							
								  // expected to be tread as a category. This case usually happen in dataset,
							 | 
						||
| 
								 | 
							
								  // where it happent to be no need of the index feature.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (typeof category !== 'string' && !needCollect) {
							 | 
						||
| 
								 | 
							
								    return category;
							 | 
						||
| 
								 | 
							
								  } // Optimize for the scenario:
							 | 
						||
| 
								 | 
							
								  // category is ['2012-01-01', '2012-01-02', ...], where the input
							 | 
						||
| 
								 | 
							
								  // data has been ensured not duplicate and is large data.
							 | 
						||
| 
								 | 
							
								  // Notice, if a dataset dimension provide categroies, usually echarts
							 | 
						||
| 
								 | 
							
								  // should remove duplication except user tell echarts dont do that
							 | 
						||
| 
								 | 
							
								  // (set axis.deduplication = false), because echarts do not know whether
							 | 
						||
| 
								 | 
							
								  // the values in the category dimension has duplication (consider the
							 | 
						||
| 
								 | 
							
								  // parallel-aqi example)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (needCollect && !this._deduplication) {
							 | 
						||
| 
								 | 
							
								    index = this.categories.length;
							 | 
						||
| 
								 | 
							
								    this.categories[index] = category;
							 | 
						||
| 
								 | 
							
								    return index;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var map = getOrCreateMap(this);
							 | 
						||
| 
								 | 
							
								  index = map.get(category);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (index == null) {
							 | 
						||
| 
								 | 
							
								    if (needCollect) {
							 | 
						||
| 
								 | 
							
								      index = this.categories.length;
							 | 
						||
| 
								 | 
							
								      this.categories[index] = category;
							 | 
						||
| 
								 | 
							
								      map.set(category, index);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      index = NaN;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return index;
							 | 
						||
| 
								 | 
							
								}; // Consider big data, do not create map until needed.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function getOrCreateMap(ordinalMeta) {
							 | 
						||
| 
								 | 
							
								  return ordinalMeta._map || (ordinalMeta._map = createHashMap(ordinalMeta.categories));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function getName(obj) {
							 | 
						||
| 
								 | 
							
								  if (isObject(obj) && obj.value != null) {
							 | 
						||
| 
								 | 
							
								    return obj.value;
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    return obj + '';
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var _default = OrdinalMeta;
							 | 
						||
| 
								 | 
							
								module.exports = _default;
							 |