immutable data structures in tables 5/n: create table plugin
Summary: Migrating tables' row collection to Immutable.js List: 1. Migrate createTablePlugin to ManagedTable_immutable ----- Current implementation of tables forces to copy arrays on new data arrival which causes O(N^2) complexity -> tables can't handle a lot of new rows in short period of time -> tables freeze and become unresponsive for a few seconds. Immutable data structures will bring us to O(N) complexity Reviewed By: jknoxville Differential Revision: D16416867 fbshipit-source-id: 20890aa851cd2e34e33fd2ed69c5d6048af14cbb
This commit is contained in:
committed by
Facebook Github Bot
parent
d3658f7d31
commit
294d158869
@@ -6,15 +6,30 @@
|
||||
*/
|
||||
|
||||
import {createTablePlugin} from '../createTablePlugin.js';
|
||||
|
||||
import type {TableRows_immutable} from 'flipper';
|
||||
|
||||
//import type {PersistedState, RowData} from '../createTablePlugin.js';
|
||||
import {FlipperPlugin} from '../plugin.js';
|
||||
|
||||
import {List, Map as ImmutableMap} from 'immutable';
|
||||
|
||||
const PROPS = {
|
||||
method: 'method',
|
||||
resetMethod: 'resetMethod',
|
||||
columns: {},
|
||||
columnSizes: {},
|
||||
renderSidebar: () => {},
|
||||
buildRow: () => {},
|
||||
renderSidebar: (r: {id: string}) => {},
|
||||
buildRow: (r: {id: string}) => {},
|
||||
};
|
||||
|
||||
type PersistedState<T> = {|
|
||||
rows: TableRows_immutable,
|
||||
datas: ImmutableMap<string, T>,
|
||||
|};
|
||||
|
||||
type RowData = {
|
||||
id: string,
|
||||
};
|
||||
|
||||
test('createTablePlugin returns FlipperPlugin', () => {
|
||||
@@ -24,29 +39,27 @@ test('createTablePlugin returns FlipperPlugin', () => {
|
||||
|
||||
test('persistedStateReducer is resetting data', () => {
|
||||
const resetMethod = 'resetMethod';
|
||||
const tablePlugin = createTablePlugin({...PROPS, resetMethod});
|
||||
const tablePlugin = createTablePlugin<RowData>({...PROPS, resetMethod});
|
||||
|
||||
// $FlowFixMe persistedStateReducer exists for createTablePlugin
|
||||
const {rows, datas} = tablePlugin.persistedStateReducer(
|
||||
{
|
||||
datas: {'1': {id: '1'}},
|
||||
rows: [
|
||||
{
|
||||
key: '1',
|
||||
columns: {
|
||||
id: {
|
||||
value: '1',
|
||||
},
|
||||
const ps: PersistedState<RowData> = {
|
||||
datas: ImmutableMap({'1': {id: '1'}}),
|
||||
rows: List([
|
||||
{
|
||||
key: '1',
|
||||
columns: {
|
||||
id: {
|
||||
value: '1',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
resetMethod,
|
||||
{},
|
||||
);
|
||||
},
|
||||
]),
|
||||
};
|
||||
|
||||
expect(datas).toEqual({});
|
||||
expect(rows).toEqual([]);
|
||||
// $FlowFixMe persistedStateReducer exists for createTablePlugin
|
||||
const {rows, datas} = tablePlugin.persistedStateReducer(ps, resetMethod, {});
|
||||
|
||||
expect(datas.toJSON()).toEqual({});
|
||||
expect(rows.size).toBe(0);
|
||||
});
|
||||
|
||||
test('persistedStateReducer is adding data', () => {
|
||||
@@ -56,14 +69,11 @@ test('persistedStateReducer is adding data', () => {
|
||||
|
||||
// $FlowFixMe persistedStateReducer exists for createTablePlugin
|
||||
const {rows, datas} = tablePlugin.persistedStateReducer(
|
||||
{
|
||||
datas: {},
|
||||
rows: [],
|
||||
},
|
||||
tablePlugin.defaultPersistedState,
|
||||
method,
|
||||
{id},
|
||||
);
|
||||
|
||||
expect(rows.length).toBe(1);
|
||||
expect(Object.keys(datas)).toEqual([id]);
|
||||
expect(rows.size).toBe(1);
|
||||
expect([...datas.keys()]).toEqual([id]);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user