categorical UI improvements (#1649)

* return undefined for unknown fields

* memoize fetch response

* handle rename of user annotation

* performance and cleanup

* fix snapshots

* fix comment

* lint
This commit is contained in:
Bruce Martin
2020-07-20 08:52:41 -07:00
committed by GitHub
parent 410566f5e1
commit 2715157793
13 changed files with 274 additions and 229 deletions
+26
View File
@@ -0,0 +1,26 @@
/*
DataframeCache - to improve memoization, we often want to have the same
Dataframe object returned when the contents of the dataframe are identical.
The core dataframe class does not support this, but it does attempt to maintain
strict eq and immutability of columns indices.
This is a function that will maintain a least-recently created cache of Dataframe
objects.
*/
import { memoize } from "./util";
function hashDataframe(df) {
if (df.isEmpty()) return "";
return df.__columnsAccessor.map((c) => c.__id).join(",");
}
function noop(df) {
return df;
}
const dataframeMemo = (capacity = 100) =>
memoize(noop, hashDataframe, capacity);
export default dataframeMemo;
+3 -13
View File
@@ -5,6 +5,7 @@ import {
isArrayOrTypedArray,
callOnceLazy,
memoize,
__getMemoId,
} from "./util";
import {
summarizeContinuous,
@@ -72,17 +73,6 @@ Dataframe
**/
class Dataframe {
/**
memoization helpers.
**/
static __DataframeId__ = 0;
static __getId() {
const id = Dataframe.__DataframeId__;
Dataframe.__DataframeId__ += 1;
return id;
}
/**
Constructors & factories
**/
@@ -126,7 +116,7 @@ class Dataframe {
this.length = nRows; // convenience accessor for row dimension
this.rowIndex = rowIndex;
this.colIndex = colIndex;
this.__id = Dataframe.__getId();
this.__id = __getMemoId();
this.__compile(__columnsAccessor);
Object.freeze(this);
@@ -202,7 +192,7 @@ class Dataframe {
*/
const { length } = column;
const __id = Dataframe.__getId();
const __id = __getMemoId();
/* get value by row label */
const get = function get(rlabel) {
+1
View File
@@ -5,3 +5,4 @@ export {
KeyIndex,
isLabelIndex,
} from "./labelIndex";
export { default as dataframeMemo } from "./cache";
+7
View File
@@ -5,6 +5,7 @@ for how this is used.
**/
import { rangeFill as fillRange } from "../range";
import { __getMemoId } from "./util";
/*
Private utility functions
@@ -32,6 +33,10 @@ class IdentityInt32Index {
this.maxOffset = maxOffset;
}
get __id() {
return `IdentityInt32Index_${this.maxOffset}`;
}
labels() {
// memoize
const k = fillRange(new Int32Array(this.maxOffset));
@@ -162,6 +167,7 @@ class DenseInt32Index {
this.minLabel = minLabel;
this.rindex = labels;
this.index = index;
this.__id = __getMemoId();
this.__compile();
}
@@ -288,6 +294,7 @@ class KeyIndex {
this.index = index;
this.rindex = rindex;
this.__id = __getMemoId();
this.__compile();
}
+10
View File
@@ -52,3 +52,13 @@ export function memoize(fn, hashFn, maxResultsCached = -1) {
return wrap;
}
/**
memoization helpers - just a global counter.
**/
let __DataframeMemoId__ = 0;
export function __getMemoId() {
const id = __DataframeMemoId__;
__DataframeMemoId__ += 1;
return id;
}