Skip to content

Commit ab92ead

Browse files
committed
[sqlite] Some saveTable refactoring 3
1 parent 90f0b7a commit ab92ead

File tree

3 files changed

+53
-67
lines changed

3 files changed

+53
-67
lines changed

src/persisters/sqlite/commands.ts

Lines changed: 33 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import {
1616
objIsEmpty,
1717
objMap,
1818
objNew,
19+
objValues,
1920
} from '../../common/obj';
20-
import {Row, Table, Values} from '../../types/store';
2121
import {SINGLE_ROW_ID, escapeId} from './common';
2222
import {
2323
arrayFilter,
@@ -31,6 +31,7 @@ import {collDel, collHas, collValues} from '../../common/coll';
3131
import {isUndefined, promiseAll} from '../../common/other';
3232
import {setAdd, setNew} from '../../common/set';
3333
import {Id} from '../../types/common';
34+
import {Table} from '../../types/store';
3435

3536
export type Cmd = (sql: string, args?: any[]) => Promise<IdObj<any>[]>;
3637
type Schema = IdMap2<string>;
@@ -48,18 +49,7 @@ export const getCommandFunctions = (
4849
tableName: string,
4950
rowIdColumnName: string,
5051
) => Promise<IdObj<any> | null>,
51-
saveSingleRowTable: (
52-
table: string,
53-
rowIdColumnName: string,
54-
rowId: Id,
55-
row: Row | Values,
56-
) => Promise<void>,
5752
loadTable: (tableName: string, rowIdColumnName: string) => Promise<Table>,
58-
savePartialTable: (
59-
tableName: string,
60-
rowIdColumnName: string,
61-
table: Table,
62-
) => Promise<void>,
6353
saveTable: (
6454
tableName: string,
6555
rowIdColumnName: string,
@@ -139,14 +129,6 @@ export const getCommandFunctions = (
139129
return arrayIsEmpty(rows) ? null : objDel(rows[0], rowIdColumnName);
140130
};
141131

142-
const saveSingleRowTable = async (
143-
tableName: string,
144-
rowIdColumnName: string,
145-
rowId: Id,
146-
row: Row | Values,
147-
): Promise<void> =>
148-
await saveTable(tableName, rowIdColumnName, {[rowId]: row}, true, true);
149-
150132
const loadTable = async (
151133
tableName: string,
152134
rowIdColumnName: string,
@@ -166,13 +148,6 @@ export const getCommandFunctions = (
166148
)
167149
: {};
168150

169-
const savePartialTable = async (
170-
tableName: string,
171-
rowIdColumnName: string,
172-
table: Table,
173-
): Promise<void> =>
174-
await saveTable(tableName, rowIdColumnName, table, false, false, true);
175-
176151
const saveTable = async (
177152
tableName: string,
178153
rowIdColumnName: string,
@@ -249,24 +224,39 @@ export const getCommandFunctions = (
249224

250225
// Insert or update or delete data
251226
if (!arrayIsEmpty(tableColumnNames)) {
252-
const args: any[] = [];
253-
const deleteRowIds: string[] = [];
254-
const changingColumnNames = partial
255-
? tableColumnNames
256-
: arrayFilter(
257-
mapKeys(mapGet(schemaMap, tableName)),
258-
(columnName) => columnName != rowIdColumnName,
227+
if (partial) {
228+
await promiseAll(
229+
objMap(
230+
table,
231+
async (row, rowId) =>
232+
await upsert(cmd, tableName, rowIdColumnName, objIds(row), [
233+
rowId,
234+
...objValues(row),
235+
]),
236+
),
237+
);
238+
} else {
239+
const changingColumnNames = arrayFilter(
240+
mapKeys(mapGet(schemaMap, tableName)),
241+
(columnName) => columnName != rowIdColumnName,
242+
);
243+
const args: any[] = [];
244+
const deleteRowIds: string[] = [];
245+
objMap(table, (row, rowId) => {
246+
arrayPush(
247+
args,
248+
rowId,
249+
...arrayMap(changingColumnNames, (cellId) => row[cellId]),
259250
);
260-
objMap(table, (row, rowId) => {
261-
arrayPush(
251+
arrayPush(deleteRowIds, rowId);
252+
});
253+
await upsert(
254+
cmd,
255+
tableName,
256+
rowIdColumnName,
257+
changingColumnNames,
262258
args,
263-
rowId,
264-
...arrayMap(changingColumnNames, (cellId) => row[cellId]),
265259
);
266-
arrayPush(deleteRowIds, rowId);
267-
});
268-
await upsert(cmd, tableName, rowIdColumnName, changingColumnNames, args);
269-
if (!partial) {
270260
await cmd(
271261
'DELETE FROM' +
272262
escapeId(tableName) +
@@ -283,14 +273,7 @@ export const getCommandFunctions = (
283273
}
284274
};
285275

286-
return [
287-
refreshSchema,
288-
loadSingleRowTable,
289-
saveSingleRowTable,
290-
loadTable,
291-
savePartialTable,
292-
saveTable,
293-
];
276+
return [refreshSchema, loadSingleRowTable, loadTable, saveTable];
294277
};
295278

296279
const upsert = async (

src/persisters/sqlite/json.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ export const createJsonSqlitePersister = <ListeningHandle>(
1616
[storeTableName]: DefaultedJsonConfig,
1717
managedTableNames: string[],
1818
): Persister => {
19-
const [refreshSchema, loadSingleRowTable, saveSingleRowTable] =
20-
getCommandFunctions(cmd, managedTableNames);
19+
const [refreshSchema, loadSingleRowTable, , saveTable] = getCommandFunctions(
20+
cmd,
21+
managedTableNames,
22+
);
2123

2224
const getPersisted = async (): Promise<[Tables, Values]> => {
2325
await refreshSchema();
@@ -31,11 +33,14 @@ export const createJsonSqlitePersister = <ListeningHandle>(
3133
getContent: () => [Tables, Values],
3234
): Promise<void> =>
3335
persister.schedule(refreshSchema, async () => {
34-
await saveSingleRowTable(
36+
await saveTable(
3537
storeTableName,
3638
DEFAULT_ROW_ID_COLUMN_NAME,
37-
SINGLE_ROW_ID,
38-
{[STORE_COLUMN]: jsonString(getContent())},
39+
{
40+
[SINGLE_ROW_ID]: {[STORE_COLUMN]: jsonString(getContent())},
41+
},
42+
true,
43+
true,
3944
);
4045
});
4146

src/persisters/sqlite/tabular.ts

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,8 @@ export const createTabularSqlitePersister = <ListeningHandle>(
2121
]: DefaultedTabularConfig,
2222
managedTableNames: string[],
2323
): Persister => {
24-
const [
25-
refreshSchema,
26-
loadSingleRowTable,
27-
saveSingleRowTable,
28-
loadTable,
29-
,
30-
saveTable,
31-
] = getCommandFunctions(cmd, managedTableNames);
24+
const [refreshSchema, loadSingleRowTable, loadTable, saveTable] =
25+
getCommandFunctions(cmd, managedTableNames);
3226

3327
const saveTables = async (tables: Tables) =>
3428
await promiseAll(
@@ -50,11 +44,12 @@ export const createTabularSqlitePersister = <ListeningHandle>(
5044

5145
const saveValues = async (values: Values) =>
5246
valuesSave
53-
? await saveSingleRowTable(
47+
? await saveTable(
5448
valuesTableName,
5549
DEFAULT_ROW_ID_COLUMN_NAME,
56-
SINGLE_ROW_ID,
57-
values,
50+
{[SINGLE_ROW_ID]: values},
51+
true,
52+
true,
5853
)
5954
: null;
6055

@@ -90,9 +85,12 @@ export const createTabularSqlitePersister = <ListeningHandle>(
9085

9186
const setPersisted = async (
9287
getContent: () => [Tables, Values],
93-
_getTransactionChanges?: GetTransactionChanges,
88+
getTransactionChanges?: GetTransactionChanges,
9489
): Promise<void> => {
9590
await refreshSchema();
91+
if (!isUndefined(getTransactionChanges)) {
92+
// const [cellChanges, valueChanges] = getTransactionChanges();
93+
}
9694
const [tables, values] = getContent();
9795
await saveTables(tables);
9896
await saveValues(values);

0 commit comments

Comments
 (0)