From a16c2e2747db293a788afffc2dcbe7a6aa5154dc Mon Sep 17 00:00:00 2001 From: Bruce Martin Date: Mon, 4 Nov 2019 14:14:17 -0800 Subject: [PATCH] crossfilter immutability error (#1009) * add rename immutability test * make rename immutable --- .../util/typedCrossfilter/crossfilter.test.js | 3 ++ .../src/util/typedCrossfilter/crossfilter.js | 29 ++++++++++--------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/client/__tests__/util/typedCrossfilter/crossfilter.test.js b/client/__tests__/util/typedCrossfilter/crossfilter.test.js index c94fb3fd..0558741c 100644 --- a/client/__tests__/util/typedCrossfilter/crossfilter.test.js +++ b/client/__tests__/util/typedCrossfilter/crossfilter.test.js @@ -168,6 +168,9 @@ describe("ImmutableTypedCrossfilter", () => { const p4 = p3.delDimension("quantity"); expect(p4).not.toBe(p3); + + const p5 = p2.renameDimension("quantity", "Quantity"); + expect(p5).not.toBe(p2); }); test("select all and none", () => { diff --git a/client/src/util/typedCrossfilter/crossfilter.js b/client/src/util/typedCrossfilter/crossfilter.js index d1961156..60ca6093 100644 --- a/client/src/util/typedCrossfilter/crossfilter.js +++ b/client/src/util/typedCrossfilter/crossfilter.js @@ -125,20 +125,17 @@ export default class ImmutableTypedCrossfilter { } renameDimension(oldName, newName) { - /* - rename a dimension - */ const { [oldName]: dim, ...dimensions } = this.dimensions; const { data, selectionCache } = this; - dim.dim.rename(newName); - return new ImmutableTypedCrossfilter( - data, - { - ...dimensions, - [newName]: dim - }, - selectionCache - ); + const newDimensions = { + ...dimensions, + [newName]: { + ...dim, + name: newName, + dim: dim.dim.rename(newName) + } + }; + return new ImmutableTypedCrossfilter(data, newDimensions, selectionCache); } select(name, spec) { @@ -316,8 +313,14 @@ class _ImmutableBaseDimension { this.name = name; } + clone() { + return Object.assign(Object.create(Object.getPrototypeOf(this)), this); + } + rename(name) { - this.name = name; + const d = this.clone(); + d.name = name; + return d; } select(spec) {