Bug fix (trkpts were deleted during compaction)

This commit is contained in:
vdv committed 2023-02-14 20:55:20 +01:00
1 parent 1d5d158f8c
commit c4b2fa175d
6 files changed
+163 -63

No files matched your search

+30
View File
@@ -6,6 +6,9 @@ import PouchDB from 'pouchdb';
import { getRte, putNewRte, putRte } from './rte';
import { put } from './lib';
import { emptyWpt } from './wpt';
import { sleep } from '../lib/async-wait';
import { debounce, memoize, property, wrap } from 'lodash';
import memoizee from 'memoizee';
const test = it;
const jest = vi;
@@ -136,4 +139,31 @@ describe('The rte module with a real db', () => {
await put(idRtept, 'rtept', () => rtept3, emptyWpt);
expect(await getRte({ id: idRte })).toEqual(rte1);
});
// it('debounces correctly by param ', async () => {
// let values = [0, 1, 2, 3, 4, 5];
// const decrement = (params: any) => {
// const { id } = params;
// //await sleep(1);
// values[2] = values[2] - 1;
// };
// const debounceByParam = (targetFunc, resolver, ...debounceParams) =>
// wrap(
// memoize(() => debounce(targetFunc, ...debounceParams), resolver),
// (getMemoizedFunc, ...params) => getMemoizedFunc(...params)(...params)
// );
// const debouncedDecrement = debounce(decrement, 100);
// debouncedDecrement({ id: 2 });
// debouncedDecrement({ id: 2 });
// debouncedDecrement({ id: 5 });
// debouncedDecrement({ id: 2 });
// debouncedDecrement({ id: 5 });
// debouncedDecrement({ id: 2 });
// debouncedDecrement({ id: 2 });
// debouncedDecrement({ id: 2 });
// await sleep(2000);
// expect(values).toEqual([0, 1, 1, 3, 4, 4]);
// });
});
+20 -14
View File
@@ -34,7 +34,8 @@ export const putNewRte = async (id?: IdRte | IdGpx) => {
};
// See https://stackoverflow.com/questions/28787436/debounce-a-function-with-argument
const debounceByParam = (
export const debounceByParam = (
targetFunc: (params: any) => any,
resolver: (params: any) => any,
...debounceParams: any
@@ -44,20 +45,25 @@ const debounceByParam = (
(getMemoizedFunc, ...params) => getMemoizedFunc(...params)(...params)
);
const compactRteOrTrkseg = (params: any) => {
export const compactRteOrTrkseg = async (params: any) => {
const { getDocs } = params;
getDocs(params).then(({ docs }) => {
if (docs.rows.length > 1) {
const compactedDocs = docs.rows.map((row: any) => {
if (['rte', 'trkseg'].includes(row.doc.type)) {
return row.doc;
}
return { ...row.doc, doc: undefined, _deleted: true };
});
db.bulkDocs(compactedDocs);
console.log({ caller: 'compactRteOrTrkseg', params, compactedDocs });
}
});
const { docs, rte, trkseg } = await getDocs(params);
if (docs.rows.length > 1) {
const compactedDocs = docs.rows.map((row: any) => {
if (['rte', 'trkseg'].includes(row.doc.type)) {
return { ...row.doc, doc: rte || trkseg };
}
return { ...row.doc, doc: undefined, _deleted: true };
});
console.log({
caller: 'compactRteOrTrkseg',
params,
compactedDocs,
firstDoc: compactedDocs[0].doc,
firstDocWpt: compactedDocs[0].doc.trkpt[0],
});
await db.bulkDocs(compactedDocs);
}
};
export const compactRteOrTrksegDebounced = debounceByParam(
+65 -1
View File
@@ -3,11 +3,13 @@ import shell from 'shelljs';
import PouchDB from 'pouchdb';
import { appendTrkpt, getTrkseg, putTrkseg } from './trkseg';
import { appendTrkpt, getTrkseg, getTrksegDocs, putTrkseg } from './trkseg';
import getUri from '../lib/ids';
import { put } from './lib';
import { emptyWpt } from './wpt';
import { compactRteOrTrkseg } from './rte';
import { sleep } from '../lib/async-wait';
const test = it;
const jest = vi;
@@ -125,4 +127,66 @@ describe('The trkseg module with a real db', () => {
});
expect(await getTrkseg({ id: idTrkseg })).toEqual(trkseg1);
});
it('can compact external trkpts after existing internal trkpts', async () => {
const idTrkseg = 'gpx/4320836036089189/3trk/000000/000000';
const idTrksegpt = 'gpx/4320836036089189/3trk/000000/000000/000035';
const trkpt3: Wpt = {
$: { lat: 3, lon: 3 },
};
const trkseg0: Trkseg = {
trkpt: [
{
$: { lat: 1, lon: 1 },
},
{
$: { lat: 2, lon: 2 },
},
],
};
const trkseg1: Trkseg = {
trkpt: [
{
$: { lat: 1, lon: 1 },
},
{
$: { lat: 2, lon: 2 },
},
trkpt3,
],
};
const trksegPut = await putTrkseg(idTrkseg, trkseg0);
await put(idTrksegpt, 'trkpt', () => trkpt3, emptyWpt);
expect(await getTrkseg({ id: idTrkseg })).toEqual(trkseg1);
compactRteOrTrkseg({ id: idTrkseg, getDocs: getTrksegDocs });
expect(await getTrkseg({ id: idTrkseg })).toEqual(trkseg1);
});
it('can compact external trkpts without existing internal trkpts', async () => {
const idTrkseg = 'gpx/4320836036089189/3trk/000000/000000';
const idTrksegpt1 = 'gpx/4320836036089189/3trk/000000/000000/000035';
const idTrksegpt2 = 'gpx/4320836036089189/3trk/000000/000000/000036';
const trkpt1 = {
$: { lat: 1, lon: 1 },
};
const trkpt2 = {
$: { lat: 2, lon: 2 },
};
const trkseg0: Trkseg = {};
const trkseg1: Trkseg = {
trkpt: [trkpt1, trkpt2],
};
const trksegPut = await putTrkseg(idTrkseg, trkseg0);
await put(idTrksegpt1, 'trkpt', () => trkpt1, emptyWpt);
await put(idTrksegpt2, 'trkpt', () => trkpt2, emptyWpt);
const { trkseg, docs } = await getTrksegDocs({ id: idTrkseg });
expect(trkseg).toEqual(trkseg1);
expect(docs.rows.length).toEqual(3);
await compactRteOrTrkseg({ id: idTrkseg, getDocs: getTrksegDocs });
//await sleep(5000);
const { trkseg: trksegx, docs: docsx } = await getTrksegDocs({
id: idTrkseg,
});
expect(trksegx).toEqual(trkseg1);
expect(docsx.rows.length).toEqual(1);
});
});
+7 -7
View File
@@ -30,13 +30,13 @@ export const getTrksegDocs: ({
trkseg.trkpt.push(row.doc.doc);
});
}
// console.log({
// caller: 'getRteDocs',
// id,
// docs,
// nbRteptIn: docs.rows[0].doc.doc.rtept?.length,
// nbRteptTotal: rte?.rtept?.length,
// });
console.log({
caller: 'getTrksegDocs',
id,
docs,
nbWptIn: docs.rows[0].doc.doc.trkpt?.length,
nbWptTotal: trkseg?.trkpt?.length,
});
return { docs, trkseg };
};