Bug fix (trkpts were deleted during compaction)

This commit is contained in:
Eric van der Vlist 2023-02-14 20:55:20 +01:00
parent 1d5d158f8c
commit c4b2fa175d
6 changed files with 163 additions and 63 deletions

76
package-lock.json generated
View File

@ -38,7 +38,7 @@
"pouchdb-adapter-indexeddb": "^8.0.1", "pouchdb-adapter-indexeddb": "^8.0.1",
"pouchdb-browser": "^8.0.1", "pouchdb-browser": "^8.0.1",
"proj4": "^2.8.1", "proj4": "^2.8.1",
"solid-js": "^1.6.10", "solid-js": "^1.6.11",
"vite-plugin-solid-svg": "^0.6.0" "vite-plugin-solid-svg": "^0.6.0"
}, },
"devDependencies": { "devDependencies": {
@ -50,7 +50,7 @@
"@types/pouchdb": "^6.4.0", "@types/pouchdb": "^6.4.0",
"@types/proj4": "^2.5.2", "@types/proj4": "^2.5.2",
"@types/shelljs": "^0.8.11", "@types/shelljs": "^0.8.11",
"@vitest/ui": "^0.28.4", "@vitest/ui": "^0.28.5",
"jsdom": "^21.1.0", "jsdom": "^21.1.0",
"license-checker": "^25.0.1", "license-checker": "^25.0.1",
"license-compatibility-checker": "^0.3.5", "license-compatibility-checker": "^0.3.5",
@ -59,7 +59,7 @@
"typescript": "^4.9.5", "typescript": "^4.9.5",
"vite": ">=4.1.1", "vite": ">=4.1.1",
"vite-plugin-solid": "^2.5.0", "vite-plugin-solid": "^2.5.0",
"vitest": "^0.28.4" "vitest": "^0.28.5"
} }
}, },
"node_modules/@adobe/css-tools": { "node_modules/@adobe/css-tools": {
@ -2247,40 +2247,40 @@
"dev": true "dev": true
}, },
"node_modules/@vitest/expect": { "node_modules/@vitest/expect": {
"version": "0.28.4", "version": "0.28.5",
"resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.28.4.tgz", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.28.5.tgz",
"integrity": "sha512-JqK0NZ4brjvOSL8hXAnIsfi+jxDF7rH/ZWCGCt0FAqRnVFc1hXsfwXksQvEnKqD84avRt3gmeXoK4tNbmkoVsQ==", "integrity": "sha512-gqTZwoUTwepwGIatnw4UKpQfnoyV0Z9Czn9+Lo2/jLIt4/AXLTn+oVZxlQ7Ng8bzcNkR+3DqLJ08kNr8jRmdNQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@vitest/spy": "0.28.4", "@vitest/spy": "0.28.5",
"@vitest/utils": "0.28.4", "@vitest/utils": "0.28.5",
"chai": "^4.3.7" "chai": "^4.3.7"
} }
}, },
"node_modules/@vitest/runner": { "node_modules/@vitest/runner": {
"version": "0.28.4", "version": "0.28.5",
"resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.28.4.tgz", "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.28.5.tgz",
"integrity": "sha512-Q8UV6GjDvBSTfUoq0QXVCNpNOUrWu4P2qvRq7ssJWzn0+S0ojbVOxEjMt+8a32X6SdkhF8ak+2nkppsqV0JyNQ==", "integrity": "sha512-NKkHtLB+FGjpp5KmneQjTcPLWPTDfB7ie+MmF1PnUBf/tGe2OjGxWyB62ySYZ25EYp9krR5Bw0YPLS/VWh1QiA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@vitest/utils": "0.28.4", "@vitest/utils": "0.28.5",
"p-limit": "^4.0.0", "p-limit": "^4.0.0",
"pathe": "^1.1.0" "pathe": "^1.1.0"
} }
}, },
"node_modules/@vitest/spy": { "node_modules/@vitest/spy": {
"version": "0.28.4", "version": "0.28.5",
"resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.28.4.tgz", "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.28.5.tgz",
"integrity": "sha512-8WuhfXLlvCXpNXEGJW6Gc+IKWI32435fQJLh43u70HnZ1otJOa2Cmg2Wy2Aym47ZnNCP4NolF+8cUPwd0MigKQ==", "integrity": "sha512-7if6rsHQr9zbmvxN7h+gGh2L9eIIErgf8nSKYDlg07HHimCxp4H6I/X/DPXktVPPLQfiZ1Cw2cbDIx9fSqDjGw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"tinyspy": "^1.0.2" "tinyspy": "^1.0.2"
} }
}, },
"node_modules/@vitest/ui": { "node_modules/@vitest/ui": {
"version": "0.28.4", "version": "0.28.5",
"resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-0.28.4.tgz", "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-0.28.5.tgz",
"integrity": "sha512-LQfCCFc17n49mwtraV9/NAWl2DUqJS/9ZEa3fqJjoYO+HowdseQ5jvWflpzliCyfrIAh6cXVo1bNzHnDXe0cbw==", "integrity": "sha512-hzzZzv38mH/LMFh54QEJpWFuGixZZBOD+C0fHU81d1lsvochPwNZhWJbuRJQNyZLSMZYCYW4hF6PpNQJXDHDmg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"fast-glob": "^3.2.12", "fast-glob": "^3.2.12",
@ -2291,9 +2291,9 @@
} }
}, },
"node_modules/@vitest/utils": { "node_modules/@vitest/utils": {
"version": "0.28.4", "version": "0.28.5",
"resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.28.4.tgz", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.28.5.tgz",
"integrity": "sha512-l2QztOLdc2LkR+w/lP52RGh8hW+Ul4KESmCAgVE8q737I7e7bQoAfkARKpkPJ4JQtGpwW4deqlj1732VZD7TFw==", "integrity": "sha512-UyZdYwdULlOa4LTUSwZ+Paz7nBHGTT72jKwdFSV4IjHF1xsokp+CabMdhjvVhYwkLfO88ylJT46YMilnkSARZA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"cli-truncate": "^3.1.0", "cli-truncate": "^3.1.0",
@ -7954,9 +7954,9 @@
} }
}, },
"node_modules/solid-js": { "node_modules/solid-js": {
"version": "1.6.10", "version": "1.6.11",
"resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.6.10.tgz", "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.6.11.tgz",
"integrity": "sha512-Sf0e6PQCEFkFtbPq0L+93Ua81YQOefBEbvDJ0YXT92b6Lzw0k7UvzSd2l1BbYM+yzE3UmepU1tyMDc/3nIByjA==", "integrity": "sha512-JquQQHPArGq+i2PLURxJ99Pcz2/1docpbycSio/cKSA0SeI3z5zRjy0TNcH4NRYvbOLrcini+iovXwnexKabyw==",
"dependencies": { "dependencies": {
"csstype": "^3.1.0" "csstype": "^3.1.0"
} }
@ -8385,9 +8385,9 @@
} }
}, },
"node_modules/tinyspy": { "node_modules/tinyspy": {
"version": "1.0.2", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.2.tgz", "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz",
"integrity": "sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==", "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=14.0.0" "node": ">=14.0.0"
@ -8842,9 +8842,9 @@
} }
}, },
"node_modules/vite-node": { "node_modules/vite-node": {
"version": "0.28.4", "version": "0.28.5",
"resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.28.4.tgz", "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.28.5.tgz",
"integrity": "sha512-KM0Q0uSG/xHHKOJvVHc5xDBabgt0l70y7/lWTR7Q0pR5/MrYxadT+y32cJOE65FfjGmJgxpVEEY+69btJgcXOQ==", "integrity": "sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"cac": "^6.7.14", "cac": "^6.7.14",
@ -9277,18 +9277,18 @@
} }
}, },
"node_modules/vitest": { "node_modules/vitest": {
"version": "0.28.4", "version": "0.28.5",
"resolved": "https://registry.npmjs.org/vitest/-/vitest-0.28.4.tgz", "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.28.5.tgz",
"integrity": "sha512-sfWIy0AdlbyGRhunm+TLQEJrFH9XuRPdApfubsyLcDbCRrUX717BRQKInTgzEfyl2Ipi1HWoHB84Nqtcwxogcg==", "integrity": "sha512-pyCQ+wcAOX7mKMcBNkzDwEHRGqQvHUl0XnoHR+3Pb1hytAHISgSxv9h0gUiSiYtISXUU3rMrKiKzFYDrI6ZIHA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/chai": "^4.3.4", "@types/chai": "^4.3.4",
"@types/chai-subset": "^1.3.3", "@types/chai-subset": "^1.3.3",
"@types/node": "*", "@types/node": "*",
"@vitest/expect": "0.28.4", "@vitest/expect": "0.28.5",
"@vitest/runner": "0.28.4", "@vitest/runner": "0.28.5",
"@vitest/spy": "0.28.4", "@vitest/spy": "0.28.5",
"@vitest/utils": "0.28.4", "@vitest/utils": "0.28.5",
"acorn": "^8.8.1", "acorn": "^8.8.1",
"acorn-walk": "^8.2.0", "acorn-walk": "^8.2.0",
"cac": "^6.7.14", "cac": "^6.7.14",
@ -9304,7 +9304,7 @@
"tinypool": "^0.3.1", "tinypool": "^0.3.1",
"tinyspy": "^1.0.2", "tinyspy": "^1.0.2",
"vite": "^3.0.0 || ^4.0.0", "vite": "^3.0.0 || ^4.0.0",
"vite-node": "0.28.4", "vite-node": "0.28.5",
"why-is-node-running": "^2.2.2" "why-is-node-running": "^2.2.2"
}, },
"bin": { "bin": {

View File

@ -21,7 +21,7 @@
"@types/pouchdb": "^6.4.0", "@types/pouchdb": "^6.4.0",
"@types/proj4": "^2.5.2", "@types/proj4": "^2.5.2",
"@types/shelljs": "^0.8.11", "@types/shelljs": "^0.8.11",
"@vitest/ui": "^0.28.4", "@vitest/ui": "^0.28.5",
"jsdom": "^21.1.0", "jsdom": "^21.1.0",
"license-checker": "^25.0.1", "license-checker": "^25.0.1",
"license-compatibility-checker": "^0.3.5", "license-compatibility-checker": "^0.3.5",
@ -30,7 +30,7 @@
"typescript": "^4.9.5", "typescript": "^4.9.5",
"vite": ">=4.1.1", "vite": ">=4.1.1",
"vite-plugin-solid": "^2.5.0", "vite-plugin-solid": "^2.5.0",
"vitest": "^0.28.4" "vitest": "^0.28.5"
}, },
"dependencies": { "dependencies": {
"@awesome-cordova-plugins/android-full-screen": "^6.3.0", "@awesome-cordova-plugins/android-full-screen": "^6.3.0",
@ -61,7 +61,7 @@
"pouchdb-adapter-indexeddb": "^8.0.1", "pouchdb-adapter-indexeddb": "^8.0.1",
"pouchdb-browser": "^8.0.1", "pouchdb-browser": "^8.0.1",
"proj4": "^2.8.1", "proj4": "^2.8.1",
"solid-js": "^1.6.10", "solid-js": "^1.6.11",
"vite-plugin-solid-svg": "^0.6.0" "vite-plugin-solid-svg": "^0.6.0"
} }
} }

View File

@ -6,6 +6,9 @@ import PouchDB from 'pouchdb';
import { getRte, putNewRte, putRte } from './rte'; import { getRte, putNewRte, putRte } from './rte';
import { put } from './lib'; import { put } from './lib';
import { emptyWpt } from './wpt'; 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 test = it;
const jest = vi; const jest = vi;
@ -136,4 +139,31 @@ describe('The rte module with a real db', () => {
await put(idRtept, 'rtept', () => rtept3, emptyWpt); await put(idRtept, 'rtept', () => rtept3, emptyWpt);
expect(await getRte({ id: idRte })).toEqual(rte1); 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]);
// });
}); });

View File

@ -34,7 +34,8 @@ export const putNewRte = async (id?: IdRte | IdGpx) => {
}; };
// See https://stackoverflow.com/questions/28787436/debounce-a-function-with-argument // See https://stackoverflow.com/questions/28787436/debounce-a-function-with-argument
const debounceByParam = (
export const debounceByParam = (
targetFunc: (params: any) => any, targetFunc: (params: any) => any,
resolver: (params: any) => any, resolver: (params: any) => any,
...debounceParams: any ...debounceParams: any
@ -44,20 +45,25 @@ const debounceByParam = (
(getMemoizedFunc, ...params) => getMemoizedFunc(...params)(...params) (getMemoizedFunc, ...params) => getMemoizedFunc(...params)(...params)
); );
const compactRteOrTrkseg = (params: any) => { export const compactRteOrTrkseg = async (params: any) => {
const { getDocs } = params; const { getDocs } = params;
getDocs(params).then(({ docs }) => { const { docs, rte, trkseg } = await getDocs(params);
if (docs.rows.length > 1) { if (docs.rows.length > 1) {
const compactedDocs = docs.rows.map((row: any) => { const compactedDocs = docs.rows.map((row: any) => {
if (['rte', 'trkseg'].includes(row.doc.type)) { if (['rte', 'trkseg'].includes(row.doc.type)) {
return row.doc; return { ...row.doc, doc: rte || trkseg };
} }
return { ...row.doc, doc: undefined, _deleted: true }; return { ...row.doc, doc: undefined, _deleted: true };
}); });
db.bulkDocs(compactedDocs); console.log({
console.log({ caller: 'compactRteOrTrkseg', params, compactedDocs }); caller: 'compactRteOrTrkseg',
} params,
}); compactedDocs,
firstDoc: compactedDocs[0].doc,
firstDocWpt: compactedDocs[0].doc.trkpt[0],
});
await db.bulkDocs(compactedDocs);
}
}; };
export const compactRteOrTrksegDebounced = debounceByParam( export const compactRteOrTrksegDebounced = debounceByParam(

View File

@ -3,11 +3,13 @@ import shell from 'shelljs';
import PouchDB from 'pouchdb'; import PouchDB from 'pouchdb';
import { appendTrkpt, getTrkseg, putTrkseg } from './trkseg'; import { appendTrkpt, getTrkseg, getTrksegDocs, putTrkseg } from './trkseg';
import getUri from '../lib/ids'; import getUri from '../lib/ids';
import { put } from './lib'; import { put } from './lib';
import { emptyWpt } from './wpt'; import { emptyWpt } from './wpt';
import { compactRteOrTrkseg } from './rte';
import { sleep } from '../lib/async-wait';
const test = it; const test = it;
const jest = vi; const jest = vi;
@ -125,4 +127,66 @@ describe('The trkseg module with a real db', () => {
}); });
expect(await getTrkseg({ id: idTrkseg })).toEqual(trkseg1); 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);
});
}); });

View File

@ -30,13 +30,13 @@ export const getTrksegDocs: ({
trkseg.trkpt.push(row.doc.doc); trkseg.trkpt.push(row.doc.doc);
}); });
} }
// console.log({ console.log({
// caller: 'getRteDocs', caller: 'getTrksegDocs',
// id, id,
// docs, docs,
// nbRteptIn: docs.rows[0].doc.doc.rtept?.length, nbWptIn: docs.rows[0].doc.doc.trkpt?.length,
// nbRteptTotal: rte?.rtept?.length, nbWptTotal: trkseg?.trkpt?.length,
// }); });
return { docs, trkseg }; return { docs, trkseg };
}; };