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:
Timur Valiev
2019-07-23 07:57:00 -07:00
committed by Facebook Github Bot
parent d3658f7d31
commit 294d158869
2 changed files with 70 additions and 62 deletions

View File

@@ -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]);
});