@mailwoman/resolver-wof-sqlite 8.1.0 → 8.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/address-point-interpolation.ts +9 -3
- package/address-point-schema.ts +32 -10
- package/address-point.ts +3 -0
- package/ancestry-backfill.ts +18 -5
- package/ancestry.ts +7 -2
- package/build-candidate.ts +29 -6
- package/build-slim.ts +40 -11
- package/candidate-fts.ts +1 -0
- package/candidate-lookup.ts +36 -14
- package/candidate-schema.ts +35 -11
- package/coincident-roles.ts +28 -6
- package/convention.ts +3 -1
- package/coverage-manifest-schema.ts +49 -16
- package/fst-autocomplete.ts +15 -9
- package/fst-builder.ts +29 -5
- package/fst-deserialize-web.ts +46 -9
- package/fst-matcher.ts +12 -5
- package/fst-serialize.ts +83 -9
- package/fst-types.ts +26 -3
- package/fts-query.ts +84 -0
- package/fts.ts +35 -9
- package/geo.ts +9 -3
- package/geonames-aliases.ts +116 -79
- package/geonames-postal.ts +25 -5
- package/index.ts +10 -0
- package/interpolation.ts +33 -55
- package/lookup.ts +103 -292
- package/name-score.ts +76 -0
- package/out/address-point-interpolation.d.ts.map +1 -1
- package/out/address-point-interpolation.js +4 -2
- package/out/address-point-interpolation.js.map +1 -1
- package/out/address-point-schema.d.ts +30 -10
- package/out/address-point-schema.d.ts.map +1 -1
- package/out/address-point-schema.js +6 -2
- package/out/address-point-schema.js.map +1 -1
- package/out/address-point.d.ts.map +1 -1
- package/out/address-point.js.map +1 -1
- package/out/ancestry-backfill.d.ts +6 -2
- package/out/ancestry-backfill.d.ts.map +1 -1
- package/out/ancestry-backfill.js +7 -3
- package/out/ancestry-backfill.js.map +1 -1
- package/out/ancestry.d.ts +6 -2
- package/out/ancestry.d.ts.map +1 -1
- package/out/ancestry.js +3 -1
- package/out/ancestry.js.map +1 -1
- package/out/build-candidate.d.ts +9 -3
- package/out/build-candidate.d.ts.map +1 -1
- package/out/build-candidate.js +5 -3
- package/out/build-candidate.js.map +1 -1
- package/out/build-slim.d.ts +15 -5
- package/out/build-slim.d.ts.map +1 -1
- package/out/build-slim.js +11 -5
- package/out/build-slim.js.map +1 -1
- package/out/candidate-fts.d.ts.map +1 -1
- package/out/candidate-fts.js.map +1 -1
- package/out/candidate-lookup.d.ts +9 -3
- package/out/candidate-lookup.d.ts.map +1 -1
- package/out/candidate-lookup.js +16 -11
- package/out/candidate-lookup.js.map +1 -1
- package/out/candidate-schema.d.ts +33 -11
- package/out/candidate-schema.d.ts.map +1 -1
- package/out/candidate-schema.js.map +1 -1
- package/out/coincident-roles.d.ts +16 -4
- package/out/coincident-roles.d.ts.map +1 -1
- package/out/coincident-roles.js +9 -3
- package/out/coincident-roles.js.map +1 -1
- package/out/convention.d.ts +3 -1
- package/out/convention.d.ts.map +1 -1
- package/out/convention.js.map +1 -1
- package/out/coverage-manifest-schema.d.ts +45 -14
- package/out/coverage-manifest-schema.d.ts.map +1 -1
- package/out/coverage-manifest-schema.js +14 -5
- package/out/coverage-manifest-schema.js.map +1 -1
- package/out/fst-autocomplete.d.ts +1 -1
- package/out/fst-autocomplete.d.ts.map +1 -1
- package/out/fst-autocomplete.js +11 -9
- package/out/fst-autocomplete.js.map +1 -1
- package/out/fst-builder.d.ts.map +1 -1
- package/out/fst-builder.js +15 -5
- package/out/fst-builder.js.map +1 -1
- package/out/fst-deserialize-web.d.ts.map +1 -1
- package/out/fst-deserialize-web.js +34 -9
- package/out/fst-deserialize-web.js.map +1 -1
- package/out/fst-matcher.d.ts +6 -2
- package/out/fst-matcher.d.ts.map +1 -1
- package/out/fst-matcher.js +9 -5
- package/out/fst-matcher.js.map +1 -1
- package/out/fst-serialize.d.ts.map +1 -1
- package/out/fst-serialize.js +62 -9
- package/out/fst-serialize.js.map +1 -1
- package/out/fst-types.d.ts +26 -3
- package/out/fst-types.d.ts.map +1 -1
- package/out/fts-query.d.ts +41 -0
- package/out/fts-query.d.ts.map +1 -0
- package/out/fts-query.js +75 -0
- package/out/fts-query.js.map +1 -0
- package/out/fts.d.ts +21 -7
- package/out/fts.d.ts.map +1 -1
- package/out/fts.js +10 -4
- package/out/fts.js.map +1 -1
- package/out/geo.d.ts +6 -2
- package/out/geo.d.ts.map +1 -1
- package/out/geo.js +3 -1
- package/out/geo.js.map +1 -1
- package/out/geonames-aliases.d.ts +12 -4
- package/out/geonames-aliases.d.ts.map +1 -1
- package/out/geonames-aliases.js +72 -67
- package/out/geonames-aliases.js.map +1 -1
- package/out/geonames-postal.d.ts +9 -3
- package/out/geonames-postal.d.ts.map +1 -1
- package/out/geonames-postal.js +7 -2
- package/out/geonames-postal.js.map +1 -1
- package/out/index.d.ts.map +1 -1
- package/out/index.js.map +1 -1
- package/out/interpolation.d.ts +18 -6
- package/out/interpolation.d.ts.map +1 -1
- package/out/interpolation.js +11 -40
- package/out/interpolation.js.map +1 -1
- package/out/lookup.d.ts +3 -97
- package/out/lookup.d.ts.map +1 -1
- package/out/lookup.js +52 -184
- package/out/lookup.js.map +1 -1
- package/out/name-score.d.ts +28 -0
- package/out/name-score.d.ts.map +1 -0
- package/out/name-score.js +67 -0
- package/out/name-score.js.map +1 -0
- package/out/poi-lookup.d.ts +24 -8
- package/out/poi-lookup.d.ts.map +1 -1
- package/out/poi-lookup.js +27 -13
- package/out/poi-lookup.js.map +1 -1
- package/out/poi-schema.d.ts +42 -13
- package/out/poi-schema.d.ts.map +1 -1
- package/out/poi-schema.js +12 -3
- package/out/poi-schema.js.map +1 -1
- package/out/postal-city-alias-lookup.d.ts +18 -6
- package/out/postal-city-alias-lookup.d.ts.map +1 -1
- package/out/postal-city-alias-lookup.js.map +1 -1
- package/out/postal-city-alias-schema.d.ts +27 -9
- package/out/postal-city-alias-schema.d.ts.map +1 -1
- package/out/postal-city-alias-schema.js +3 -1
- package/out/postal-city-alias-schema.js.map +1 -1
- package/out/postal-city-candidate-schema.d.ts +15 -5
- package/out/postal-city-candidate-schema.d.ts.map +1 -1
- package/out/postal-city-candidate-schema.js +3 -1
- package/out/postal-city-candidate-schema.js.map +1 -1
- package/out/postcode-point-lookup.d.ts +6 -2
- package/out/postcode-point-lookup.d.ts.map +1 -1
- package/out/postcode-point-lookup.js +6 -2
- package/out/postcode-point-lookup.js.map +1 -1
- package/out/ranking-weights.d.ts +118 -0
- package/out/ranking-weights.d.ts.map +1 -0
- package/out/ranking-weights.js +44 -0
- package/out/ranking-weights.js.map +1 -0
- package/out/reverse.d.ts +9 -3
- package/out/reverse.d.ts.map +1 -1
- package/out/reverse.js +20 -6
- package/out/reverse.js.map +1 -1
- package/out/sharding.d.ts +3 -1
- package/out/sharding.d.ts.map +1 -1
- package/out/sharding.js +7 -5
- package/out/sharding.js.map +1 -1
- package/out/sqlite-convention-source.d.ts.map +1 -1
- package/out/sqlite-convention-source.js +3 -1
- package/out/sqlite-convention-source.js.map +1 -1
- package/out/street-centroid-schema.d.ts +33 -11
- package/out/street-centroid-schema.d.ts.map +1 -1
- package/out/street-centroid-schema.js +3 -1
- package/out/street-centroid-schema.js.map +1 -1
- package/out/street-centroid.d.ts.map +1 -1
- package/out/street-centroid.js +6 -2
- package/out/street-centroid.js.map +1 -1
- package/out/street-morphology-fst-builder.d.ts +6 -2
- package/out/street-morphology-fst-builder.d.ts.map +1 -1
- package/out/street-morphology-fst-builder.js +8 -7
- package/out/street-morphology-fst-builder.js.map +1 -1
- package/out/street-morphology-fst-loader.d.ts +24 -8
- package/out/street-morphology-fst-loader.d.ts.map +1 -1
- package/out/street-morphology-fst-loader.js +11 -5
- package/out/street-morphology-fst-loader.js.map +1 -1
- package/out/street-name-lookup.d.ts +9 -3
- package/out/street-name-lookup.d.ts.map +1 -1
- package/out/street-name-lookup.js +9 -7
- package/out/street-name-lookup.js.map +1 -1
- package/out/street-normalize.d.ts +3 -1
- package/out/street-normalize.d.ts.map +1 -1
- package/out/street-normalize.js +23 -13
- package/out/street-normalize.js.map +1 -1
- package/out/street-segment-schema.d.ts +48 -16
- package/out/street-segment-schema.d.ts.map +1 -1
- package/out/street-segment-schema.js +6 -2
- package/out/street-segment-schema.js.map +1 -1
- package/out/types.d.ts +18 -6
- package/out/types.d.ts.map +1 -1
- package/out/unified-schema.d.ts +1 -1
- package/out/unified-schema.d.ts.map +1 -1
- package/out/unified-schema.js +2 -2
- package/out/unified-schema.js.map +1 -1
- package/package.json +5 -5
- package/poi-lookup.ts +53 -21
- package/poi-schema.ts +43 -13
- package/postal-city-alias-lookup.ts +20 -6
- package/postal-city-alias-schema.ts +28 -9
- package/postal-city-candidate-schema.ts +15 -5
- package/postcode-point-lookup.ts +6 -2
- package/ranking-weights.ts +148 -0
- package/reverse.ts +47 -10
- package/sharding.ts +13 -6
- package/sqlite-convention-source.ts +4 -1
- package/street-centroid-schema.ts +35 -11
- package/street-centroid.ts +10 -3
- package/street-morphology-fst-builder.ts +25 -9
- package/street-morphology-fst-loader.ts +26 -10
- package/street-name-lookup.ts +19 -7
- package/street-normalize.ts +28 -13
- package/street-segment-schema.ts +50 -16
- package/types.ts +18 -6
- package/unified-schema.ts +11 -2
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Soft name matching for locality ranking: case/diacritic folding, padded character trigrams, and the
|
|
7
|
+
* trigram-Jaccard score built on them. Shared by the FTS lookup and the candidate-table backend so
|
|
8
|
+
* both rank the same typo identically — the whole reason this is one module rather than two copies.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Case-fold + strip diacritics + collapse punctuation — for the coord-first soft name match.
|
|
12
|
+
*/
|
|
13
|
+
export function cfNormalize(s) {
|
|
14
|
+
return s
|
|
15
|
+
.toLowerCase()
|
|
16
|
+
.normalize("NFD")
|
|
17
|
+
.replaceAll(/[\u0300-\u036F]/g, "") // combining diacritical marks
|
|
18
|
+
.replaceAll(/[^a-z0-9]+/g, " ")
|
|
19
|
+
.trim();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Padded character-trigram set (a leading/trailing space pads short tokens).
|
|
23
|
+
*/
|
|
24
|
+
export function trigrams(s) {
|
|
25
|
+
const t = ` ${s} `;
|
|
26
|
+
const out = new Set();
|
|
27
|
+
for (let i = 0; i + 3 <= t.length; i++) {
|
|
28
|
+
out.add(t.slice(i, i + 3));
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Character-trigram Jaccard ∈ [0,1] — tolerant of the swallowed-leading-char fragments ("auen" vs "plauen") and minor
|
|
34
|
+
* misspellings without a heavyweight edit-distance pass. Shared with the candidate backend's FTS5-trigram fuzzy
|
|
35
|
+
* fallback so both lookups rank typos identically.
|
|
36
|
+
*/
|
|
37
|
+
export function trigramJaccard(a, b) {
|
|
38
|
+
const A = trigrams(a);
|
|
39
|
+
const B = trigrams(b);
|
|
40
|
+
if (!A.size || !B.size)
|
|
41
|
+
return 0;
|
|
42
|
+
let inter = 0;
|
|
43
|
+
for (const x of A)
|
|
44
|
+
if (B.has(x)) {
|
|
45
|
+
inter++;
|
|
46
|
+
}
|
|
47
|
+
return inter / (A.size + B.size - inter);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Soft name-match score ∈ [0,1]: exact (normalized) name/alias → 1, else best trigram-Jaccard.
|
|
51
|
+
*/
|
|
52
|
+
export function softNameScore(text, name, aliases) {
|
|
53
|
+
const q = cfNormalize(text);
|
|
54
|
+
if (!q)
|
|
55
|
+
return 0;
|
|
56
|
+
let best = 0;
|
|
57
|
+
for (const raw of [name, ...aliases]) {
|
|
58
|
+
const n = cfNormalize(raw);
|
|
59
|
+
if (!n)
|
|
60
|
+
continue;
|
|
61
|
+
if (n === q)
|
|
62
|
+
return 1;
|
|
63
|
+
best = Math.max(best, trigramJaccard(q, n));
|
|
64
|
+
}
|
|
65
|
+
return best;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=name-score.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"name-score.js","sourceRoot":"","sources":["../name-score.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,CAAS;IACpC,OAAO,CAAC;SACN,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,CAAC;SAChB,UAAU,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,8BAA8B;SACjE,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC;SAC9B,IAAI,EAAE,CAAA;AACT,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,CAAS;IACjC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAA;IAClB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;IAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC;IAED,OAAO,GAAG,CAAA;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACrB,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAErB,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,CAAA;IAChC,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,KAAK,MAAM,CAAC,IAAI,CAAC;QAChB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACd,KAAK,EAAE,CAAA;QACR,CAAC;IAEF,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAA;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,IAAY,EAAE,OAA0B;IACnF,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAE3B,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IAChB,IAAI,IAAI,GAAG,CAAC,CAAA;IAEZ,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;QAE1B,IAAI,CAAC,CAAC;YAAE,SAAQ;QAEhB,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,CAAA;QACrB,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED,OAAO,IAAI,CAAA;AACZ,CAAC"}
|
package/out/poi-lookup.d.ts
CHANGED
|
@@ -25,10 +25,14 @@
|
|
|
25
25
|
* it).
|
|
26
26
|
*/
|
|
27
27
|
import { DatabaseSync } from "node:sqlite";
|
|
28
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* Resolution the `poi` table's `h3_cell` column is keyed at — matches the builder (spec §3.4).
|
|
30
|
+
*/
|
|
29
31
|
export declare const POI_H3_RESOLUTION = 9;
|
|
30
32
|
export interface POISearchQuery {
|
|
31
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Poi-taxonomy category id (string side of the dictionary). Ignored when `brandWikidata` is also set — brand wins.
|
|
35
|
+
*/
|
|
32
36
|
categoryID?: string;
|
|
33
37
|
/**
|
|
34
38
|
* Fan-out category ids — the Overture `taxonomy.primary` leaves a single canonical category rolls up into (e.g.
|
|
@@ -37,11 +41,17 @@ export interface POISearchQuery {
|
|
|
37
41
|
* one-element list `[categoryID]` when this is absent). Ignored when `brandWikidata` is set — brand wins.
|
|
38
42
|
*/
|
|
39
43
|
categoryIDs?: string[];
|
|
40
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Wikidata QID for brand-exact search.
|
|
46
|
+
*/
|
|
41
47
|
brandWikidata?: string;
|
|
42
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* Free-text name (FTS5).
|
|
50
|
+
*/
|
|
43
51
|
name?: string;
|
|
44
|
-
/**
|
|
52
|
+
/**
|
|
53
|
+
* Search center. Required for category/brand queries (k-ring expansion).
|
|
54
|
+
*/
|
|
45
55
|
center?: {
|
|
46
56
|
latitude: number;
|
|
47
57
|
longitude: number;
|
|
@@ -61,14 +71,20 @@ export interface POISearchHit {
|
|
|
61
71
|
longitude: number;
|
|
62
72
|
country: string;
|
|
63
73
|
confidence: number;
|
|
64
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Overture GERS id — nullable METADATA ONLY, never a key (the #470 rule; see `POITable.gers_id`).
|
|
76
|
+
*/
|
|
65
77
|
gersID: string | null;
|
|
66
78
|
distanceM?: number;
|
|
67
79
|
}
|
|
68
80
|
export interface POILookupOpts {
|
|
69
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* Path to a `poi.db` built by the (future) POI builder. Opened read-only.
|
|
83
|
+
*/
|
|
70
84
|
databasePath?: string;
|
|
71
|
-
/**
|
|
85
|
+
/**
|
|
86
|
+
* Pre-opened handle (tests / shared connections). Mutually exclusive with `databasePath`.
|
|
87
|
+
*/
|
|
72
88
|
database?: DatabaseSync;
|
|
73
89
|
}
|
|
74
90
|
/**
|
package/out/poi-lookup.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poi-lookup.d.ts","sourceRoot":"","sources":["../poi-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAO1C
|
|
1
|
+
{"version":3,"file":"poi-lookup.d.ts","sourceRoot":"","sources":["../poi-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAO1C;;GAEG;AACH,eAAO,MAAM,iBAAiB,IAAI,CAAA;AA6BlC,MAAM,WAAW,cAAc;IAC9B;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,MAAM,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;IAChD;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC7B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAA;CACvB;AAkBD;;;;GAIG;AACH,qBAAa,SAAU,YAAW,UAAU;;gBAmB/B,IAAI,EAAE,aAAa;IAiC/B,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,EAAE;IA8J7C,KAAK,IAAI,IAAI;IAMb,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAGxB"}
|
package/out/poi-lookup.js
CHANGED
|
@@ -27,7 +27,9 @@
|
|
|
27
27
|
import { DatabaseSync } from "node:sqlite";
|
|
28
28
|
import { haversineKm, shortenH3Cell } from "@mailwoman/spatial";
|
|
29
29
|
import { gridDisk, latLngToCell } from "h3-js";
|
|
30
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* Resolution the `poi` table's `h3_cell` column is keyed at — matches the builder (spec §3.4).
|
|
32
|
+
*/
|
|
31
33
|
export const POI_H3_RESOLUTION = 9;
|
|
32
34
|
/**
|
|
33
35
|
* Ring budget default: 16 res-9 k-rings ≈ ~5.4 km (corner) / ~4.3 km worst-bearing. Category path only — the brand path
|
|
@@ -49,7 +51,9 @@ const DEFAULT_MAX_RINGS = 16;
|
|
|
49
51
|
* hit. A product bound, not a reach cap (the index already makes the fetch cheap regardless of distance).
|
|
50
52
|
*/
|
|
51
53
|
const BRAND_MAX_DISTANCE_KM = 500;
|
|
52
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* Row-count default when a query doesn't specify `limit`.
|
|
56
|
+
*/
|
|
53
57
|
const DEFAULT_LIMIT = 20;
|
|
54
58
|
/**
|
|
55
59
|
* Node reader over `poi.db`. `implements Disposable` so callers can `using lookup = new POILookup(...)` (or call
|
|
@@ -61,11 +65,17 @@ export class POILookup {
|
|
|
61
65
|
#ownsDB;
|
|
62
66
|
#categoryToID = new Map();
|
|
63
67
|
#idToCategory = new Map();
|
|
64
|
-
/**
|
|
68
|
+
/**
|
|
69
|
+
* `(h3_cell, category_id)` → the cell's category-clustered range, most-confident-first.
|
|
70
|
+
*/
|
|
65
71
|
#categoryCellProbe;
|
|
66
|
-
/**
|
|
72
|
+
/**
|
|
73
|
+
* `brand_wikidata` → ALL of a brand's rows globally (partial-index range-scan); distance-sorted in JS, not SQL.
|
|
74
|
+
*/
|
|
67
75
|
#brandProbe;
|
|
68
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* FTS5 `MATCH` over `poi_search`, returning candidate `name_key`s to hydrate.
|
|
78
|
+
*/
|
|
69
79
|
#nameFTSProbe;
|
|
70
80
|
constructor(opts) {
|
|
71
81
|
if (opts.database) {
|
|
@@ -97,7 +107,7 @@ export class POILookup {
|
|
|
97
107
|
if (query.name) {
|
|
98
108
|
return this.#searchByName(query.name, limit, query.center);
|
|
99
109
|
}
|
|
100
|
-
if (query.categoryID || (query.categoryIDs && query.categoryIDs.length
|
|
110
|
+
if (query.categoryID || (query.categoryIDs && query.categoryIDs.length) || query.brandWikidata) {
|
|
101
111
|
if (!query.center) {
|
|
102
112
|
throw new Error("POILookup.search: category/brand search requires a `center`");
|
|
103
113
|
}
|
|
@@ -123,7 +133,9 @@ export class POILookup {
|
|
|
123
133
|
.slice(0, limit)
|
|
124
134
|
.map((row) => toHit(row, this.#idToCategory, center));
|
|
125
135
|
}
|
|
126
|
-
/**
|
|
136
|
+
/**
|
|
137
|
+
* Category path: k-ring expansion from `query.center`'s res-9 cell, probing each new ring's cells.
|
|
138
|
+
*/
|
|
127
139
|
#searchKRing(query, limit) {
|
|
128
140
|
const center = query.center;
|
|
129
141
|
const maxRings = query.maxRings ?? DEFAULT_MAX_RINGS;
|
|
@@ -138,7 +150,7 @@ export class POILookup {
|
|
|
138
150
|
}
|
|
139
151
|
}
|
|
140
152
|
// No resolvable leaf (every id unknown to the dictionary) can't have rows — a clean miss, not a throw.
|
|
141
|
-
if (categoryIds.length
|
|
153
|
+
if (!categoryIds.length)
|
|
142
154
|
return [];
|
|
143
155
|
const origin = latLngToCell(center.latitude, center.longitude, POI_H3_RESOLUTION);
|
|
144
156
|
const seenCells = new Set();
|
|
@@ -184,7 +196,7 @@ export class POILookup {
|
|
|
184
196
|
seenKeys.add(hit.name_key);
|
|
185
197
|
uniqueKeys.push(hit.name_key);
|
|
186
198
|
}
|
|
187
|
-
if (uniqueKeys.length
|
|
199
|
+
if (!uniqueKeys.length)
|
|
188
200
|
return [];
|
|
189
201
|
const hydrated = this.#hydrateByNameKeys(uniqueKeys);
|
|
190
202
|
const rowsByKey = new Map();
|
|
@@ -228,12 +240,14 @@ export class POILookup {
|
|
|
228
240
|
this.close();
|
|
229
241
|
}
|
|
230
242
|
}
|
|
231
|
-
/**
|
|
243
|
+
/**
|
|
244
|
+
* `poi.h3_cell` is the SHORTENED (48-bit) cell — never the full h3-js cell string.
|
|
245
|
+
*/
|
|
232
246
|
function h3CellToInt(cell) {
|
|
233
247
|
return Number(BigInt(`0x${shortenH3Cell(cell)}`));
|
|
234
248
|
}
|
|
235
249
|
function sortByDistance(rows, center) {
|
|
236
|
-
return [...rows].
|
|
250
|
+
return [...rows].toSorted((a, b) => haversineKm(center.latitude, center.longitude, a.latitude, a.longitude) -
|
|
237
251
|
haversineKm(center.latitude, center.longitude, b.latitude, b.longitude));
|
|
238
252
|
}
|
|
239
253
|
function toHit(row, idToCategory, center) {
|
|
@@ -262,11 +276,11 @@ function toHit(row, idToCategory, center) {
|
|
|
262
276
|
*/
|
|
263
277
|
function sanitizePOINameQuery(text) {
|
|
264
278
|
return text
|
|
265
|
-
.
|
|
279
|
+
.replaceAll(/["*:]/g, "")
|
|
266
280
|
.trim()
|
|
267
281
|
.split(/\s+/u)
|
|
268
282
|
.filter(Boolean)
|
|
269
|
-
.map((token) => `"${token.
|
|
283
|
+
.map((token) => `"${token.replaceAll('"', '""')}"`)
|
|
270
284
|
.join(" ");
|
|
271
285
|
}
|
|
272
286
|
//# sourceMappingURL=poi-lookup.js.map
|
package/out/poi-lookup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poi-lookup.js","sourceRoot":"","sources":["../poi-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAe,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,OAAO,CAAA;AAI9C
|
|
1
|
+
{"version":3,"file":"poi-lookup.js","sourceRoot":"","sources":["../poi-lookup.ts"],"names":[],"mappings":"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"}
|
package/out/poi-schema.d.ts
CHANGED
|
@@ -14,27 +14,45 @@
|
|
|
14
14
|
import type { DatabaseSync } from "node:sqlite";
|
|
15
15
|
import type { LayerContractDatabase } from "@mailwoman/core/layers";
|
|
16
16
|
import { type Kysely } from "kysely";
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* One POI row. Clustered PK: h3_cell → category_id → neg_rank → rowid_key.
|
|
19
|
+
*/
|
|
18
20
|
export interface POITable {
|
|
19
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* 48-bit short H3 cell at res 9 (`latLngToCell` → `shortenH3Cell`).
|
|
23
|
+
*/
|
|
20
24
|
h3_cell: number;
|
|
21
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Small int from {@link POICategoryCodeTable}; 0 = uncategorized.
|
|
27
|
+
*/
|
|
22
28
|
category_id: number;
|
|
23
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* `-log10(confidence + epsilon)` so ASC = most-confident-first within a cell+category.
|
|
31
|
+
*/
|
|
24
32
|
neg_rank: number;
|
|
25
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Uniquifier within the clustered key (builder-assigned monotonic int).
|
|
35
|
+
*/
|
|
26
36
|
rowid_key: number;
|
|
27
37
|
name: string | null;
|
|
28
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* Lowercased, diacritic-flattened probe key for exact name lookups.
|
|
40
|
+
*/
|
|
29
41
|
name_key: string | null;
|
|
30
42
|
brand_wikidata: string | null;
|
|
31
43
|
latitude: number;
|
|
32
44
|
longitude: number;
|
|
33
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* ISO 3166-1 alpha-2 (from the Overture partition).
|
|
47
|
+
*/
|
|
34
48
|
country: string;
|
|
35
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* Overture existence confidence (already filtered ≥ 0.85 at build).
|
|
51
|
+
*/
|
|
36
52
|
confidence: number;
|
|
37
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* GERS id — nullable METADATA ONLY, never a key (the #470 rule).
|
|
55
|
+
*/
|
|
38
56
|
gers_id: string | null;
|
|
39
57
|
}
|
|
40
58
|
/**
|
|
@@ -55,7 +73,9 @@ export interface POIStageTable {
|
|
|
55
73
|
confidence: number | null;
|
|
56
74
|
gers_id: string | null;
|
|
57
75
|
}
|
|
58
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* `(id → poi-taxonomy category id)` dictionary, e.g. `3 → "cafe"`.
|
|
78
|
+
*/
|
|
59
79
|
export interface POICategoryCodeTable {
|
|
60
80
|
id: number;
|
|
61
81
|
category: string;
|
|
@@ -65,11 +85,15 @@ export interface POIDatabase extends LayerContractDatabase {
|
|
|
65
85
|
poi_stage: POIStageTable;
|
|
66
86
|
poi_category_codes: POICategoryCodeTable;
|
|
67
87
|
}
|
|
68
|
-
/**
|
|
88
|
+
/**
|
|
89
|
+
* Clustered-key-order column list shared by builder + `INSERT INTO poi SELECT … FROM poi_stage`.
|
|
90
|
+
*/
|
|
69
91
|
export declare const POI_COLUMNS: readonly ["h3_cell", "category_id", "neg_rank", "rowid_key", "name", "name_key", "brand_wikidata", "latitude", "longitude", "country", "confidence", "gers_id"];
|
|
70
92
|
export declare function createPOIStagingTables(db: Kysely<POIDatabase>): Promise<void>;
|
|
71
93
|
export declare function createPOITable(db: Kysely<POIDatabase>): Promise<void>;
|
|
72
|
-
/**
|
|
94
|
+
/**
|
|
95
|
+
* Secondary index for the FTS-hydration path. Builders call this AFTER the bulk materialize (index-after-load).
|
|
96
|
+
*/
|
|
73
97
|
export declare function createPOINameKeyIndex(db: Kysely<POIDatabase>): Promise<void>;
|
|
74
98
|
/**
|
|
75
99
|
* Secondary index for the BRAND path — a brand-wide fetch by `brand_wikidata` (no `h3_cell` prefix). Brand rows are
|
|
@@ -80,7 +104,12 @@ export declare function createPOINameKeyIndex(db: Kysely<POIDatabase>): Promise<
|
|
|
80
104
|
* materialize (index-after-load), same phase as {@link createPOINameKeyIndex}.
|
|
81
105
|
*/
|
|
82
106
|
export declare function createPOIBrandIndex(db: Kysely<POIDatabase>): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* FTS5 virtual table backing POI name search in poi.db.
|
|
109
|
+
*/
|
|
83
110
|
export declare const POI_FTS_TABLE = "poi_search";
|
|
84
|
-
/**
|
|
111
|
+
/**
|
|
112
|
+
* FTS5 stays raw SQL by project rule (Kysely can't express virtual tables). Content-keyed by name_key.
|
|
113
|
+
*/
|
|
85
114
|
export declare function createPOISearchFTS(db: DatabaseSync): void;
|
|
86
115
|
//# sourceMappingURL=poi-schema.d.ts.map
|
package/out/poi-schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poi-schema.d.ts","sourceRoot":"","sources":["../poi-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEzC
|
|
1
|
+
{"version":3,"file":"poi-schema.d.ts","sourceRoot":"","sources":["../poi-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEzC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB;;OAEG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,WAAY,SAAQ,qBAAqB;IACzD,GAAG,EAAE,QAAQ,CAAA;IACb,SAAS,EAAE,aAAa,CAAA;IACxB,kBAAkB,EAAE,oBAAoB,CAAA;CACxC;AAED;;GAEG;AACH,eAAO,MAAM,WAAW,iKAad,CAAA;AAEV,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBnF;AAED,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB3E;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAElF;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhF;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,eAAe,CAAA;AAEzC;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAIzD"}
|
package/out/poi-schema.js
CHANGED
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
* manifest (tier `shipped`, spine `h3` res 9) and per-res-6-cell coverage.
|
|
13
13
|
*/
|
|
14
14
|
import { sql } from "kysely";
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Clustered-key-order column list shared by builder + `INSERT INTO poi SELECT … FROM poi_stage`.
|
|
17
|
+
*/
|
|
16
18
|
export const POI_COLUMNS = [
|
|
17
19
|
"h3_cell",
|
|
18
20
|
"category_id",
|
|
@@ -69,7 +71,9 @@ export async function createPOITable(db) {
|
|
|
69
71
|
.modifyEnd(sql `without rowid`)
|
|
70
72
|
.execute();
|
|
71
73
|
}
|
|
72
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Secondary index for the FTS-hydration path. Builders call this AFTER the bulk materialize (index-after-load).
|
|
76
|
+
*/
|
|
73
77
|
export async function createPOINameKeyIndex(db) {
|
|
74
78
|
await db.schema.createIndex("poi_name_key").on("poi").column("name_key").execute();
|
|
75
79
|
}
|
|
@@ -89,8 +93,13 @@ export async function createPOIBrandIndex(db) {
|
|
|
89
93
|
.where("brand_wikidata", "is not", null)
|
|
90
94
|
.execute();
|
|
91
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* FTS5 virtual table backing POI name search in poi.db.
|
|
98
|
+
*/
|
|
92
99
|
export const POI_FTS_TABLE = "poi_search";
|
|
93
|
-
/**
|
|
100
|
+
/**
|
|
101
|
+
* FTS5 stays raw SQL by project rule (Kysely can't express virtual tables). Content-keyed by name_key.
|
|
102
|
+
*/
|
|
94
103
|
export function createPOISearchFTS(db) {
|
|
95
104
|
db.exec(`CREATE VIRTUAL TABLE ${POI_FTS_TABLE} USING fts5(name, name_key UNINDEXED, h3_cell UNINDEXED, tokenize = 'unicode61')`);
|
|
96
105
|
}
|
package/out/poi-schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poi-schema.js","sourceRoot":"","sources":["../poi-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,GAAG,EAAe,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"poi-schema.js","sourceRoot":"","sources":["../poi-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,18 +17,30 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { DatabaseSync } from "node:sqlite";
|
|
19
19
|
export interface WOFPostalCityAliasLookupOpts {
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* Path to a `postal-city-alias-<cc>.db` built by `build-postal-city-alias.ts`. Opened read-only.
|
|
22
|
+
*/
|
|
21
23
|
databasePath?: string;
|
|
22
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* Pre-opened handle (tests / shared connections). Mutually exclusive with `databasePath`.
|
|
26
|
+
*/
|
|
23
27
|
database?: DatabaseSync;
|
|
24
28
|
}
|
|
25
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* One divergent alias edge: the postal-system name and the geographic locality it maps to.
|
|
31
|
+
*/
|
|
26
32
|
export interface PostalCityAlias {
|
|
27
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* The postal-system surface (what a user types).
|
|
35
|
+
*/
|
|
28
36
|
postalCity: string;
|
|
29
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* The geographic locality name the postcode sits in (≈ the gazetteer's canonical name).
|
|
39
|
+
*/
|
|
30
40
|
geoLocality: string;
|
|
31
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* Observed usage count — the evidence weight.
|
|
43
|
+
*/
|
|
32
44
|
n: number;
|
|
33
45
|
}
|
|
34
46
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postal-city-alias-lookup.d.ts","sourceRoot":"","sources":["../postal-city-alias-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAM1C,MAAM,WAAW,4BAA4B;IAC5C
|
|
1
|
+
{"version":3,"file":"postal-city-alias-lookup.d.ts","sourceRoot":"","sources":["../postal-city-alias-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAM1C,MAAM,WAAW,4BAA4B;IAC5C;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,CAAC,EAAE,MAAM,CAAA;CACT;AAED;;;;GAIG;AACH,qBAAa,wBAAwB;;gBAKxB,IAAI,EAAE,4BAA4B;IAe9C;;;OAGG;IACG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAevE,KAAK,IAAI,IAAI;CAKb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postal-city-alias-lookup.js","sourceRoot":"","sources":["../postal-city-alias-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"postal-city-alias-lookup.js","sourceRoot":"","sources":["../postal-city-alias-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAiC9D;;;;GAIG;AACH,MAAM,OAAO,wBAAwB;IACpC,GAAG,CAAc;IACjB,IAAI,CAAyC;IAC7C,OAAO,CAAS;IAEhB,YAAY,IAAkC;QAC7C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAA;YACxB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACrB,CAAC;aAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;YAClE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACpB,CAAC;aAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;QAC/E,CAAC;QAED,uFAAuF;QACvF,IAAI,CAAC,IAAI,GAAG,IAAI,cAAc,CAA0B,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAChF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QACzC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAE1B,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAA;QAElB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI;aAC1B,UAAU,CAAC,mBAAmB,CAAC;aAC/B,MAAM,CAAC,CAAC,aAAa,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;aAC5C,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,EAAE,CAAC;aAC1B,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;aAC1B,OAAO,EAAE,CAAA;QAEX,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACrH,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;QACjB,CAAC;IACF,CAAC;CACD"}
|
|
@@ -21,26 +21,44 @@ import type { Kysely } from "kysely";
|
|
|
21
21
|
* a `MIN_COUNT` floor on `n`, so every row is a non-trivial usage.
|
|
22
22
|
*/
|
|
23
23
|
export interface PostalCityAliasTable {
|
|
24
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* The postcode the aggregate is scoped to (the resolver probes by this).
|
|
26
|
+
*/
|
|
25
27
|
postcode: string;
|
|
26
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* What the postal system calls the place (the surface a user is likely to type).
|
|
30
|
+
*/
|
|
27
31
|
postal_city: string;
|
|
28
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* The geographic locality name the postcode actually sits in (≈ the gazetteer's canonical name).
|
|
34
|
+
*/
|
|
29
35
|
geo_locality: string;
|
|
30
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* Observed row count — the evidence weight behind this alias.
|
|
38
|
+
*/
|
|
31
39
|
n: number;
|
|
32
|
-
/**
|
|
40
|
+
/**
|
|
41
|
+
* 1 when `postal_city != geo_locality` (the alias signal); 0 when they agree.
|
|
42
|
+
*/
|
|
33
43
|
divergent: number;
|
|
34
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Provenance: the dataset this aggregate came from (e.g. `overture:US`).
|
|
46
|
+
*/
|
|
35
47
|
source: string;
|
|
36
|
-
/**
|
|
48
|
+
/**
|
|
49
|
+
* The pinned data release the aggregate was computed from.
|
|
50
|
+
*/
|
|
37
51
|
release: string;
|
|
38
52
|
}
|
|
39
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* The postal-city-alias database schema for `new DatabaseClient<PostalCityAliasDatabase>(...)`.
|
|
55
|
+
*/
|
|
40
56
|
export interface PostalCityAliasDatabase {
|
|
41
57
|
postal_city_alias: PostalCityAliasTable;
|
|
42
58
|
}
|
|
43
|
-
/**
|
|
59
|
+
/**
|
|
60
|
+
* The `postal_city_alias` column order — the builder's INSERT derives its column list from this.
|
|
61
|
+
*/
|
|
44
62
|
export declare const POSTAL_CITY_ALIAS_COLUMNS: readonly ["postcode", "postal_city", "geo_locality", "n", "divergent", "source", "release"];
|
|
45
63
|
/**
|
|
46
64
|
* Create the `postal_city_alias` table + its two probe indexes. Kept here (not only in the builder) so tests can stand
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postal-city-alias-schema.d.ts","sourceRoot":"","sources":["../postal-city-alias-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACpC
|
|
1
|
+
{"version":3,"file":"postal-city-alias-schema.d.ts","sourceRoot":"","sources":["../postal-city-alias-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACpC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB;;OAEG;IACH,CAAC,EAAE,MAAM,CAAA;IACT;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC,iBAAiB,EAAE,oBAAoB,CAAA;CACvC;AAED;;GAEG;AACH,eAAO,MAAM,yBAAyB,6FAQ5B,CAAA;AAEV;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,MAAM,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnG"}
|
|
@@ -15,7 +15,9 @@
|
|
|
15
15
|
* with a usage count `n`; `divergent = 1` exactly when `postal_city != geo_locality` (the alias
|
|
16
16
|
* signal — the only rows the resolver consumes).
|
|
17
17
|
*/
|
|
18
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* The `postal_city_alias` column order — the builder's INSERT derives its column list from this.
|
|
20
|
+
*/
|
|
19
21
|
export const POSTAL_CITY_ALIAS_COLUMNS = [
|
|
20
22
|
"postcode",
|
|
21
23
|
"postal_city",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postal-city-alias-schema.js","sourceRoot":"","sources":["../postal-city-alias-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"postal-city-alias-schema.js","sourceRoot":"","sources":["../postal-city-alias-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA8CH;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACxC,UAAU;IACV,aAAa;IACb,cAAc;IACd,GAAG;IACH,WAAW;IACX,QAAQ;IACR,SAAS;CACA,CAAA;AAEV;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAAmC;IACnF,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,mBAAmB,CAAC;SAChC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACpD,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACrD,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC7C,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACrD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/C,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAChD,OAAO,EAAE,CAAA;IAEX,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAA;IACpG,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;AACvH,CAAC"}
|
|
@@ -23,13 +23,21 @@ import { type Kysely } from "kysely";
|
|
|
23
23
|
* locality directly; the denormalized name/coord avoid a join back to `candidate`.
|
|
24
24
|
*/
|
|
25
25
|
export interface PostalCityCandidateTable {
|
|
26
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* {@link normalizeLocalityForKey} of the postal-city name — the build/query-consistent probe key.
|
|
28
|
+
*/
|
|
27
29
|
name_key: string;
|
|
28
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* The postcode the alias is scoped to (the second half of the exact key).
|
|
32
|
+
*/
|
|
29
33
|
postcode: string;
|
|
30
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* WOF id of the geographic locality the postcode sits in (the resolve target).
|
|
36
|
+
*/
|
|
31
37
|
spr_id: number;
|
|
32
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* The geographic locality's display name.
|
|
40
|
+
*/
|
|
33
41
|
name: string;
|
|
34
42
|
latitude: number;
|
|
35
43
|
longitude: number;
|
|
@@ -44,7 +52,9 @@ export interface PostalCityCandidateDatabase {
|
|
|
44
52
|
* The table name the lookup probes (existence-gated, so an old candidate.db without it is byte-stable).
|
|
45
53
|
*/
|
|
46
54
|
export declare const POSTAL_CITY_CANDIDATE_TABLE = "postal_city_candidate";
|
|
47
|
-
/**
|
|
55
|
+
/**
|
|
56
|
+
* Column order for the builder's positional INSERT.
|
|
57
|
+
*/
|
|
48
58
|
export declare const POSTAL_CITY_CANDIDATE_COLUMNS: readonly ["name_key", "postcode", "spr_id", "name", "latitude", "longitude"];
|
|
49
59
|
/**
|
|
50
60
|
* Create the side-index — a clustered `WITHOUT ROWID` B-tree on `(name_key, postcode)` so the resolve is a single exact
|