Bug fix (trkpts were deleted during compaction)
This commit is contained in:
1 parent
1d5d158f8c
commit
c4b2fa175d
6 files changed
+163
-63
No files matched your search
@@ -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
@@ -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
@@ -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
@@ -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 };
|
||||
};
|
||||
|
||||
|
||||
Reference in new issue
Block a user