@mailwoman/resolver-wof-sqlite 10.0.0 → 10.2.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.
Files changed (477) hide show
  1. package/README.md +9 -8
  2. package/lib/address/point/interpolation.ts +45 -39
  3. package/lib/address/point/schema.ts +17 -40
  4. package/lib/address/point.ts +316 -0
  5. package/lib/{address/index.ts → address.ts} +1 -1
  6. package/lib/ancestry/backfill.ts +20 -86
  7. package/lib/{ancestry/index.ts → ancestry.ts} +19 -15
  8. package/lib/build/candidate.ts +122 -174
  9. package/lib/build/population-corrections.ts +64 -0
  10. package/lib/build/slim.ts +44 -114
  11. package/lib/candidate/alias-bags.ts +16 -17
  12. package/lib/candidate/ancestors/schema.ts +77 -61
  13. package/lib/candidate/ancestors/sidecar.ts +15 -22
  14. package/lib/candidate/country-display-names.ts +6 -20
  15. package/lib/candidate/extract-fold.ts +10 -55
  16. package/lib/candidate/fts.ts +5 -23
  17. package/lib/candidate/importance.ts +65 -68
  18. package/lib/candidate/lookup.ts +124 -415
  19. package/lib/candidate/name-roles.ts +15 -33
  20. package/lib/candidate/own-name.ts +35 -32
  21. package/lib/candidate/place-attrs.ts +20 -13
  22. package/lib/candidate/schema.ts +29 -65
  23. package/lib/candidate/scoring.ts +54 -93
  24. package/lib/capital-schema.ts +21 -17
  25. package/lib/capitals.ts +29 -27
  26. package/lib/coincident-roles.ts +85 -55
  27. package/lib/convention/schema.ts +15 -16
  28. package/lib/convention.ts +144 -0
  29. package/lib/coverage-manifest-schema.ts +40 -45
  30. package/lib/currency-backfill.ts +34 -79
  31. package/lib/env.ts +1 -1
  32. package/lib/exact-match.ts +32 -21
  33. package/lib/extracts.ts +97 -74
  34. package/lib/fst/autocomplete.ts +54 -37
  35. package/lib/fst/builder.ts +37 -41
  36. package/lib/fst/deserialize-web.ts +16 -17
  37. package/lib/fst/format.ts +41 -23
  38. package/lib/fst/freshness.ts +43 -120
  39. package/lib/fst/matcher.ts +7 -5
  40. package/lib/fst/serialize.ts +54 -74
  41. package/lib/fst/types.ts +78 -75
  42. package/lib/{fst/index.ts → fst.ts} +1 -0
  43. package/lib/fts/query.ts +5 -36
  44. package/lib/fts.ts +280 -0
  45. package/lib/geonames/aliases.ts +73 -144
  46. package/lib/geonames/postal.ts +162 -71
  47. package/lib/index.ts +9 -8
  48. package/lib/interpolation.ts +48 -100
  49. package/lib/lookup.ts +155 -270
  50. package/lib/name-score.ts +9 -7
  51. package/lib/nsul/lookup.ts +37 -54
  52. package/lib/nsul/schema.ts +16 -43
  53. package/lib/paths.ts +159 -0
  54. package/lib/place-importance-schema.ts +62 -169
  55. package/lib/poi/lookup.ts +104 -121
  56. package/lib/poi/schema.ts +42 -26
  57. package/lib/polygon-schema.ts +10 -6
  58. package/lib/postal/city/alias/lookup.ts +22 -40
  59. package/lib/postal/city/alias/schema.ts +14 -10
  60. package/lib/postal/city/candidate-schema.ts +26 -20
  61. package/lib/postcode-point-lookup.ts +8 -27
  62. package/lib/primary-preference.ts +46 -126
  63. package/lib/proximity-rerank.ts +44 -33
  64. package/lib/ranking-weights.ts +105 -78
  65. package/lib/region-keys.ts +70 -42
  66. package/lib/reverse.ts +149 -86
  67. package/lib/schema.ts +73 -50
  68. package/lib/search-fetch.ts +90 -68
  69. package/lib/sqlite/convention-source.ts +15 -23
  70. package/lib/sqlite/utils.ts +19 -22
  71. package/lib/street/centroid/schema.ts +37 -42
  72. package/lib/street/{centroid/index.ts → centroid.ts} +16 -25
  73. package/lib/street/morphology/fst/builder.ts +60 -42
  74. package/lib/street/morphology/fst/loader.ts +40 -32
  75. package/lib/street/name-lookup.ts +45 -41
  76. package/lib/street/normalize.ts +88 -219
  77. package/lib/street/segment-schema.ts +116 -43
  78. package/lib/{street/index.ts → street.ts} +1 -1
  79. package/lib/types.ts +109 -150
  80. package/lib/unified-schema.ts +29 -29
  81. package/lib/uprn/existence.ts +30 -19
  82. package/lib/uprn/lookup.ts +29 -68
  83. package/lib/uprn/schema.ts +18 -40
  84. package/lib/weights-overlay-linker.ts +236 -252
  85. package/out/address/point/interpolation.d.ts +20 -23
  86. package/out/address/point/interpolation.d.ts.map +1 -1
  87. package/out/address/point/interpolation.js +42 -39
  88. package/out/address/point/interpolation.js.map +1 -1
  89. package/out/address/point/schema.d.ts +12 -35
  90. package/out/address/point/schema.d.ts.map +1 -1
  91. package/out/address/point/schema.js +3 -19
  92. package/out/address/point/schema.js.map +1 -1
  93. package/out/address/point.d.ts +57 -0
  94. package/out/address/point.d.ts.map +1 -0
  95. package/out/address/point.js +206 -0
  96. package/out/address/point.js.map +1 -0
  97. package/out/{address/index.js → address.d.ts} +2 -2
  98. package/out/address.d.ts.map +1 -0
  99. package/out/{address/index.d.ts → address.js} +2 -2
  100. package/out/address.js.map +1 -0
  101. package/out/ancestry/backfill.d.ts +11 -64
  102. package/out/ancestry/backfill.d.ts.map +1 -1
  103. package/out/ancestry/backfill.js +14 -74
  104. package/out/ancestry/backfill.js.map +1 -1
  105. package/out/ancestry.d.ts +49 -0
  106. package/out/ancestry.d.ts.map +1 -0
  107. package/out/ancestry.js +59 -0
  108. package/out/ancestry.js.map +1 -0
  109. package/out/build/candidate.d.ts +82 -112
  110. package/out/build/candidate.d.ts.map +1 -1
  111. package/out/build/candidate.js +17 -100
  112. package/out/build/candidate.js.map +1 -1
  113. package/out/build/population-corrections.d.ts +52 -0
  114. package/out/build/population-corrections.d.ts.map +1 -0
  115. package/out/build/population-corrections.js +40 -0
  116. package/out/build/population-corrections.js.map +1 -0
  117. package/out/build/slim.d.ts +8 -44
  118. package/out/build/slim.d.ts.map +1 -1
  119. package/out/build/slim.js +33 -94
  120. package/out/build/slim.js.map +1 -1
  121. package/out/candidate/alias-bags.d.ts +6 -6
  122. package/out/candidate/alias-bags.d.ts.map +1 -1
  123. package/out/candidate/alias-bags.js +16 -17
  124. package/out/candidate/alias-bags.js.map +1 -1
  125. package/out/candidate/ancestors/schema.d.ts +73 -57
  126. package/out/candidate/ancestors/schema.d.ts.map +1 -1
  127. package/out/candidate/ancestors/schema.js +56 -48
  128. package/out/candidate/ancestors/schema.js.map +1 -1
  129. package/out/candidate/ancestors/sidecar.d.ts +3 -8
  130. package/out/candidate/ancestors/sidecar.d.ts.map +1 -1
  131. package/out/candidate/ancestors/sidecar.js +15 -22
  132. package/out/candidate/ancestors/sidecar.js.map +1 -1
  133. package/out/candidate/country-display-names.d.ts +5 -15
  134. package/out/candidate/country-display-names.d.ts.map +1 -1
  135. package/out/candidate/country-display-names.js +6 -20
  136. package/out/candidate/country-display-names.js.map +1 -1
  137. package/out/candidate/extract-fold.d.ts +7 -15
  138. package/out/candidate/extract-fold.d.ts.map +1 -1
  139. package/out/candidate/extract-fold.js +5 -47
  140. package/out/candidate/extract-fold.js.map +1 -1
  141. package/out/candidate/fts.d.ts +5 -23
  142. package/out/candidate/fts.d.ts.map +1 -1
  143. package/out/candidate/fts.js +5 -23
  144. package/out/candidate/fts.js.map +1 -1
  145. package/out/candidate/importance.d.ts +60 -65
  146. package/out/candidate/importance.d.ts.map +1 -1
  147. package/out/candidate/importance.js +56 -63
  148. package/out/candidate/importance.js.map +1 -1
  149. package/out/candidate/lookup.d.ts +18 -55
  150. package/out/candidate/lookup.d.ts.map +1 -1
  151. package/out/candidate/lookup.js +82 -385
  152. package/out/candidate/lookup.js.map +1 -1
  153. package/out/candidate/name-roles.d.ts +9 -21
  154. package/out/candidate/name-roles.d.ts.map +1 -1
  155. package/out/candidate/name-roles.js +15 -33
  156. package/out/candidate/name-roles.js.map +1 -1
  157. package/out/candidate/own-name.d.ts +23 -25
  158. package/out/candidate/own-name.d.ts.map +1 -1
  159. package/out/candidate/own-name.js +35 -32
  160. package/out/candidate/own-name.js.map +1 -1
  161. package/out/candidate/place-attrs.d.ts +20 -13
  162. package/out/candidate/place-attrs.d.ts.map +1 -1
  163. package/out/candidate/place-attrs.js +4 -5
  164. package/out/candidate/place-attrs.js.map +1 -1
  165. package/out/candidate/schema.d.ts +27 -62
  166. package/out/candidate/schema.d.ts.map +1 -1
  167. package/out/candidate/schema.js +10 -22
  168. package/out/candidate/schema.js.map +1 -1
  169. package/out/candidate/scoring.d.ts +7 -8
  170. package/out/candidate/scoring.d.ts.map +1 -1
  171. package/out/candidate/scoring.js +52 -89
  172. package/out/candidate/scoring.js.map +1 -1
  173. package/out/capital-schema.d.ts +21 -17
  174. package/out/capital-schema.d.ts.map +1 -1
  175. package/out/capital-schema.js +17 -15
  176. package/out/capital-schema.js.map +1 -1
  177. package/out/capitals.d.ts +27 -25
  178. package/out/capitals.d.ts.map +1 -1
  179. package/out/capitals.js +23 -21
  180. package/out/capitals.js.map +1 -1
  181. package/out/coincident-roles.d.ts +60 -43
  182. package/out/coincident-roles.d.ts.map +1 -1
  183. package/out/coincident-roles.js +72 -50
  184. package/out/coincident-roles.js.map +1 -1
  185. package/out/convention/schema.d.ts +14 -14
  186. package/out/convention/schema.d.ts.map +1 -1
  187. package/out/convention/schema.js +6 -4
  188. package/out/convention/schema.js.map +1 -1
  189. package/out/convention.d.ts +97 -0
  190. package/out/convention.d.ts.map +1 -0
  191. package/out/convention.js +81 -0
  192. package/out/convention.js.map +1 -0
  193. package/out/coverage-manifest-schema.d.ts +34 -39
  194. package/out/coverage-manifest-schema.d.ts.map +1 -1
  195. package/out/coverage-manifest-schema.js +25 -34
  196. package/out/coverage-manifest-schema.js.map +1 -1
  197. package/out/currency-backfill.d.ts +16 -38
  198. package/out/currency-backfill.d.ts.map +1 -1
  199. package/out/currency-backfill.js +19 -46
  200. package/out/currency-backfill.js.map +1 -1
  201. package/out/env.d.ts +1 -1
  202. package/out/env.js +1 -1
  203. package/out/exact-match.d.ts +19 -10
  204. package/out/exact-match.d.ts.map +1 -1
  205. package/out/exact-match.js +32 -21
  206. package/out/exact-match.js.map +1 -1
  207. package/out/extracts.d.ts +66 -55
  208. package/out/extracts.d.ts.map +1 -1
  209. package/out/extracts.js +63 -55
  210. package/out/extracts.js.map +1 -1
  211. package/out/fst/autocomplete.d.ts +29 -21
  212. package/out/fst/autocomplete.d.ts.map +1 -1
  213. package/out/fst/autocomplete.js +39 -28
  214. package/out/fst/autocomplete.js.map +1 -1
  215. package/out/fst/builder.d.ts.map +1 -1
  216. package/out/fst/builder.js +37 -41
  217. package/out/fst/builder.js.map +1 -1
  218. package/out/fst/deserialize-web.d.ts +4 -4
  219. package/out/fst/deserialize-web.d.ts.map +1 -1
  220. package/out/fst/deserialize-web.js +15 -16
  221. package/out/fst/deserialize-web.js.map +1 -1
  222. package/out/fst/format.d.ts +41 -23
  223. package/out/fst/format.d.ts.map +1 -1
  224. package/out/fst/format.js +41 -23
  225. package/out/fst/format.js.map +1 -1
  226. package/out/fst/freshness.d.ts +19 -81
  227. package/out/fst/freshness.d.ts.map +1 -1
  228. package/out/fst/freshness.js +31 -94
  229. package/out/fst/freshness.js.map +1 -1
  230. package/out/fst/matcher.d.ts +5 -4
  231. package/out/fst/matcher.d.ts.map +1 -1
  232. package/out/fst/matcher.js +2 -2
  233. package/out/fst/matcher.js.map +1 -1
  234. package/out/fst/serialize.d.ts +28 -28
  235. package/out/fst/serialize.d.ts.map +1 -1
  236. package/out/fst/serialize.js +53 -71
  237. package/out/fst/serialize.js.map +1 -1
  238. package/out/fst/types.d.ts +78 -74
  239. package/out/fst/types.d.ts.map +1 -1
  240. package/out/fst/types.js +1 -4
  241. package/out/fst/types.js.map +1 -1
  242. package/out/{fst/index.js → fst.d.ts} +2 -1
  243. package/out/fst.d.ts.map +1 -0
  244. package/out/{fst/index.d.ts → fst.js} +2 -1
  245. package/out/fst.js.map +1 -0
  246. package/out/fts/query.d.ts +2 -27
  247. package/out/fts/query.d.ts.map +1 -1
  248. package/out/fts/query.js +5 -36
  249. package/out/fts/query.js.map +1 -1
  250. package/out/fts.d.ts +126 -0
  251. package/out/fts.d.ts.map +1 -0
  252. package/out/fts.js +188 -0
  253. package/out/fts.js.map +1 -0
  254. package/out/geonames/aliases.d.ts +26 -62
  255. package/out/geonames/aliases.d.ts.map +1 -1
  256. package/out/geonames/aliases.js +45 -117
  257. package/out/geonames/aliases.js.map +1 -1
  258. package/out/geonames/postal.d.ts +84 -44
  259. package/out/geonames/postal.d.ts.map +1 -1
  260. package/out/geonames/postal.js +115 -73
  261. package/out/geonames/postal.js.map +1 -1
  262. package/out/{geonames/index.js → geonames.d.ts} +1 -1
  263. package/out/geonames.d.ts.map +1 -0
  264. package/out/{geonames/index.d.ts → geonames.js} +1 -1
  265. package/out/geonames.js.map +1 -0
  266. package/out/index.d.ts +9 -8
  267. package/out/index.d.ts.map +1 -1
  268. package/out/index.js +6 -5
  269. package/out/index.js.map +1 -1
  270. package/out/interpolation.d.ts +18 -55
  271. package/out/interpolation.d.ts.map +1 -1
  272. package/out/interpolation.js +27 -69
  273. package/out/interpolation.js.map +1 -1
  274. package/out/lookup.d.ts +23 -51
  275. package/out/lookup.d.ts.map +1 -1
  276. package/out/lookup.js +136 -234
  277. package/out/lookup.js.map +1 -1
  278. package/out/name-score.d.ts +2 -2
  279. package/out/name-score.d.ts.map +1 -1
  280. package/out/name-score.js +9 -7
  281. package/out/name-score.js.map +1 -1
  282. package/out/nsul/lookup.d.ts +33 -34
  283. package/out/nsul/lookup.d.ts.map +1 -1
  284. package/out/nsul/lookup.js +26 -40
  285. package/out/nsul/lookup.js.map +1 -1
  286. package/out/nsul/schema.d.ts +16 -43
  287. package/out/nsul/schema.d.ts.map +1 -1
  288. package/out/nsul/schema.js +9 -35
  289. package/out/nsul/schema.js.map +1 -1
  290. package/out/{nsul/index.d.ts → nsul.d.ts} +1 -1
  291. package/out/nsul.d.ts.map +1 -0
  292. package/out/{nsul/index.js → nsul.js} +1 -1
  293. package/out/nsul.js.map +1 -0
  294. package/out/paths.d.ts +124 -0
  295. package/out/paths.d.ts.map +1 -0
  296. package/out/paths.js +104 -0
  297. package/out/paths.js.map +1 -0
  298. package/out/place-importance-schema.d.ts +51 -143
  299. package/out/place-importance-schema.d.ts.map +1 -1
  300. package/out/place-importance-schema.js +28 -143
  301. package/out/place-importance-schema.js.map +1 -1
  302. package/out/poi/lookup.d.ts +40 -47
  303. package/out/poi/lookup.d.ts.map +1 -1
  304. package/out/poi/lookup.js +69 -96
  305. package/out/poi/lookup.js.map +1 -1
  306. package/out/poi/schema.d.ts +41 -25
  307. package/out/poi/schema.d.ts.map +1 -1
  308. package/out/poi/schema.js +25 -17
  309. package/out/poi/schema.js.map +1 -1
  310. package/out/{poi/index.js → poi.d.ts} +1 -1
  311. package/out/poi.d.ts.map +1 -0
  312. package/out/{poi/index.d.ts → poi.js} +1 -1
  313. package/out/poi.js.map +1 -0
  314. package/out/polygon-schema.d.ts +10 -6
  315. package/out/polygon-schema.d.ts.map +1 -1
  316. package/out/polygon-schema.js +2 -2
  317. package/out/polygon-schema.js.map +1 -1
  318. package/out/postal/city/alias/lookup.d.ts +20 -23
  319. package/out/postal/city/alias/lookup.d.ts.map +1 -1
  320. package/out/postal/city/alias/lookup.js +17 -30
  321. package/out/postal/city/alias/lookup.js.map +1 -1
  322. package/out/postal/city/alias/schema.d.ts +14 -10
  323. package/out/postal/city/alias/schema.d.ts.map +1 -1
  324. package/out/postal/city/alias/schema.js +10 -8
  325. package/out/postal/city/alias/schema.js.map +1 -1
  326. package/out/postal/city/candidate-schema.d.ts +25 -19
  327. package/out/postal/city/candidate-schema.d.ts.map +1 -1
  328. package/out/postal/city/candidate-schema.js +21 -17
  329. package/out/postal/city/candidate-schema.js.map +1 -1
  330. package/out/{postal/index.d.ts → postal.d.ts} +1 -1
  331. package/out/postal.d.ts.map +1 -0
  332. package/out/{postal/index.js → postal.js} +1 -1
  333. package/out/postal.js.map +1 -0
  334. package/out/postcode-point-lookup.d.ts +6 -24
  335. package/out/postcode-point-lookup.d.ts.map +1 -1
  336. package/out/postcode-point-lookup.js +5 -17
  337. package/out/postcode-point-lookup.js.map +1 -1
  338. package/out/primary-preference.d.ts +38 -92
  339. package/out/primary-preference.d.ts.map +1 -1
  340. package/out/primary-preference.js +15 -99
  341. package/out/primary-preference.js.map +1 -1
  342. package/out/proximity-rerank.d.ts +41 -30
  343. package/out/proximity-rerank.d.ts.map +1 -1
  344. package/out/proximity-rerank.js +38 -29
  345. package/out/proximity-rerank.js.map +1 -1
  346. package/out/ranking-weights.d.ts +98 -64
  347. package/out/ranking-weights.d.ts.map +1 -1
  348. package/out/ranking-weights.js +26 -25
  349. package/out/ranking-weights.js.map +1 -1
  350. package/out/region-keys.d.ts +50 -31
  351. package/out/region-keys.d.ts.map +1 -1
  352. package/out/region-keys.js +68 -40
  353. package/out/region-keys.js.map +1 -1
  354. package/out/reverse.d.ts +78 -50
  355. package/out/reverse.d.ts.map +1 -1
  356. package/out/reverse.js +98 -61
  357. package/out/reverse.js.map +1 -1
  358. package/out/schema.d.ts +72 -49
  359. package/out/schema.d.ts.map +1 -1
  360. package/out/schema.js +4 -5
  361. package/out/schema.js.map +1 -1
  362. package/out/search-fetch.d.ts +16 -12
  363. package/out/search-fetch.d.ts.map +1 -1
  364. package/out/search-fetch.js +83 -63
  365. package/out/search-fetch.js.map +1 -1
  366. package/out/sqlite/convention-source.d.ts +12 -16
  367. package/out/sqlite/convention-source.d.ts.map +1 -1
  368. package/out/sqlite/convention-source.js +13 -22
  369. package/out/sqlite/convention-source.js.map +1 -1
  370. package/out/sqlite/utils.d.ts +19 -19
  371. package/out/sqlite/utils.d.ts.map +1 -1
  372. package/out/sqlite/utils.js +14 -15
  373. package/out/sqlite/utils.js.map +1 -1
  374. package/out/street/centroid/schema.d.ts +37 -42
  375. package/out/street/centroid/schema.d.ts.map +1 -1
  376. package/out/street/centroid/schema.js +9 -21
  377. package/out/street/centroid/schema.js.map +1 -1
  378. package/out/street/centroid.d.ts +30 -0
  379. package/out/street/centroid.d.ts.map +1 -0
  380. package/out/street/{centroid/index.js → centroid.js} +13 -24
  381. package/out/street/centroid.js.map +1 -0
  382. package/out/street/morphology/fst/builder.d.ts +20 -10
  383. package/out/street/morphology/fst/builder.d.ts.map +1 -1
  384. package/out/street/morphology/fst/builder.js +44 -34
  385. package/out/street/morphology/fst/builder.js.map +1 -1
  386. package/out/street/morphology/fst/loader.d.ts +33 -26
  387. package/out/street/morphology/fst/loader.d.ts.map +1 -1
  388. package/out/street/morphology/fst/loader.js +23 -22
  389. package/out/street/morphology/fst/loader.js.map +1 -1
  390. package/out/street/name-lookup.d.ts +24 -18
  391. package/out/street/name-lookup.d.ts.map +1 -1
  392. package/out/street/name-lookup.js +34 -35
  393. package/out/street/name-lookup.js.map +1 -1
  394. package/out/street/normalize.d.ts +35 -136
  395. package/out/street/normalize.d.ts.map +1 -1
  396. package/out/street/normalize.js +77 -194
  397. package/out/street/normalize.js.map +1 -1
  398. package/out/street/segment-schema.d.ts +79 -39
  399. package/out/street/segment-schema.d.ts.map +1 -1
  400. package/out/street/segment-schema.js +71 -21
  401. package/out/street/segment-schema.js.map +1 -1
  402. package/out/{street/index.js → street.d.ts} +2 -2
  403. package/out/street.d.ts.map +1 -0
  404. package/out/{street/index.d.ts → street.js} +2 -2
  405. package/out/street.js.map +1 -0
  406. package/out/types.d.ts +84 -149
  407. package/out/types.d.ts.map +1 -1
  408. package/out/types.js +0 -6
  409. package/out/types.js.map +1 -1
  410. package/out/unified-schema.d.ts +8 -12
  411. package/out/unified-schema.d.ts.map +1 -1
  412. package/out/unified-schema.js +29 -29
  413. package/out/unified-schema.js.map +1 -1
  414. package/out/uprn/existence.d.ts +28 -17
  415. package/out/uprn/existence.d.ts.map +1 -1
  416. package/out/uprn/existence.js +26 -16
  417. package/out/uprn/existence.js.map +1 -1
  418. package/out/uprn/lookup.d.ts +14 -44
  419. package/out/uprn/lookup.d.ts.map +1 -1
  420. package/out/uprn/lookup.js +21 -57
  421. package/out/uprn/lookup.js.map +1 -1
  422. package/out/uprn/schema.d.ts +18 -40
  423. package/out/uprn/schema.d.ts.map +1 -1
  424. package/out/uprn/schema.js +10 -32
  425. package/out/uprn/schema.js.map +1 -1
  426. package/out/{uprn/index.d.ts → uprn.d.ts} +1 -1
  427. package/out/uprn.d.ts.map +1 -0
  428. package/out/{uprn/index.js → uprn.js} +1 -1
  429. package/out/uprn.js.map +1 -0
  430. package/out/weights-overlay-linker.d.ts +138 -144
  431. package/out/weights-overlay-linker.d.ts.map +1 -1
  432. package/out/weights-overlay-linker.js +105 -159
  433. package/out/weights-overlay-linker.js.map +1 -1
  434. package/package.json +91 -596
  435. package/lib/address/point/index.ts +0 -328
  436. package/lib/convention/index.ts +0 -154
  437. package/lib/fts/index.ts +0 -361
  438. package/out/address/index.d.ts.map +0 -1
  439. package/out/address/index.js.map +0 -1
  440. package/out/address/point/index.d.ts +0 -53
  441. package/out/address/point/index.d.ts.map +0 -1
  442. package/out/address/point/index.js +0 -222
  443. package/out/address/point/index.js.map +0 -1
  444. package/out/ancestry/index.d.ts +0 -45
  445. package/out/ancestry/index.d.ts.map +0 -1
  446. package/out/ancestry/index.js +0 -55
  447. package/out/ancestry/index.js.map +0 -1
  448. package/out/convention/index.d.ts +0 -106
  449. package/out/convention/index.d.ts.map +0 -1
  450. package/out/convention/index.js +0 -93
  451. package/out/convention/index.js.map +0 -1
  452. package/out/fst/index.d.ts.map +0 -1
  453. package/out/fst/index.js.map +0 -1
  454. package/out/fts/index.d.ts +0 -184
  455. package/out/fts/index.d.ts.map +0 -1
  456. package/out/fts/index.js +0 -277
  457. package/out/fts/index.js.map +0 -1
  458. package/out/geonames/index.d.ts.map +0 -1
  459. package/out/geonames/index.js.map +0 -1
  460. package/out/nsul/index.d.ts.map +0 -1
  461. package/out/nsul/index.js.map +0 -1
  462. package/out/poi/index.d.ts.map +0 -1
  463. package/out/poi/index.js.map +0 -1
  464. package/out/postal/index.d.ts.map +0 -1
  465. package/out/postal/index.js.map +0 -1
  466. package/out/street/centroid/index.d.ts +0 -40
  467. package/out/street/centroid/index.d.ts.map +0 -1
  468. package/out/street/centroid/index.js.map +0 -1
  469. package/out/street/index.d.ts.map +0 -1
  470. package/out/street/index.js.map +0 -1
  471. package/out/uprn/index.d.ts.map +0 -1
  472. package/out/uprn/index.js.map +0 -1
  473. /package/lib/{geonames/index.ts → geonames.ts} +0 -0
  474. /package/lib/{nsul/index.ts → nsul.ts} +0 -0
  475. /package/lib/{poi/index.ts → poi.ts} +0 -0
  476. /package/lib/{postal/index.ts → postal.ts} +0 -0
  477. /package/lib/{uprn/index.ts → uprn.ts} +0 -0
@@ -2,31 +2,19 @@
2
2
  * @copyright Sister Software
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
- * @file Pass 1b of the candidate build — fold ICU's country display names onto the country rows.
6
5
  */
7
6
  import { enumerateCountryDisplayNames } from "@mailwoman/codex/country";
8
7
  import { normalizeLocalityForKey } from "#street/normalize";
9
8
  /**
10
- * Fold every country surface ICU knows onto that country's candidate row (#1678 thread 1).
9
+ * Stages each country name that `Intl.DisplayNames` renders in the codex display-name
10
+ * locales as a non-primary key on that country's candidate row.
11
11
  *
12
- * A bare `格鲁吉亚` (Georgia the country) resolved to NOTHING while `佐治亚州` (Georgia the US state) resolved correctly, and
13
- * the model gave both the same wrong `locality` tag — so the tag was never the variable. Measured 2026-08-15: 140 of
14
- * 237 country rows are synthetic and carry a canonical English name and nothing else; WOF holds no Chinese country
15
- * names at all; and the GeoNames alias fold filters through a Latin-script regex, so neither existing source could ever
16
- * supply them.
12
+ * The row's display name is unchanged, so a query such as `格鲁吉亚` resolves to the existing Georgia row.
13
+ * When several country rows share an ISO code, the most populous one receives the keys.
17
14
  *
18
- * `Intl.DisplayNames` already knows every one — ~280 regions, ~5,244 surfaces, from the same ICU the runtime uses for
19
- * every other locale-sensitive operation. No download, no vendored corpus, no snapshot to drift.
20
- *
21
- * `is_primary = 0`: these are NAMES THE WORLD USES, not the country's canonical name. The display `name` stays whatever
22
- * the gazetteer already had, so resolving `格鲁吉亚` answers with the Georgia country row rather than renaming it.
23
- *
24
- * Returns the row count so the caller can report it — a zero means ICU supplied nothing, which is a different fact from
25
- * the pass not having run.
15
+ * @returns The number of rows staged.
26
16
  */
27
17
  export function stageCountryDisplayNames(ctx) {
28
- // One country row per ISO2. Where a code has several (historic rows surviving the is_current filter), the most
29
- // populous wins — the same tiebreak the ranking uses everywhere else.
30
18
  const countryByISO2 = new Map();
31
19
  for (const [sid, a] of ctx.attrs) {
32
20
  if (a.ptid !== ctx.countryPtID)
@@ -35,7 +23,7 @@ export function stageCountryDisplayNames(ctx) {
35
23
  if (!iso2 || iso2 === "??")
36
24
  continue;
37
25
  const held = countryByISO2.get(iso2);
38
- if (!held || a.pop > held.a.pop) {
26
+ if (!held || (a.pop ?? 0) > (held.a.pop ?? 0)) {
39
27
  countryByISO2.set(iso2, { sid, a });
40
28
  }
41
29
  }
@@ -46,8 +34,6 @@ export function stageCountryDisplayNames(ctx) {
46
34
  if (!target)
47
35
  continue;
48
36
  const k = normalizeLocalityForKey(name);
49
- // The country's own key is already staged as its primary; INSERT OR IGNORE at materialization dedupes the
50
- // rest, so this only skips the obvious self-alias.
51
37
  if (!k || k === target.a.pkey)
52
38
  continue;
53
39
  ctx.stageRow(k, target.a, target.sid, 0);
@@ -1 +1 @@
1
- {"version":3,"file":"country-display-names.js","sourceRoot":"","sources":["../../lib/candidate/country-display-names.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAA;AAGvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAE3D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAMxC;IACA,+GAA+G;IAC/G,sEAAsE;IACtE,MAAM,aAAa,GAAG,IAAI,GAAG,EAA0C,CAAA;IAEvE,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,WAAW;YAAE,SAAQ;QAExC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAEpC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,SAAQ;QAEpC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEpC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACjC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QACpC,CAAC;IACF,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAA;IAEd,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEpB,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,4BAA4B,EAAE,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEtC,IAAI,CAAC,MAAM;YAAE,SAAQ;QAErB,MAAM,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;QAEvC,0GAA0G;QAC1G,mDAAmD;QACnD,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI;YAAE,SAAQ;QAEvC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAExC,MAAM,EAAE,CAAA;IACT,CAAC;IAED,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAErB,OAAO,MAAM,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"country-display-names.js","sourceRoot":"","sources":["../../lib/candidate/country-display-names.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAA;AAGvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAE3D;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAMxC;IACA,MAAM,aAAa,GAAG,IAAI,GAAG,EAA0C,CAAA;IAEvE,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,WAAW;YAAE,SAAQ;QAExC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAEpC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,SAAQ;QAEpC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEpC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;YAC/C,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QACpC,CAAC;IACF,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAA;IAEd,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEpB,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,4BAA4B,EAAE,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEtC,IAAI,CAAC,MAAM;YAAE,SAAQ;QAErB,MAAM,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;QAEvC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI;YAAE,SAAQ;QAEvC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAExC,MAAM,EAAE,CAAA;IACT,CAAC;IAED,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAErB,OAAO,MAAM,CAAA;AACd,CAAC"}
@@ -2,34 +2,26 @@
2
2
  * @copyright Sister Software
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
- * @file Pass 4 of the candidate build — fold a postcode or locality extract into the staging table.
6
5
  */
7
6
  import { DatabaseClient } from "@mailwoman/sqlite/client";
7
+ import type { PathBuilderLike } from "path-ts";
8
8
  import type { PlaceAttrs, StageRow } from "#candidate/place-attrs";
9
9
  import type { CandidateDatabase } from "#candidate/schema";
10
10
  /**
11
- * Fold ONE extract (`spr` rows at `extractPlacetype` carrying real coordinates) in, then pass 4b: the alias names
12
- * hanging off that same extract's `names` table.
11
+ * Stages one postcode or locality extract's located `spr` rows and their `names`
12
+ * aliases into the candidate table.
13
13
  *
14
- * Self-contained by construction — it shares only the staging statement and the code dictionaries with the admin passes
15
- * above it, and nothing downstream reads anything it produces except the counters it returns. The one thing it writes
16
- * beyond the staging table is a depth-1 closure row for a row whose extract names its region (see
17
- * {@link extractRegionAncestry}), so the pick's stamped ancestors agree with the scope it was found under.
14
+ * When `attrs` is given and the extract's `ancestors` table places a row in a known region,
15
+ * the row also gets that region's scope and the region's ancestor chain.
16
+ * The stored ancestors then agree with the row's scope.
18
17
  */
19
18
  export declare function foldExtract(ctx: {
20
- /**
21
- * The staging connection. The extract itself is opened read-only here and closed before returning.
22
- */
23
19
  out: DatabaseClient<CandidateDatabase>;
24
- extractPath: string;
20
+ extractPath: PathBuilderLike;
25
21
  extractPlacetype: "postalcode" | "locality";
26
22
  ccID: (code: string | null) => number;
27
23
  ptID: (pt: string | null) => number;
28
24
  stageRow: StageRow;
29
- /**
30
- * The admin places pass 1 staged — what an extract's region ancestry is resolved against. Absent, no extract row
31
- * takes a region scope (the postcode extracts, which carry none).
32
- */
33
25
  attrs?: Map<number, PlaceAttrs>;
34
26
  progress: (phase: string, message: string) => void;
35
27
  }): {
@@ -1 +1 @@
1
- {"version":3,"file":"extract-fold.d.ts","sourceRoot":"","sources":["../../lib/candidate/extract-fold.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAIzD,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAmC1D;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE;IAChC;;OAEG;IACH,GAAG,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAA;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,YAAY,GAAG,UAAU,CAAA;IAC3C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAA;IACrC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAA;IACnC,QAAQ,EAAE,QAAQ,CAAA;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAClD,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAkJ/E"}
1
+ {"version":3,"file":"extract-fold.d.ts","sourceRoot":"","sources":["../../lib/candidate/extract-fold.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAG9C,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AA0B1D;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE;IAChC,GAAG,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAA;IACtC,WAAW,EAAE,eAAe,CAAA;IAC5B,gBAAgB,EAAE,YAAY,GAAG,UAAU,CAAA;IAC3C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAA;IACrC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAA;IACnC,QAAQ,EAAE,QAAQ,CAAA;IAElB,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAClD,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAqH/E"}
@@ -2,21 +2,11 @@
2
2
  * @copyright Sister Software
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
- * @file Pass 4 of the candidate build — fold a postcode or locality extract into the staging table.
6
5
  */
7
6
  import { DatabaseClient } from "@mailwoman/sqlite/client";
8
7
  import { tableExists } from "@mailwoman/sqlite/introspection";
9
8
  import { CANDIDATE_ANCESTOR_COLUMNS, CANDIDATE_ANCESTOR_TABLE } from "#candidate/ancestors/schema";
10
9
  import { normalizeLocalityForKey } from "#street/normalize";
11
- /**
12
- * The extract's own region-tier ancestry, when it carries any: extract id → the admin region's id. A locality extract
13
- * derived from a national register (the Taiwanese 鄉鎮市區 from the civil-affairs address points) knows which 縣市 each row
14
- * belongs to, and writes that as an `ancestors` row against the admin region's WOF id. Without it a folded row has no
15
- * region scope, so a `parentID`-scoped probe misses it and the cascade widens to whatever namesake carries the key.
16
- *
17
- * Only a region the admin build staged (`attrs`) counts: an id the admin does not know cannot be denormalized into a
18
- * closure row, and a scope nothing can match would be a silent zero rather than an absence.
19
- */
20
10
  function extractRegionAncestry(pc, attrs) {
21
11
  const regionOf = new Map();
22
12
  if (!tableExists(pc, "ancestors")) {
@@ -33,28 +23,21 @@ function extractRegionAncestry(pc, attrs) {
33
23
  return regionOf;
34
24
  }
35
25
  /**
36
- * Fold ONE extract (`spr` rows at `extractPlacetype` carrying real coordinates) in, then pass 4b: the alias names
37
- * hanging off that same extract's `names` table.
26
+ * Stages one postcode or locality extract's located `spr` rows and their `names`
27
+ * aliases into the candidate table.
38
28
  *
39
- * Self-contained by construction — it shares only the staging statement and the code dictionaries with the admin passes
40
- * above it, and nothing downstream reads anything it produces except the counters it returns. The one thing it writes
41
- * beyond the staging table is a depth-1 closure row for a row whose extract names its region (see
42
- * {@link extractRegionAncestry}), so the pick's stamped ancestors agree with the scope it was found under.
29
+ * When `attrs` is given and the extract's `ancestors` table places a row in a known region,
30
+ * the row also gets that region's scope and the region's ancestor chain.
31
+ * The stored ancestors then agree with the row's scope.
43
32
  */
44
33
  export function foldExtract(ctx) {
45
34
  const { out, extractPath, extractPlacetype, ccID, ptID, stageRow, progress } = ctx;
46
35
  progress(extractPlacetype === "postalcode" ? "postcodes" : "localities", `reading ${extractPath}`);
47
36
  using pc = new DatabaseClient(extractPath, { readOnly: true });
48
37
  const pcPtid = ptID(extractPlacetype);
49
- // Per-extract, not the admin `attrs` map: pass 1 only ever sees the admin DB, so the alias pass
50
- // below has nothing to join against unless this primary loop records what it staged.
51
38
  const pcAttrs = new Map();
52
39
  const regionOf = ctx.attrs ? extractRegionAncestry(pc, ctx.attrs) : new Map();
53
40
  const insAncestor = out.prepare(`INSERT OR IGNORE INTO ${CANDIDATE_ANCESTOR_TABLE} VALUES (${CANDIDATE_ANCESTOR_COLUMNS.map(() => "?").join(", ")})`);
54
- // The region's own closure rows, as the sidecar pass wrote them. A scoped row inherits the whole chain above its
55
- // region — macroregion, country — not the region alone: the widened-scope refusal reads a pick's stamped ancestors
56
- // against the parent the walk resolved, and a 縣市 that resolves to its macroregion record (`桃園市`, which WOF names
57
- // only at that tier) would otherwise contradict a lineage that stops at the region.
58
41
  const regionChain = out.prepare(`SELECT depth, parent_spr_id, parent_placetype_id, parent_name, parent_name_key FROM ${CANDIDATE_ANCESTOR_TABLE} WHERE spr_id = ? ORDER BY depth`);
59
42
  let primaries = 0;
60
43
  let aliases = 0;
@@ -74,9 +57,6 @@ export function foldExtract(ctx) {
74
57
  const lon = r.longitude;
75
58
  const id = Number(r.id);
76
59
  const rid = regionOf.get(id) ?? 0;
77
- // region_id from the extract's own ancestry when it names one, else 0 (a postcode is unique by
78
- // name+country — no same-name disambiguation); neg_rank 0 (no population). bbox = the row's own
79
- // min/max (falls back to the centroid point).
80
60
  const a = {
81
61
  cid: ccID(r.country),
82
62
  rid,
@@ -91,9 +71,6 @@ export function foldExtract(ctx) {
91
71
  pop: 0,
92
72
  neg: 0,
93
73
  pkey: key,
94
- // A postcode has no toponym fame — nobody writes an encyclopedia article about SW1A 2AA — and
95
- // the score source carries no `postalcode` rows to join against anyway. NULL is the truthful
96
- // value: unmeasured, so the ranking key leaves postcode rows exactly where they were.
97
74
  imp: null,
98
75
  };
99
76
  pcAttrs.set(id, a);
@@ -111,20 +88,6 @@ export function foldExtract(ctx) {
111
88
  primaries++;
112
89
  }
113
90
  out.exec("COMMIT");
114
- // Fold postcode aliases into the staged candidate names.
115
- //
116
- // The delivery-city names GeoNames supplies for a ZIP ("Brooklyn" for 11201) are written into
117
- // the extract's `names` table by `postcode/centroid-fills.ts`'s `geonamesNameFill`. Everything
118
- // downstream of `names` picked them up EXCEPT this build: `fts.ts` unions `spr.name` with every
119
- // `names` row into `place_search.alt_names`, so the FTS backend resolved "Brooklyn" → 11201
120
- // while the candidate backend — whose every row IS an exact-tier row — had no key for it at
121
- // all. Pass 2 does the equivalent fold for admin places, but reads the ADMIN `place_search`,
122
- // and `attrs` holds admin ids only, so a postcode extract could never reach it.
123
- //
124
- // Same discipline as pass 2: `is_primary = 0` (so `rankByPrimaryPreference` treats it as an
125
- // alias, not a canonical postcode name), the row stays denormalized onto the POSTCODE's own
126
- // spr_id/coords/bbox, and the display `name` stays the postcode — resolving "brooklyn" answers
127
- // with place 11201, it does not rename the place to its delivery city.
128
91
  const hasNames = tableExists(pc, "names");
129
92
  if (hasNames) {
130
93
  out.exec("BEGIN");
@@ -133,8 +96,6 @@ export function foldExtract(ctx) {
133
96
  if (!a)
134
97
  continue;
135
98
  const k = normalizeLocalityForKey(String(r.name ?? ""));
136
- // The postcode's own key is already staged as the primary; `INSERT OR IGNORE` at
137
- // materialization dedupes repeats, so this only skips the obvious self-alias.
138
99
  if (!k || k === a.pkey)
139
100
  continue;
140
101
  stageRow(k, a, Number(r.id), 0);
@@ -143,9 +104,6 @@ export function foldExtract(ctx) {
143
104
  out.exec("COMMIT");
144
105
  }
145
106
  else {
146
- // Never a silent zero: real extracts come from `createUnifiedSchema`, which always creates
147
- // `names`. A extract without it has no alias surface to lose, but say so rather than reporting
148
- // "0 aliases" from a table that was never read.
149
107
  progress("postcode-aliases", `${extractPath} has no \`names\` table — no delivery-city aliases to fold`);
150
108
  }
151
109
  return { primaries, aliases, scoped, ancestorRows };
@@ -1 +1 @@
1
- {"version":3,"file":"extract-fold.js","sourceRoot":"","sources":["../../lib/candidate/extract-fold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extract-fold.js","sourceRoot":"","sources":["../../lib/candidate/extract-fold.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAG7D,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AAIlG,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAE3D,SAAS,qBAAqB,CAAC,EAA+B,EAAE,KAA8B;IAC7F,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;IAE1C,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAA;IAChB,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE;SAChB,OAAO,CACP,2GAA2G,CAC3G;SACA,OAAO,EAAE,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;QAEjC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;QAChC,CAAC;IACF,CAAC;IAED,OAAO,QAAQ,CAAA;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,GAU3B;IACA,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;IAElF,QAAQ,CAAC,gBAAgB,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE,WAAW,WAAW,EAAE,CAAC,CAAA;IAElG,MAAM,EAAE,GAAG,IAAI,cAAc,CAAc,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAErC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAA;IAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAkB,CAAA;IAE7F,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAC9B,yBAAyB,wBAAwB,YAAY,0BAA0B,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACpH,CAAA;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAC9B,uFAAuF,wBAAwB,kCAAkC,CACjJ,CAAA;IAED,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,IAAI,YAAY,GAAG,CAAC,CAAA;IAEpB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEjB,KAAK,MAAM,CAAC,IAAI,EAAE;SAChB,OAAO,CACP;;sEAEmE,CACnE;SACA,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QACjC,MAAM,GAAG,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;QAEzC,IAAI,CAAC,GAAG;YAAE,SAAQ;QAElB,MAAM,GAAG,GAAG,CAAC,CAAC,QAAkB,CAAA;QAChC,MAAM,GAAG,GAAG,CAAC,CAAC,SAAmB,CAAA;QACjC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QAEjC,MAAM,CAAC,GAAe;YACrB,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,OAAwB,CAAC;YACrC,GAAG;YACH,IAAI,EAAE,MAAM;YACZ,IAAI;YACJ,GAAG;YACH,GAAG;YACH,KAAK,EAAG,CAAC,CAAC,KAAgB,IAAI,GAAG;YACjC,KAAK,EAAG,CAAC,CAAC,KAAgB,IAAI,GAAG;YACjC,KAAK,EAAG,CAAC,CAAC,KAAgB,IAAI,GAAG;YACjC,KAAK,EAAG,CAAC,CAAC,KAAgB,IAAI,GAAG;YACjC,GAAG,EAAE,CAAC;YACN,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,GAAG;YAET,GAAG,EAAE,IAAI;SACT,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAClB,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAEvB,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,GAAG,CAAC,KAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAA;YAEnC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YAElE,MAAM,EAAE,CAAA;YAER,YAAY,EAAE,CAAA;YAEd,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7C,WAAW,CAAC,GAAG,CACd,EAAE,EACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EACtB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAC1B,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAChC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,EAC9B,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAClC,CAAA;gBAED,YAAY,EAAE,CAAA;YACf,CAAC;QACF,CAAC;QAED,SAAS,EAAE,CAAA;IACZ,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAElB,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAEzC,IAAI,QAAQ,EAAE,CAAC;QACd,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAEjB,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YACpE,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YAEnC,IAAI,CAAC,CAAC;gBAAE,SAAQ;YAEhB,MAAM,CAAC,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAA;YAEvD,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI;gBAAE,SAAQ;YAEhC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAE/B,OAAO,EAAE,CAAA;QACV,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACnB,CAAC;SAAM,CAAC;QACP,QAAQ,CAAC,kBAAkB,EAAE,GAAG,WAAW,4DAA4D,CAAC,CAAA;IACzG,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;AACpD,CAAC"}
@@ -3,35 +3,17 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * FTS5-TRIGRAM fuzzy index over the candidate gazetteer's `name_key` — the typo-tolerant fallback
7
- * the exact `name_key` B-tree probe structurally can't do (a misspelling breaks the normalized
8
- * key, so the contiguous-probe lookup returns nothing). It indexes the NORMALIZED key (not the
9
- * raw `name`), so a diacritic-stripped query (`munchen`) trigram-matches the stored `munchen`
10
- * rather than missing a raw `München`. The trigram tokenizer makes MATCH a substring/fuzzy
11
- * operation; the reader ({@link WOFCandidateTableLookup}) OR's the query's trigrams to fetch a
12
- * loose set, then re-ranks it with a WORD-level similarity. The trigram index is the candidate
13
- * GENERATOR, not the scorer — trigram Jaccard scores a true transposition correction BELOW a wrong
14
- * answer, because shared generic suffixes count as evidence and transpositions count against it.
15
- * The receipts are on `candidate-lookup.ts`'s `FUZZY_FETCH` and `WORD_FUZZY_MIN`.
16
- *
17
- * This is what unifies the two gazetteers: the candidate B-tree stays the common,
18
- * byte-range-optimal fast path (the browser's contiguous probe), and FTS5 is consulted ONLY on an
19
- * exact+strip miss — so its scattered postings cost is rare/amortized, and one DB serves both the
20
- * browser and the server.
21
- *
22
- * Raw SQL on purpose: Kysely can't express `CREATE VIRTUAL TABLE … USING fts5` (the repo's
23
- * FTS5-stays-raw rule). Indexing DISTINCT `name_key` keeps the index to unique normalized forms
24
- * (a name_key fans out to many candidate rows — placetypes, regions, aliases — but the fuzzy
25
- * fallback only needs to recover the name_key, then re-probes the B-tree for its rows).
6
+ * FTS5-trigram fuzzy index over the candidate gazetteer's normalized `name_key`; raw SQL on purpose, since Kysely cannot express `create virtual table … using fts5`.
26
7
  */
27
8
  import type { DatabaseClient } from "@mailwoman/sqlite/client";
28
9
  /**
29
- * Name of the FTS5 trigram virtual table this module owns. The reader conditions its fuzzy fallback on it.
10
+ * Name of the FTS5 trigram virtual table this module owns, on which the reader
11
+ * conditions its fuzzy fallback.
30
12
  */
31
13
  export declare const CANDIDATE_FTS_TABLE = "candidate_fts";
32
14
  /**
33
- * Build (or rebuild) {@link CANDIDATE_FTS_TABLE} from the materialized `candidate` table. Call after the candidate
34
- * B-tree is populated (build pipeline) or against an existing candidate DB (migration).
15
+ * Build (or rebuild) {@link CANDIDATE_FTS_TABLE} from the materialized `candidate` table. call
16
+ * after the candidate B-tree is populated or against an existing candidate DB.
35
17
  */
36
18
  export declare function createCandidateFTS<DB>(db: DatabaseClient<DB>): void;
37
19
  //# sourceMappingURL=fts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../lib/candidate/fts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE9D;;GAEG;AACH,eAAO,MAAM,mBAAmB,kBAAkB,CAAA;AAElD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,IAAI,CAOnE"}
1
+ {"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../lib/candidate/fts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE9D;;;GAGG;AACH,eAAO,MAAM,mBAAmB,kBAAkB,CAAA;AAElD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,IAAI,CAOnE"}
@@ -3,34 +3,16 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * FTS5-TRIGRAM fuzzy index over the candidate gazetteer's `name_key` — the typo-tolerant fallback
7
- * the exact `name_key` B-tree probe structurally can't do (a misspelling breaks the normalized
8
- * key, so the contiguous-probe lookup returns nothing). It indexes the NORMALIZED key (not the
9
- * raw `name`), so a diacritic-stripped query (`munchen`) trigram-matches the stored `munchen`
10
- * rather than missing a raw `München`. The trigram tokenizer makes MATCH a substring/fuzzy
11
- * operation; the reader ({@link WOFCandidateTableLookup}) OR's the query's trigrams to fetch a
12
- * loose set, then re-ranks it with a WORD-level similarity. The trigram index is the candidate
13
- * GENERATOR, not the scorer — trigram Jaccard scores a true transposition correction BELOW a wrong
14
- * answer, because shared generic suffixes count as evidence and transpositions count against it.
15
- * The receipts are on `candidate-lookup.ts`'s `FUZZY_FETCH` and `WORD_FUZZY_MIN`.
16
- *
17
- * This is what unifies the two gazetteers: the candidate B-tree stays the common,
18
- * byte-range-optimal fast path (the browser's contiguous probe), and FTS5 is consulted ONLY on an
19
- * exact+strip miss — so its scattered postings cost is rare/amortized, and one DB serves both the
20
- * browser and the server.
21
- *
22
- * Raw SQL on purpose: Kysely can't express `CREATE VIRTUAL TABLE … USING fts5` (the repo's
23
- * FTS5-stays-raw rule). Indexing DISTINCT `name_key` keeps the index to unique normalized forms
24
- * (a name_key fans out to many candidate rows — placetypes, regions, aliases — but the fuzzy
25
- * fallback only needs to recover the name_key, then re-probes the B-tree for its rows).
6
+ * FTS5-trigram fuzzy index over the candidate gazetteer's normalized `name_key`; raw SQL on purpose, since Kysely cannot express `create virtual table … using fts5`.
26
7
  */
27
8
  /**
28
- * Name of the FTS5 trigram virtual table this module owns. The reader conditions its fuzzy fallback on it.
9
+ * Name of the FTS5 trigram virtual table this module owns, on which the reader
10
+ * conditions its fuzzy fallback.
29
11
  */
30
12
  export const CANDIDATE_FTS_TABLE = "candidate_fts";
31
13
  /**
32
- * Build (or rebuild) {@link CANDIDATE_FTS_TABLE} from the materialized `candidate` table. Call after the candidate
33
- * B-tree is populated (build pipeline) or against an existing candidate DB (migration).
14
+ * Build (or rebuild) {@link CANDIDATE_FTS_TABLE} from the materialized `candidate` table. call
15
+ * after the candidate B-tree is populated or against an existing candidate DB.
34
16
  */
35
17
  export function createCandidateFTS(db) {
36
18
  db.exec(`DROP TABLE IF EXISTS ${CANDIDATE_FTS_TABLE}`);
@@ -1 +1 @@
1
- {"version":3,"file":"fts.js","sourceRoot":"","sources":["../../lib/candidate/fts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,eAAe,CAAA;AAElD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAK,EAAsB;IAC5D,EAAE,CAAC,IAAI,CAAC,wBAAwB,mBAAmB,EAAE,CAAC,CAAA;IACtD,EAAE,CAAC,IAAI,CAAC,wBAAwB,mBAAmB,2CAA2C,CAAC,CAAA;IAE/F,EAAE,CAAC,IAAI,CACN,eAAe,mBAAmB,+EAA+E,CACjH,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"fts.js","sourceRoot":"","sources":["../../lib/candidate/fts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,eAAe,CAAA;AAElD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAK,EAAsB;IAC5D,EAAE,CAAC,IAAI,CAAC,wBAAwB,mBAAmB,EAAE,CAAC,CAAA;IACtD,EAAE,CAAC,IAAI,CAAC,wBAAwB,mBAAmB,2CAA2C,CAAC,CAAA;IAE/F,EAAE,CAAC,IAAI,CACN,eAAe,mBAAmB,+EAA+E,CACjH,CAAA;AACF,CAAC"}
@@ -3,65 +3,48 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * The score side of the candidate build (#28) — load a WOF admin database's `place_importance` into
7
- * a lookup the candidate builder can probe per place, so every candidate row can carry the
6
+ * The score side of the candidate build: load a WOF admin database's `place_importance` into a
7
+ * lookup the candidate builder probes per place, so every candidate row can include the
8
8
  * toponym-fame prior a bare city name is decided on.
9
9
  *
10
- * ## Why this joins on the NAME and not on the id
10
+ * The join key is `(name_key, country, placetype)`, the same {@link normalizeLocalityForKey} the
11
+ * candidate build uses for its probe key, so the two sides fold identically. An id join is wrong
12
+ * here, because the score source (`admin-global-priority-importance.db`) and the candidate build's
13
+ * admin source are different snapshots whose ids disagree. An id join silently drops rows and
14
+ * leaves the ranking inert on the queries the prior exists for.
11
15
  *
12
- * The obvious join is `candidate.spr_id = place_importance.id`, and it is wrong here. The score
13
- * source (`admin-global-priority-importance.db`) and the candidate build's admin source are
14
- * DIFFERENT SNAPSHOTS, and they disagree about ids for exactly the rows that matter: Whitby,
15
- * Ontario is `8143502164401` in the shipped `candidate.db` and `8000001156384` in the score source
16
- * — the Overture-sourced rows were re-keyed between the two. An id join silently drops every one of
17
- * them, which means it drops precisely the FOREIGN HOMONYMS the fame prior exists to demote, and it
18
- * drops them invisibly: the build succeeds, the column is populated, and the ranking is inert on
19
- * the queries it was built for.
16
+ * The key by itself is not enough. `(warwick, US, locality)` covers eleven different places.
17
+ * The group's maximum would give every Warwick in America the fame of Warwick, Rhode Island.
18
+ * The join picks the nearest centroid when it falls within {@link IMPORTANCE_JOIN_RADIUS_KM}.
19
+ * Two artifacts describing the same settlement put its centroid
20
+ * in almost the same place. Two towns with the same name in one country do not.
20
21
  *
21
- * So the join key is `(name_key, country, placetype)` — the same {@link normalizeLocalityForKey} the
22
- * candidate build uses for its probe key, so the two sides fold identically by construction.
22
+ * `place_importance.importance` lands in the column verbatim, the pre-split conflation that is
23
+ * encyclopedia-derived where the concordance matched and a population-derived proxy everywhere
24
+ * else. See {@link CandidateTable.importance} for why the split `encyclopedic` channel is not what
25
+ * is written here.
23
26
  *
24
- * ## Why the key alone is not enough
25
- *
26
- * `(warwick, US, locality)` names ELEVEN different places. Taking the group's max would give every
27
- * Warwick in America the fame of Warwick, Rhode Island, which is the fan-out defect
28
- * `importance-fanout.ts` documents one layer up, re-introduced at the join. So the group is
29
- * disambiguated GEOGRAPHICALLY: the nearest centroid wins, and only within
30
- * {@link IMPORTANCE_JOIN_RADIUS_KM}. Two artifacts describing the same settlement put its centroid in
31
- * almost the same place; two same-named towns in one country do not.
32
- *
33
- * ## What lands in the column
34
- *
35
- * `place_importance.importance` VERBATIM — the pre-split conflation (encyclopedia-derived where
36
- * the concordance matched, a population-derived proxy everywhere else). See
37
- * {@link CandidateTable.importance} for why the split `encyclopedic` channel is deliberately NOT
38
- * what is written here, with the measurement that settled it.
39
- *
40
- * A place with no match gets NULL. NULL is UNMEASURED, never zero — the consumer
41
- * (`resolver/toponym-prior.ts`) leaves an unmeasured candidate exactly where population put it.
27
+ * A place with no match gets NULL. NULL means the place's fame is unmeasured.
28
+ * The consumer (`resolver/toponym-prior.ts`) leaves an unmeasured candidate at the position
29
+ * population assigned it.
42
30
  */
31
+ import type { PathBuilderLike } from "path-ts";
43
32
  /**
44
33
  * How far apart two artifacts may put the same place's centroid and still be read as the same place.
45
34
  *
46
- * MEASURED, not guessed (2026-08-10, `admin-global-priority.db` × `admin-global-priority-importance.db`; 4,476,245
47
- * current locality-tier places against 676,790 scored ones, 1,020,099 of which matched a scored group by `(name_key,
48
- * country, placetype)`). The nearest-centroid distance is **exactly 0.00 km for 577,080 of them (56.6%)** — the two
49
- * snapshots agree to the bit — and 656,755 (64.4%) are inside 500 m.
35
+ * Measured from two admin snapshots.
36
+ * The nearest-centroid distances separate into a mode where the two snapshots agree
37
+ * and a background rate of two different towns wearing one name in one country.
50
38
  *
51
- * What sets the radius is where that mode ENDS, and the per-kilometre density states. It falls from 1,076 places/km
52
- * over 3–5 km to a trough of **441 places/km over 7–10 km**, then climbs back and flattens onto a plateau of 760–780
53
- * places/km from 30 km out to 100 km and beyond. That plateau is the background rate of two DIFFERENT towns wearing one
54
- * name in one country, and it does not decay with distance because there is no reason it should. 10 km is the floor
55
- * between the two populations. Admitting it scores 679,163 places (66.6% of the matched set); pushing the radius to 25
56
- * km buys 8,722 more, and by then better than half of each additional kilometre is the wrong town.
39
+ * The background rate does not decay with distance.
40
+ * Ten kilometers separates the two populations.
57
41
  *
58
- * The four-row bare-GB board is insensitive across this whole range — 5 km and 25 km were both measured and select
59
- * identical rows — so the value is chosen by what the join MEANS, not by what it scores. The radius is the definition
60
- * of "this is the same place"; widening it past the floor starts handing one town's fame to another.
42
+ * That distance matches the join's purpose.
43
+ * A radius above the floor starts handing one town's fame to another.
61
44
  */
62
45
  export declare const IMPORTANCE_JOIN_RADIUS_KM = 10;
63
46
  /**
64
- * One scored place from the source: where it is, and what it scored.
47
+ * One scored place from the source, with its coordinates and importance score.
65
48
  */
66
49
  interface ScoredPlace {
67
50
  lat: number;
@@ -69,8 +52,10 @@ interface ScoredPlace {
69
52
  importance: number;
70
53
  }
71
54
  /**
72
- * What {@link loadImportanceIndex} measured while reading the source. Reported by the builder so a run says how much of
73
- * the gazetteer it actually scored, rather than leaving the caller to infer it from a column full of nulls.
55
+ * What {@link loadImportanceIndex} measured while reading the source.
56
+ *
57
+ * Reported by the builder so a run reports how much of the gazetteer it actually scored,
58
+ * rather than leaving the caller to infer it from a column full of nulls.
74
59
  */
75
60
  export interface ImportanceIndexStats {
76
61
  /**
@@ -82,7 +67,8 @@ export interface ImportanceIndexStats {
82
67
  */
83
68
  keys: number;
84
69
  /**
85
- * Places whose name folded to the empty key and could never be joined (non-Latin punctuation-only names, blanks).
70
+ * Places whose name folded to the empty key and could never be joined
71
+ * (non-Latin punctuation-only names, blanks).
86
72
  */
87
73
  unkeyable: number;
88
74
  }
@@ -97,36 +83,45 @@ export declare class ImportanceIndex {
97
83
  */
98
84
  matched: number;
99
85
  /**
100
- * Places {@link find} REFUSED — the key matched a scored group, but the nearest member of it was outside the radius,
86
+ * Places {@link find} refused.
87
+ *
88
+ * The key matched a scored group, but the nearest member was outside the radius,
101
89
  * so it is a different place wearing the same name.
102
90
  *
103
- * This is the number worth watching across rebuilds. A jump means the score source and the admin source have drifted
104
- * apart and the join is being asked to guess; it does not mean the radius is too tight.
91
+ * This is the number worth watching across rebuilds.
92
+ * A jump means the score source and the admin source have drifted apart
93
+ * and the join is being asked to guess.
94
+ * It does not mean the radius is too tight.
105
95
  */
106
96
  refused: number;
107
97
  constructor(groups: Map<string, ScoredPlace[]>, stats: ImportanceIndexStats);
108
98
  /**
109
- * The importance of the scored place nearest `(lat, lon)` sharing `name`'s folded key, `country` and `placetype`, or
110
- * null when there is no such place within {@link IMPORTANCE_JOIN_RADIUS_KM}.
99
+ * The importance of the scored place nearest `(lat, lon)` sharing `name`'s folded key, `country`
100
+ * and `placetype`, or null when there is no such place within {@link IMPORTANCE_JOIN_RADIUS_KM}.
101
+ *
102
+ * Null is unmeasured.
103
+ * Keep the value null.
104
+ * Do not substitute zero or a population-derived value here.
111
105
  *
112
- * Null is UNMEASURED. Never substitute a zero, and never fall back to a population-derived value here — the source
113
- * column already carries that fallback where it has one, and inventing a second one would make an absence
114
- * indistinguishable from a measurement.
106
+ * The source column already contains a population-derived fallback where one exists.
107
+ * A second fallback would make an absence indistinguishable from a measurement.
115
108
  */
116
109
  find(name: string, country: string | null, placetype: string | null, lat: number, lon: number): number | null;
117
110
  }
118
111
  /**
119
- * Read `place_importance` (joined to `spr` for the name/country/placetype/centroid) out of a WOF admin database into an
120
- * {@link ImportanceIndex}.
112
+ * Read `place_importance` from a WOF admin database and join it to `spr`.
113
+ *
114
+ * The join retrieves each place's name, country, placetype, plus its centroid.
115
+ * These fields populate an {@link ImportanceIndex}.
116
+ *
117
+ * Only current, non-deprecated places are indexed.
118
+ * A superseded row's score belongs to a place the gazetteer no longer contains.
121
119
  *
122
- * Only CURRENT, non-deprecated places are indexed — a superseded row's score belongs to a place the gazetteer no longer
123
- * carries, and letting it win the nearest-centroid contest would hand a live place a dead one's fame.
120
+ * If that row won the nearest-centroid contest, a live place would inherit the superseded place's fame.
124
121
  *
125
- * The whole table is held in memory on purpose. The 2026-08-10 source holds 676,790 scored places in 544,823 groups,
126
- * and the build probes it once for every one of its ~4.8 M places; the alternative is a prepared statement per place
127
- * against a 3.7 GB database. Measured end to end, loading the index plus probing all 4.48 M locality-tier places takes
128
- * 25 s.
122
+ * The whole table is held in memory on purpose, because the build probes it once for every place
123
+ * and the alternative is a prepared statement per place against a multi-gigabyte database.
129
124
  */
130
- export declare function loadImportanceIndex(databasePath: string): ImportanceIndex;
125
+ export declare function loadImportanceIndex(databasePath: PathBuilderLike): ImportanceIndex;
131
126
  export {};
132
127
  //# sourceMappingURL=importance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"importance.d.ts","sourceRoot":"","sources":["../../lib/candidate/importance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAQH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAA;AAE3C;;GAEG;AACH,UAAU,WAAW;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACpC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;CACjB;AAUD;;GAEG;AACH,qBAAa,eAAe;;IAE3B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAA;IACpC;;OAEG;IACH,OAAO,SAAI;IACX;;;;;;OAMG;IACH,OAAO,SAAI;IAEX,YAAY,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAG1E;IAED;;;;;;;OAOG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8B5G;CACD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,eAAe,CAwCzE"}
1
+ {"version":3,"file":"importance.d.ts","sourceRoot":"","sources":["../../lib/candidate/importance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAK9C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAA;AAE3C;;GAEG;AACH,UAAU,WAAW;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;CAClB;AAED;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAA;CACjB;AAYD;;GAEG;AACH,qBAAa,eAAe;;IAE3B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAA;IACpC;;OAEG;IACH,OAAO,SAAI;IACX;;;;;;;;;;OAUG;IACH,OAAO,SAAI;IAEX,YAAY,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAG1E;IAED;;;;;;;;;;OAUG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8B5G;CACD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,eAAe,GAAG,eAAe,CAwClF"}