You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2021/07/14 03:29:01 UTC

[echarts] branch dataset-perf updated: refact(data): fix type from dataset may incorrect.

This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch dataset-perf
in repository https://gitbox.apache.org/repos/asf/echarts.git


The following commit(s) were added to refs/heads/dataset-perf by this push:
     new 0349b87  refact(data): fix type from dataset may incorrect.
0349b87 is described below

commit 0349b87f03ba94dc153a2304de31d56c913ac690
Author: pissang <bm...@gmail.com>
AuthorDate: Wed Jul 14 11:27:43 2021 +0800

    refact(data): fix type from dataset may incorrect.
---
 src/chart/helper/createSeriesDataFromArray.ts |  6 +++---
 src/data/DataStorage.ts                       | 21 +++++++++------------
 src/data/SeriesData.ts                        |  2 +-
 src/data/helper/createDimensions.ts           | 11 ++++++++---
 4 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/src/chart/helper/createSeriesDataFromArray.ts b/src/chart/helper/createSeriesDataFromArray.ts
index b84bf0e..fa6a2fb 100644
--- a/src/chart/helper/createSeriesDataFromArray.ts
+++ b/src/chart/helper/createSeriesDataFromArray.ts
@@ -126,8 +126,8 @@ function createListFromArray(
     const useEncodeDefaulter = opt.useEncodeDefaulter;
 
     // Try to ignore unsed dimensions if sharing a high dimension datastorage
-    // 10 is an experience value.
-    const omitUnusedDimensions = isDataStorage(sourceOrStore) && sourceOrStore.getDimensionCount() > 10;
+    // 30 is an experience value.
+    const omitUnusedDimensions = isDataStorage(sourceOrStore) && sourceOrStore.getDimensionCount() > 30;
     const encodeDefaulter = zrUtil.isFunction(useEncodeDefaulter)
         ? useEncodeDefaulter
         : useEncodeDefaulter
@@ -151,7 +151,7 @@ function createListFromArray(
 
     if (omitUnusedDimensions) {
         // sourceOrStore
-        if (!(sourceOrStore as DataStorage).syncDimensionTypes(dimInfoList)) {
+        if (!(sourceOrStore as DataStorage).canUse(dimInfoList)) {
             dimInfoList = createDimensions(sourceOrStore, zrUtil.extend(createDimensionOptions, {
                 omitUnusedDimensions: true
             }));
diff --git a/src/data/DataStorage.ts b/src/data/DataStorage.ts
index 7bc93f6..01574ec 100644
--- a/src/data/DataStorage.ts
+++ b/src/data/DataStorage.ts
@@ -267,28 +267,25 @@ class DataStorage {
     }
 
     /**
-     * If we using dataset.
-     * Dimensions types may only know when we initializing series.
-     * So we need to sync the type back to storage when initlializing SeriesData back
-     *
-     * Will return false if dimension type has been known and different from given.
-     * We need to recreate a new data storage in this case.
+     * The dimension defines of series may be different with dataset. For example
+     * in dataset one dimension is not ordinal and being parsed to number.
+     * In this case we can't used it in series if we wan't to use it as ordinal. This storage needs to be discarded.
      */
-    syncDimensionTypes(targetDims: DataStorageDimensionInfo[]) {
+    // TODO Can't sure what's frequency will this validate fail and cause datastorage recreate.
+    canUse(targetDims: DataStorageDimensionInfo[]) {
         for (let i = 0; i < targetDims.length; i++) {
             const targetDim = targetDims[i];
             const selfDimIdx = this.getDimensionIndex(targetDim.name);
             const selfDim = this._dimensions[selfDimIdx];
-            const targetDimType = targetDim.type || 'float';
-            if (!selfDim
+            if (
+                !selfDim
                 // Type is different
-                || (selfDim.type && selfDim.type !== targetDimType)
-                // ordinalMeta is differnt. Usually being on the different axis.
+                || selfDim.type || 'float' !== targetDim.type || 'float'
+                // ordinalMeta is different. Usually being on the different axis.
                 || (selfDim.ordinalMeta && selfDim.ordinalMeta !== targetDim.ordinalMeta)
             ) {
                 return false;
             }
-            selfDim.type = targetDimType;
         }
         return true;
     }
diff --git a/src/data/SeriesData.ts b/src/data/SeriesData.ts
index e2e5345..388a7f1 100644
--- a/src/data/SeriesData.ts
+++ b/src/data/SeriesData.ts
@@ -390,7 +390,7 @@ class SeriesData<
         const dimensions = this.dimensions;
         const dimensionInfos = map(dimensions, dimName => this._dimensionInfos[dimName]);
         if (data instanceof DataStorage) {
-            if (data.syncDimensionTypes(dimensionInfos)) {
+            if (data.canUse(dimensionInfos)) {
                 store = data;
             }
             // Sync failed
diff --git a/src/data/helper/createDimensions.ts b/src/data/helper/createDimensions.ts
index 3e69c40..ad5413d 100644
--- a/src/data/helper/createDimensions.ts
+++ b/src/data/helper/createDimensions.ts
@@ -29,7 +29,7 @@ import {
 } from '../../util/types';
 import SeriesData from '../SeriesData';
 import DataDimensionInfo from '../DataDimensionInfo';
-import { clone, createHashMap, defaults, each, HashMap, isObject, isString, map } from 'zrender/src/core/util';
+import { createHashMap, defaults, each, extend, HashMap, isObject, isString, map } from 'zrender/src/core/util';
 import OrdinalMeta from '../OrdinalMeta';
 import { createSourceFromSeriesDataOption, isSourceInstance, Source } from '../Source';
 import DataStorage, { CtorInt32Array } from '../DataStorage';
@@ -106,8 +106,9 @@ export default function createDimensions(
     const coordDimNameMap = createHashMap<true, DimensionName>();
     const result: DataDimensionInfo[] = [];
     const omitUnusedDimensions = opt.omitUnusedDimensions;
+    const isUsingSourceDimensionsDef = dimsDef === source.dimensionsDefine;
     // Try to cache the dimNameMap if the dimensionsDefine is from source.
-    const canCacheDimNameMap = (dimsDef === source.dimensionsDefine && omitUnusedDimensions);
+    const canCacheDimNameMap = (isUsingSourceDimensionsDef && omitUnusedDimensions);
     let dataDimNameMap = canCacheDimNameMap && inner(source).dimNameMap;
     let needsUpdateDataDimNameMap = false;
     if (!dataDimNameMap) {
@@ -210,7 +211,7 @@ export default function createDimensions(
             coordDim = sysDimItem.name;
             const ordinalMeta = sysDimItem.ordinalMeta;
             sysDimItem.ordinalMeta = null;
-            sysDimItem = clone(sysDimItem);
+            sysDimItem = extend({}, sysDimItem);
             sysDimItem.ordinalMeta = ordinalMeta;
             // `coordDimIndex` should not be set directly.
             sysDimItemDimsDef = sysDimItem.dimsDef;
@@ -241,6 +242,10 @@ export default function createDimensions(
         // Apply templates.
         each(dataDims, function (resultDimIdx, coordDimIndex) {
             const resultItem = getResultItem(resultDimIdx);
+            // Coordinate system has a higher priority on dim type than source.
+            if (isUsingSourceDimensionsDef && sysDimItem.type != null) {
+                resultItem.type = sysDimItem.type;
+            }
             applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex);
             if (resultItem.name == null && sysDimItemDimsDef) {
                 let sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex];

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org