165 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
 | |
| /*
 | |
| * 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 each = _util.each;
 | |
| var createHashMap = _util.createHashMap;
 | |
| var assert = _util.assert;
 | |
| 
 | |
| var _config = require("../../config");
 | |
| 
 | |
| var __DEV__ = _config.__DEV__;
 | |
| 
 | |
| /*
 | |
| * 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 OTHER_DIMENSIONS = createHashMap(['tooltip', 'label', 'itemName', 'itemId', 'seriesName']);
 | |
| 
 | |
| function summarizeDimensions(data) {
 | |
|   var summary = {};
 | |
|   var encode = summary.encode = {};
 | |
|   var notExtraCoordDimMap = createHashMap();
 | |
|   var defaultedLabel = [];
 | |
|   var defaultedTooltip = []; // See the comment of `List.js#userOutput`.
 | |
| 
 | |
|   var userOutput = summary.userOutput = {
 | |
|     dimensionNames: data.dimensions.slice(),
 | |
|     encode: {}
 | |
|   };
 | |
|   each(data.dimensions, function (dimName) {
 | |
|     var dimItem = data.getDimensionInfo(dimName);
 | |
|     var coordDim = dimItem.coordDim;
 | |
| 
 | |
|     if (coordDim) {
 | |
|       var coordDimIndex = dimItem.coordDimIndex;
 | |
|       getOrCreateEncodeArr(encode, coordDim)[coordDimIndex] = dimName;
 | |
| 
 | |
|       if (!dimItem.isExtraCoord) {
 | |
|         notExtraCoordDimMap.set(coordDim, 1); // Use the last coord dim (and label friendly) as default label,
 | |
|         // because when dataset is used, it is hard to guess which dimension
 | |
|         // can be value dimension. If both show x, y on label is not look good,
 | |
|         // and conventionally y axis is focused more.
 | |
| 
 | |
|         if (mayLabelDimType(dimItem.type)) {
 | |
|           defaultedLabel[0] = dimName;
 | |
|         } // User output encode do not contain generated coords.
 | |
|         // And it only has index. User can use index to retrieve value from the raw item array.
 | |
| 
 | |
| 
 | |
|         getOrCreateEncodeArr(userOutput.encode, coordDim)[coordDimIndex] = dimItem.index;
 | |
|       }
 | |
| 
 | |
|       if (dimItem.defaultTooltip) {
 | |
|         defaultedTooltip.push(dimName);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     OTHER_DIMENSIONS.each(function (v, otherDim) {
 | |
|       var encodeArr = getOrCreateEncodeArr(encode, otherDim);
 | |
|       var dimIndex = dimItem.otherDims[otherDim];
 | |
| 
 | |
|       if (dimIndex != null && dimIndex !== false) {
 | |
|         encodeArr[dimIndex] = dimItem.name;
 | |
|       }
 | |
|     });
 | |
|   });
 | |
|   var dataDimsOnCoord = [];
 | |
|   var encodeFirstDimNotExtra = {};
 | |
|   notExtraCoordDimMap.each(function (v, coordDim) {
 | |
|     var dimArr = encode[coordDim]; // ??? FIXME extra coord should not be set in dataDimsOnCoord.
 | |
|     // But should fix the case that radar axes: simplify the logic
 | |
|     // of `completeDimension`, remove `extraPrefix`.
 | |
| 
 | |
|     encodeFirstDimNotExtra[coordDim] = dimArr[0]; // Not necessary to remove duplicate, because a data
 | |
|     // dim canot on more than one coordDim.
 | |
| 
 | |
|     dataDimsOnCoord = dataDimsOnCoord.concat(dimArr);
 | |
|   });
 | |
|   summary.dataDimsOnCoord = dataDimsOnCoord;
 | |
|   summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra;
 | |
|   var encodeLabel = encode.label; // FIXME `encode.label` is not recommanded, because formatter can not be set
 | |
|   // in this way. Use label.formatter instead. May be remove this approach someday.
 | |
| 
 | |
|   if (encodeLabel && encodeLabel.length) {
 | |
|     defaultedLabel = encodeLabel.slice();
 | |
|   }
 | |
| 
 | |
|   var encodeTooltip = encode.tooltip;
 | |
| 
 | |
|   if (encodeTooltip && encodeTooltip.length) {
 | |
|     defaultedTooltip = encodeTooltip.slice();
 | |
|   } else if (!defaultedTooltip.length) {
 | |
|     defaultedTooltip = defaultedLabel.slice();
 | |
|   }
 | |
| 
 | |
|   encode.defaultedLabel = defaultedLabel;
 | |
|   encode.defaultedTooltip = defaultedTooltip;
 | |
|   return summary;
 | |
| }
 | |
| 
 | |
| function getOrCreateEncodeArr(encode, dim) {
 | |
|   if (!encode.hasOwnProperty(dim)) {
 | |
|     encode[dim] = [];
 | |
|   }
 | |
| 
 | |
|   return encode[dim];
 | |
| }
 | |
| 
 | |
| function getDimensionTypeByAxis(axisType) {
 | |
|   return axisType === 'category' ? 'ordinal' : axisType === 'time' ? 'time' : 'float';
 | |
| }
 | |
| 
 | |
| function mayLabelDimType(dimType) {
 | |
|   // In most cases, ordinal and time do not suitable for label.
 | |
|   // Ordinal info can be displayed on axis. Time is too long.
 | |
|   return !(dimType === 'ordinal' || dimType === 'time');
 | |
| } // function findTheLastDimMayLabel(data) {
 | |
| //     // Get last value dim
 | |
| //     var dimensions = data.dimensions.slice();
 | |
| //     var valueType;
 | |
| //     var valueDim;
 | |
| //     while (dimensions.length && (
 | |
| //         valueDim = dimensions.pop(),
 | |
| //         valueType = data.getDimensionInfo(valueDim).type,
 | |
| //         valueType === 'ordinal' || valueType === 'time'
 | |
| //     )) {} // jshint ignore:line
 | |
| //     return valueDim;
 | |
| // }
 | |
| 
 | |
| 
 | |
| exports.OTHER_DIMENSIONS = OTHER_DIMENSIONS;
 | |
| exports.summarizeDimensions = summarizeDimensions;
 | |
| exports.getDimensionTypeByAxis = getDimensionTypeByAxis; | 
