@mailwoman/resolver-wof-sqlite 9.4.0 → 10.1.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 (548) hide show
  1. package/README.md +8 -8
  2. package/lib/address/{point-interpolation.ts → point/interpolation.ts} +40 -38
  3. package/lib/address/point/schema.ts +132 -0
  4. package/lib/address/point.ts +68 -81
  5. package/lib/{address/index.ts → address.ts} +2 -2
  6. package/lib/ancestry/backfill.ts +24 -88
  7. package/lib/{ancestry/index.ts → ancestry.ts} +19 -15
  8. package/lib/build/candidate.ts +608 -0
  9. package/lib/build/population-corrections.ts +64 -0
  10. package/lib/build/slim.ts +338 -0
  11. package/lib/candidate/alias-bags.ts +74 -14
  12. package/lib/candidate/ancestors/schema.ts +211 -0
  13. package/lib/candidate/{ancestors-sidecar.ts → ancestors/sidecar.ts} +17 -24
  14. package/lib/candidate/country-display-names.ts +6 -20
  15. package/lib/candidate/extract-fold.ts +12 -57
  16. package/lib/candidate/fts.ts +28 -0
  17. package/lib/candidate/importance.ts +221 -0
  18. package/lib/candidate/lookup.ts +669 -0
  19. package/lib/candidate/name-roles.ts +16 -34
  20. package/lib/candidate/own-name.ts +34 -31
  21. package/lib/candidate/place-attrs.ts +20 -13
  22. package/lib/candidate/schema.ts +211 -0
  23. package/lib/candidate/scoring.ts +222 -0
  24. package/lib/capital-schema.ts +21 -17
  25. package/lib/capitals.ts +26 -24
  26. package/lib/coincident-roles.ts +74 -55
  27. package/lib/convention/schema.ts +13 -7
  28. package/lib/convention.ts +144 -0
  29. package/lib/coverage-manifest-schema.ts +34 -39
  30. package/lib/currency-backfill.ts +24 -69
  31. package/lib/env.ts +1 -1
  32. package/lib/exact-match.ts +31 -20
  33. package/lib/extracts.ts +96 -73
  34. package/lib/fst/autocomplete.ts +52 -35
  35. package/lib/fst/builder.ts +30 -36
  36. package/lib/fst/deserialize-web.ts +8 -9
  37. package/lib/fst/format.ts +41 -23
  38. package/lib/fst/freshness.ts +17 -95
  39. package/lib/fst/matcher.ts +2 -2
  40. package/lib/fst/serialize.ts +45 -60
  41. package/lib/fst/types.ts +71 -59
  42. package/lib/fts/query.ts +5 -36
  43. package/lib/fts.ts +280 -0
  44. package/lib/geonames/aliases.ts +72 -149
  45. package/lib/geonames/postal.ts +162 -77
  46. package/lib/index.ts +20 -27
  47. package/lib/interpolation.ts +43 -96
  48. package/lib/lookup.ts +137 -257
  49. package/lib/name-score.ts +9 -7
  50. package/lib/nsul/lookup.ts +36 -53
  51. package/lib/nsul/schema.ts +16 -43
  52. package/lib/paths.ts +159 -0
  53. package/lib/place-importance-schema.ts +57 -164
  54. package/lib/poi/lookup.ts +100 -109
  55. package/lib/poi/schema.ts +42 -26
  56. package/lib/polygon-schema.ts +10 -6
  57. package/lib/postal/city/alias/lookup.ts +79 -0
  58. package/lib/postal/{city-alias-schema.ts → city/alias/schema.ts} +14 -10
  59. package/lib/postal/{city-candidate-schema.ts → city/candidate-schema.ts} +26 -20
  60. package/lib/postal.ts +9 -0
  61. package/lib/postcode-point-lookup.ts +9 -19
  62. package/lib/primary-preference.ts +45 -125
  63. package/lib/proximity-rerank.ts +43 -32
  64. package/lib/ranking-weights.ts +98 -76
  65. package/lib/region-keys.ts +68 -40
  66. package/lib/reverse.ts +108 -72
  67. package/lib/schema.ts +74 -42
  68. package/lib/search-fetch.ts +90 -68
  69. package/lib/sqlite/convention-source.ts +57 -0
  70. package/lib/sqlite/utils.ts +79 -0
  71. package/lib/street/centroid/schema.ts +149 -0
  72. package/lib/street/centroid.ts +16 -25
  73. package/lib/street/{morphology-fst-builder.ts → morphology/fst/builder.ts} +56 -41
  74. package/lib/street/{morphology-fst-loader.ts → morphology/fst/loader.ts} +36 -29
  75. package/lib/street/name-lookup.ts +43 -35
  76. package/lib/street/normalize.ts +85 -216
  77. package/lib/street/segment-schema.ts +116 -43
  78. package/lib/{street/index.ts → street.ts} +3 -3
  79. package/lib/types.ts +94 -140
  80. package/lib/unified-schema.ts +29 -29
  81. package/lib/uprn/existence.ts +30 -19
  82. package/lib/uprn/lookup.ts +28 -67
  83. package/lib/uprn/schema.ts +18 -40
  84. package/lib/weights-overlay-linker.ts +204 -232
  85. package/out/address/point/interpolation.d.ts +45 -0
  86. package/out/address/point/interpolation.d.ts.map +1 -0
  87. package/out/address/{point-interpolation.js → point/interpolation.js} +38 -38
  88. package/out/address/point/interpolation.js.map +1 -0
  89. package/out/address/point/schema.d.ts +74 -0
  90. package/out/address/point/schema.d.ts.map +1 -0
  91. package/out/address/{point-schema.js → point/schema.js} +4 -20
  92. package/out/address/point/schema.js.map +1 -0
  93. package/out/address/point.d.ts +24 -21
  94. package/out/address/point.d.ts.map +1 -1
  95. package/out/address/point.js +60 -77
  96. package/out/address/point.js.map +1 -1
  97. package/out/{address/index.js → address.d.ts} +3 -3
  98. package/out/address.d.ts.map +1 -0
  99. package/out/{address/index.d.ts → address.js} +3 -3
  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 +18 -76
  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 +170 -0
  110. package/out/build/candidate.d.ts.map +1 -0
  111. package/out/{build-candidate.js → build/candidate.js} +33 -102
  112. package/out/build/candidate.js.map +1 -0
  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 +44 -0
  118. package/out/build/slim.d.ts.map +1 -0
  119. package/out/{build-slim.js → build/slim.js} +33 -94
  120. package/out/build/slim.js.map +1 -0
  121. package/out/candidate/alias-bags.d.ts +13 -5
  122. package/out/candidate/alias-bags.d.ts.map +1 -1
  123. package/out/candidate/alias-bags.js +55 -12
  124. package/out/candidate/alias-bags.js.map +1 -1
  125. package/out/candidate/ancestors/schema.d.ts +166 -0
  126. package/out/candidate/ancestors/schema.d.ts.map +1 -0
  127. package/out/candidate/ancestors/schema.js +131 -0
  128. package/out/candidate/ancestors/schema.js.map +1 -0
  129. package/out/candidate/ancestors/sidecar.d.ts +27 -0
  130. package/out/candidate/ancestors/sidecar.d.ts.map +1 -0
  131. package/out/candidate/{ancestors-sidecar.js → ancestors/sidecar.js} +17 -24
  132. package/out/candidate/ancestors/sidecar.js.map +1 -0
  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 +8 -16
  138. package/out/candidate/extract-fold.d.ts.map +1 -1
  139. package/out/candidate/extract-fold.js +6 -48
  140. package/out/candidate/extract-fold.js.map +1 -1
  141. package/out/candidate/fts.d.ts +19 -0
  142. package/out/candidate/fts.d.ts.map +1 -0
  143. package/out/candidate/fts.js +22 -0
  144. package/out/candidate/fts.js.map +1 -0
  145. package/out/candidate/importance.d.ts +127 -0
  146. package/out/candidate/importance.d.ts.map +1 -0
  147. package/out/candidate/importance.js +162 -0
  148. package/out/candidate/importance.js.map +1 -0
  149. package/out/candidate/lookup.d.ts +36 -0
  150. package/out/candidate/lookup.d.ts.map +1 -0
  151. package/out/candidate/lookup.js +456 -0
  152. package/out/candidate/lookup.js.map +1 -0
  153. package/out/candidate/name-roles.d.ts +10 -22
  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 +34 -31
  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 +120 -0
  166. package/out/candidate/schema.d.ts.map +1 -0
  167. package/out/{candidate-schema.js → candidate/schema.js} +11 -23
  168. package/out/candidate/schema.js.map +1 -0
  169. package/out/{candidate-scoring.d.ts → candidate/scoring.d.ts} +8 -9
  170. package/out/candidate/scoring.d.ts.map +1 -0
  171. package/out/candidate/scoring.js +157 -0
  172. package/out/candidate/scoring.js.map +1 -0
  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 +26 -24
  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 +61 -50
  184. package/out/coincident-roles.js.map +1 -1
  185. package/out/convention/schema.d.ts +12 -6
  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 +33 -38
  194. package/out/coverage-manifest-schema.d.ts.map +1 -1
  195. package/out/coverage-manifest-schema.js +20 -29
  196. package/out/coverage-manifest-schema.js.map +1 -1
  197. package/out/currency-backfill.d.ts +13 -35
  198. package/out/currency-backfill.d.ts.map +1 -1
  199. package/out/currency-backfill.js +12 -39
  200. package/out/currency-backfill.js.map +1 -1
  201. package/out/env.d.ts +2 -2
  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 +31 -20
  206. package/out/exact-match.js.map +1 -1
  207. package/out/extracts.d.ts +65 -54
  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 +28 -20
  212. package/out/fst/autocomplete.d.ts.map +1 -1
  213. package/out/fst/autocomplete.js +38 -27
  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 +30 -36
  217. package/out/fst/builder.js.map +1 -1
  218. package/out/fst/deserialize-web.d.ts +3 -3
  219. package/out/fst/deserialize-web.d.ts.map +1 -1
  220. package/out/fst/deserialize-web.js +8 -9
  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 +11 -73
  227. package/out/fst/freshness.d.ts.map +1 -1
  228. package/out/fst/freshness.js +12 -76
  229. package/out/fst/freshness.js.map +1 -1
  230. package/out/fst/matcher.d.ts +1 -1
  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 +30 -26
  235. package/out/fst/serialize.d.ts.map +1 -1
  236. package/out/fst/serialize.js +44 -58
  237. package/out/fst/serialize.js.map +1 -1
  238. package/out/fst/types.d.ts +71 -59
  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} +1 -1
  243. package/out/fst.d.ts.map +1 -0
  244. package/out/{fst/index.d.ts → fst.js} +1 -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 -67
  255. package/out/geonames/aliases.d.ts.map +1 -1
  256. package/out/geonames/aliases.js +44 -121
  257. package/out/geonames/aliases.js.map +1 -1
  258. package/out/geonames/postal.d.ts +84 -50
  259. package/out/geonames/postal.d.ts.map +1 -1
  260. package/out/geonames/postal.js +115 -78
  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 +20 -21
  267. package/out/index.d.ts.map +1 -1
  268. package/out/index.js +14 -15
  269. package/out/index.js.map +1 -1
  270. package/out/interpolation.d.ts +15 -52
  271. package/out/interpolation.d.ts.map +1 -1
  272. package/out/interpolation.js +25 -68
  273. package/out/interpolation.js.map +1 -1
  274. package/out/lookup.d.ts +24 -53
  275. package/out/lookup.d.ts.map +1 -1
  276. package/out/lookup.js +117 -223
  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 +49 -141
  299. package/out/place-importance-schema.d.ts.map +1 -1
  300. package/out/place-importance-schema.js +25 -140
  301. package/out/place-importance-schema.js.map +1 -1
  302. package/out/poi/lookup.d.ts +38 -42
  303. package/out/poi/lookup.d.ts.map +1 -1
  304. package/out/poi/lookup.js +67 -90
  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 → city/alias/lookup.d.ts} +22 -25
  319. package/out/postal/city/alias/lookup.d.ts.map +1 -0
  320. package/out/postal/city/alias/lookup.js +49 -0
  321. package/out/postal/city/alias/lookup.js.map +1 -0
  322. package/out/postal/{city-alias-schema.d.ts → city/alias/schema.d.ts} +15 -11
  323. package/out/postal/city/alias/schema.d.ts.map +1 -0
  324. package/out/postal/{city-alias-schema.js → city/alias/schema.js} +11 -9
  325. package/out/postal/city/alias/schema.js.map +1 -0
  326. package/out/postal/city/candidate-schema.d.ts +72 -0
  327. package/out/postal/city/candidate-schema.d.ts.map +1 -0
  328. package/out/postal/city/candidate-schema.js +60 -0
  329. package/out/postal/city/candidate-schema.js.map +1 -0
  330. package/out/postal.d.ts +9 -0
  331. package/out/postal.d.ts.map +1 -0
  332. package/out/postal.js +9 -0
  333. package/out/postal.js.map +1 -0
  334. package/out/postcode-point-lookup.d.ts +9 -19
  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 +39 -93
  339. package/out/primary-preference.d.ts.map +1 -1
  340. package/out/primary-preference.js +13 -97
  341. package/out/primary-preference.js.map +1 -1
  342. package/out/proximity-rerank.d.ts +40 -29
  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 +91 -62
  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 +48 -29
  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 +75 -50
  355. package/out/reverse.d.ts.map +1 -1
  356. package/out/reverse.js +61 -49
  357. package/out/reverse.js.map +1 -1
  358. package/out/schema.d.ts +74 -42
  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 +25 -0
  367. package/out/sqlite/convention-source.d.ts.map +1 -0
  368. package/out/sqlite/convention-source.js +48 -0
  369. package/out/sqlite/convention-source.js.map +1 -0
  370. package/out/sqlite/utils.d.ts +45 -0
  371. package/out/sqlite/utils.d.ts.map +1 -0
  372. package/out/sqlite/utils.js +56 -0
  373. package/out/sqlite/utils.js.map +1 -0
  374. package/out/street/centroid/schema.d.ts +100 -0
  375. package/out/street/centroid/schema.d.ts.map +1 -0
  376. package/out/street/centroid/schema.js +66 -0
  377. package/out/street/centroid/schema.js.map +1 -0
  378. package/out/street/centroid.d.ts +9 -19
  379. package/out/street/centroid.d.ts.map +1 -1
  380. package/out/street/centroid.js +11 -22
  381. package/out/street/centroid.js.map +1 -1
  382. package/out/street/{morphology-fst-builder.d.ts → morphology/fst/builder.d.ts} +21 -11
  383. package/out/street/morphology/fst/builder.d.ts.map +1 -0
  384. package/out/street/{morphology-fst-builder.js → morphology/fst/builder.js} +40 -34
  385. package/out/street/morphology/fst/builder.js.map +1 -0
  386. package/out/street/morphology/fst/loader.d.ts +74 -0
  387. package/out/street/morphology/fst/loader.d.ts.map +1 -0
  388. package/out/street/{morphology-fst-loader.js → morphology/fst/loader.js} +21 -21
  389. package/out/street/morphology/fst/loader.js.map +1 -0
  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 +32 -31
  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 +74 -191
  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.d.ts → street.d.ts} +4 -4
  403. package/out/street.d.ts.map +1 -0
  404. package/out/{street/index.js → street.js} +4 -4
  405. package/out/street.js.map +1 -0
  406. package/out/types.d.ts +69 -138
  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 +20 -56
  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 +132 -141
  431. package/out/weights-overlay-linker.d.ts.map +1 -1
  432. package/out/weights-overlay-linker.js +86 -154
  433. package/out/weights-overlay-linker.js.map +1 -1
  434. package/package.json +94 -599
  435. package/lib/address/point-schema.ts +0 -155
  436. package/lib/build-candidate.ts +0 -632
  437. package/lib/build-slim.ts +0 -408
  438. package/lib/candidate-ancestors-schema.ts +0 -195
  439. package/lib/candidate-fts.ts +0 -46
  440. package/lib/candidate-importance.ts +0 -224
  441. package/lib/candidate-lookup.ts +0 -977
  442. package/lib/candidate-schema.ts +0 -247
  443. package/lib/candidate-scoring.ts +0 -261
  444. package/lib/convention/index.ts +0 -154
  445. package/lib/fts/index.ts +0 -361
  446. package/lib/postal/city-alias-lookup.ts +0 -97
  447. package/lib/postal/index.ts +0 -9
  448. package/lib/sqlite-convention-source.ts +0 -65
  449. package/lib/sqlite-utils.ts +0 -82
  450. package/lib/street/centroid-schema.ts +0 -154
  451. package/out/address/index.d.ts.map +0 -1
  452. package/out/address/index.js.map +0 -1
  453. package/out/address/point-interpolation.d.ts +0 -49
  454. package/out/address/point-interpolation.d.ts.map +0 -1
  455. package/out/address/point-interpolation.js.map +0 -1
  456. package/out/address/point-schema.d.ts +0 -97
  457. package/out/address/point-schema.d.ts.map +0 -1
  458. package/out/address/point-schema.js.map +0 -1
  459. package/out/ancestry/index.d.ts +0 -45
  460. package/out/ancestry/index.d.ts.map +0 -1
  461. package/out/ancestry/index.js +0 -55
  462. package/out/ancestry/index.js.map +0 -1
  463. package/out/build-candidate.d.ts +0 -184
  464. package/out/build-candidate.d.ts.map +0 -1
  465. package/out/build-candidate.js.map +0 -1
  466. package/out/build-slim.d.ts +0 -80
  467. package/out/build-slim.d.ts.map +0 -1
  468. package/out/build-slim.js.map +0 -1
  469. package/out/candidate/ancestors-sidecar.d.ts +0 -32
  470. package/out/candidate/ancestors-sidecar.d.ts.map +0 -1
  471. package/out/candidate/ancestors-sidecar.js.map +0 -1
  472. package/out/candidate-ancestors-schema.d.ts +0 -150
  473. package/out/candidate-ancestors-schema.d.ts.map +0 -1
  474. package/out/candidate-ancestors-schema.js +0 -123
  475. package/out/candidate-ancestors-schema.js.map +0 -1
  476. package/out/candidate-fts.d.ts +0 -37
  477. package/out/candidate-fts.d.ts.map +0 -1
  478. package/out/candidate-fts.js +0 -40
  479. package/out/candidate-fts.js.map +0 -1
  480. package/out/candidate-importance.d.ts +0 -132
  481. package/out/candidate-importance.d.ts.map +0 -1
  482. package/out/candidate-importance.js +0 -169
  483. package/out/candidate-importance.js.map +0 -1
  484. package/out/candidate-lookup.d.ts +0 -76
  485. package/out/candidate-lookup.d.ts.map +0 -1
  486. package/out/candidate-lookup.js +0 -768
  487. package/out/candidate-lookup.js.map +0 -1
  488. package/out/candidate-schema.d.ts +0 -155
  489. package/out/candidate-schema.d.ts.map +0 -1
  490. package/out/candidate-schema.js.map +0 -1
  491. package/out/candidate-scoring.d.ts.map +0 -1
  492. package/out/candidate-scoring.js +0 -196
  493. package/out/candidate-scoring.js.map +0 -1
  494. package/out/convention/index.d.ts +0 -106
  495. package/out/convention/index.d.ts.map +0 -1
  496. package/out/convention/index.js +0 -93
  497. package/out/convention/index.js.map +0 -1
  498. package/out/fst/index.d.ts.map +0 -1
  499. package/out/fst/index.js.map +0 -1
  500. package/out/fts/index.d.ts +0 -184
  501. package/out/fts/index.d.ts.map +0 -1
  502. package/out/fts/index.js +0 -277
  503. package/out/fts/index.js.map +0 -1
  504. package/out/geonames/index.d.ts.map +0 -1
  505. package/out/geonames/index.js.map +0 -1
  506. package/out/nsul/index.d.ts.map +0 -1
  507. package/out/nsul/index.js.map +0 -1
  508. package/out/poi/index.d.ts.map +0 -1
  509. package/out/poi/index.js.map +0 -1
  510. package/out/postal/city-alias-lookup.d.ts.map +0 -1
  511. package/out/postal/city-alias-lookup.js +0 -62
  512. package/out/postal/city-alias-lookup.js.map +0 -1
  513. package/out/postal/city-alias-schema.d.ts.map +0 -1
  514. package/out/postal/city-alias-schema.js.map +0 -1
  515. package/out/postal/city-candidate-schema.d.ts +0 -66
  516. package/out/postal/city-candidate-schema.d.ts.map +0 -1
  517. package/out/postal/city-candidate-schema.js +0 -56
  518. package/out/postal/city-candidate-schema.js.map +0 -1
  519. package/out/postal/index.d.ts +0 -9
  520. package/out/postal/index.d.ts.map +0 -1
  521. package/out/postal/index.js +0 -9
  522. package/out/postal/index.js.map +0 -1
  523. package/out/sqlite-convention-source.d.ts +0 -29
  524. package/out/sqlite-convention-source.d.ts.map +0 -1
  525. package/out/sqlite-convention-source.js +0 -57
  526. package/out/sqlite-convention-source.js.map +0 -1
  527. package/out/sqlite-utils.d.ts +0 -45
  528. package/out/sqlite-utils.d.ts.map +0 -1
  529. package/out/sqlite-utils.js +0 -57
  530. package/out/sqlite-utils.js.map +0 -1
  531. package/out/street/centroid-schema.d.ts +0 -105
  532. package/out/street/centroid-schema.d.ts.map +0 -1
  533. package/out/street/centroid-schema.js +0 -78
  534. package/out/street/centroid-schema.js.map +0 -1
  535. package/out/street/index.d.ts.map +0 -1
  536. package/out/street/index.js.map +0 -1
  537. package/out/street/morphology-fst-builder.d.ts.map +0 -1
  538. package/out/street/morphology-fst-builder.js.map +0 -1
  539. package/out/street/morphology-fst-loader.d.ts +0 -67
  540. package/out/street/morphology-fst-loader.d.ts.map +0 -1
  541. package/out/street/morphology-fst-loader.js.map +0 -1
  542. package/out/uprn/index.d.ts.map +0 -1
  543. package/out/uprn/index.js.map +0 -1
  544. /package/lib/{fst/index.ts → fst.ts} +0 -0
  545. /package/lib/{geonames/index.ts → geonames.ts} +0 -0
  546. /package/lib/{nsul/index.ts → nsul.ts} +0 -0
  547. /package/lib/{poi/index.ts → poi.ts} +0 -0
  548. /package/lib/{uprn/index.ts → uprn.ts} +0 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * Typed schema for the candidate gazetteer's ancestors sidecar (`candidate_ancestor` +
7
+ * `candidate_interval`) — the containment lineage the candidate table itself cannot answer, built
8
+ * into the same `candidate.db` by `build-candidate.ts` and read by
9
+ * {@link WOFCandidateTableLookup.ancestors}.
10
+ *
11
+ * The sidecar stores denormalized closure rows. Each row represents one (place, ancestor) edge. The row includes the
12
+ * parent's placetype, display name and folded key. The two consumers determine this layout:
13
+ *
14
+ * 1. The admin-coherence check needs the winner's chain as (placetype, name) pairs in one probe.
15
+ * A fixed-slot `[id.8]` chain returns ids. Each id would then need a name lookup, but the artifact has no
16
+ * per-id table. That design requires up to 8 indirections. The closure row requires none.
17
+ * 2. The account layer needs every candidate under a `name_key` enumerable with its chain from
18
+ * one artifact probe ("present-but-outranked, discriminated by containment"). That is the
19
+ * candidate probe (contiguous) followed by one `spr_id`-clustered closure probe per candidate
20
+ * — each a handful of adjacent pages.
21
+ *
22
+ * The artifact is read over HTTP byte ranges. A join to a dimension table scatters page fetches. A `without rowid`
23
+ * B-tree clustered on `(spr_id, depth)` keeps a whole chain in 1–2 pages. The builder repeats parent strings to
24
+ * avoid joins during reads.
25
+ *
26
+ * `depth` is 1 for the nearest ancestor (deepest containment tier) and increases outward to the
27
+ * country. This matches the nearest-first order that `ancestry.ts` serves for the FTS backend. Both backends'
28
+ * `ancestors()` results therefore use the same order. The order within a place is deterministic:
29
+ * containment depth descending (`placetypeDepth`), then ancestor id ascending, capped at
30
+ * {@link MAX_ANCESTOR_DEPTH}. `parent_name_key` is the shared {@link normalizeLocalityForKey}
31
+ * fold — the same fold `candidate.name_key` is built with, so a chain entry and a candidate key
32
+ * compare under one normalizer.
33
+ *
34
+ * `candidate_interval` stores pre/post-order labels over the canonical-parent forest. The builder assigns them
35
+ * during construction. The predicate `a.pre <= d.pre and d.post <= a.post` tests whether `a` contains `d` in O(1)
36
+ * time. It needs no chain scan or tier information. Descendants of `a` occupy the contiguous range
37
+ * `pre between a.pre and a.post`. Interval labels add relabeling work to updates. This database is sealed and
38
+ * read-only, so the builder can regenerate all labels together.
39
+ *
40
+ * WOF places can have multiple parents because boundaries can be ambiguous or participate in multiple
41
+ * hierarchies. `candidate_ancestor` stores every parent. Its closure rows hold the complete containment record.
42
+ * One interval pair encodes only a tree. The interval forest therefore links each place to one canonical parent:
43
+ * the depth-1 edge with the finest containment tier and lowest ancestor id. This follows the same MIN-based
44
+ * stability convention as the candidate table's `region_id` stamp. A containment query about another hierarchy
45
+ * must consult the closure rows. The interval result answers only whether a place is contained along the canonical
46
+ * hierarchy.
47
+ *
48
+ * absence semantics (meaning-of-zero): a place with no `candidate_interval` row has no recorded
49
+ * ancestry in the source (extract-fed postcodes and localities, isolated places, cycle-skipped
50
+ * rows). Absence is unverifiable, never a containment verdict.
51
+ */
52
+ import { type Kysely } from "kysely";
53
+ import type { CandidateDatabase } from "#candidate/schema";
54
+ import type { NameKey } from "#street/normalize";
55
+ /**
56
+ * The deepest chain the sidecar stores per place.
57
+ *
58
+ * WOF containment within the resolvable placetypes (country … microhood) never legitimately exceeds this.
59
+ * The build drops and counts anything past it as source noise rather than storing it.
60
+ */
61
+ export declare const MAX_ANCESTOR_DEPTH = 8;
62
+ /**
63
+ * The closure-row table's name — probed with `hasTable` by the reader, so an artifact
64
+ * predating the sidecar degrades to "no ancestors capability" rather than `no such table`.
65
+ */
66
+ export declare const CANDIDATE_ANCESTOR_TABLE = "candidate_ancestor";
67
+ /**
68
+ * The interval-label table's name — the closure table's seal-time sibling.
69
+ * Existence-restricted the same way.
70
+ */
71
+ export declare const CANDIDATE_INTERVAL_TABLE = "candidate_interval";
72
+ /**
73
+ * One (place, ancestor) edge, denormalized so a chain read is a single clustered probe (no join).
74
+ */
75
+ export interface CandidateAncestorTable {
76
+ /**
77
+ * WOF id of the place whose chain this row belongs to — the same `spr_id` the candidate table resolves to.
78
+ */
79
+ spr_id: number;
80
+ /**
81
+ * 1 = nearest ancestor, increasing outward to the country. Deterministic within a place (containment depth
82
+ * descending, then ancestor id ascending), so `(spr_id, depth)` is a stable primary key across rebuilds.
83
+ */
84
+ depth: number;
85
+ /**
86
+ * WOF id of the ancestor.
87
+ */
88
+ parent_spr_id: number;
89
+ /**
90
+ * Small int from the shared `placetype_codes` dictionary (the same one the candidate table uses).
91
+ */
92
+ parent_placetype_id: number;
93
+ /**
94
+ * The ancestor's canonical display name.
95
+ *
96
+ * What {@link Ancestor.name} serves, matching the FTS backend's register.
97
+ */
98
+ parent_name: string;
99
+ /**
100
+ * The shared {@link normalizeLocalityForKey} fold of `parent_name` — comparable against
101
+ * `candidate.name_key` and against a query-side fold under one normalizer, by construction.
102
+ */
103
+ parent_name_key: NameKey;
104
+ }
105
+ /**
106
+ * Pre/post-order labels over the canonical-parent forest — one row per place with
107
+ * recorded ancestry (see the module docstring for absence semantics).
108
+ *
109
+ * `pre < post` always.
110
+ * Labels are unique across the artifact.
111
+ */
112
+ export interface CandidateIntervalTable {
113
+ spr_id: number;
114
+ pre: number;
115
+ post: number;
116
+ }
117
+ /**
118
+ * The sidecar tables, for a `Kysely` view over the candidate DB.
119
+ *
120
+ * `CandidateDatabase` (candidate-schema.ts) extends this, so the builder's
121
+ * one typed client sees both families.
122
+ */
123
+ export interface CandidateAncestorsDatabase {
124
+ candidate_ancestor: CandidateAncestorTable;
125
+ candidate_interval: CandidateIntervalTable;
126
+ }
127
+ /**
128
+ * The `candidate_ancestor` columns in clustered-key order.
129
+ *
130
+ * The first two columns form the primary key.
131
+ * The builder's positional `insert` binds values in this order.
132
+ *
133
+ * Keep in sync with {@link CandidateAncestorTable}.
134
+ */
135
+ export declare const CANDIDATE_ANCESTOR_COLUMNS: readonly ["spr_id", "depth", "parent_spr_id", "parent_placetype_id", "parent_name", "parent_name_key"];
136
+ /**
137
+ * Create the clustered closure table.
138
+ *
139
+ * The builder inserts in `(spr_id, depth)` order so the B-tree leaves are contiguous
140
+ * per place — the byte-range read discipline.
141
+ */
142
+ export declare function createCandidateAncestorTable(db: Kysely<CandidateDatabase>): Promise<void>;
143
+ /**
144
+ * Create the interval-label table.
145
+ *
146
+ * Small rows probed by primary key — the `without rowid` win case.
147
+ */
148
+ export declare function createCandidateIntervalTable(db: Kysely<CandidateDatabase>): Promise<void>;
149
+ /**
150
+ * One place's interval label.
151
+ * The shape both sides of a containment comparison read.
152
+ */
153
+ export interface IntervalLabel {
154
+ pre: number;
155
+ post: number;
156
+ }
157
+ /**
158
+ * Does `outer` contain `inner` along the canonical hierarchy?
159
+ *
160
+ * Reflexive: a place contains itself (containment degenerates to identity,
161
+ * the same reading the admin-coherence check gives a self-match).
162
+ * The shared function for every consumer of the labels — a re-derived comparison risks
163
+ * disagreeing at exactly the strict/inclusive boundary this line settles.
164
+ */
165
+ export declare function intervalContains(outer: IntervalLabel, inner: IntervalLabel): boolean;
166
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../lib/candidate/ancestors/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAKzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC;;;GAGG;AACH,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAE5D;;;GAGG;AACH,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAE5D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAA;IAC3B;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAA;CACxB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IAC1C,kBAAkB,EAAE,sBAAsB,CAAA;IAC1C,kBAAkB,EAAE,sBAAsB,CAAA;CAC1C;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,YACtC,QAAQ,EACR,OAAO,EACP,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,iBAAiB,CACR,CAAA;AAEV;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAAC,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/F;AAED;;;;GAIG;AACH,wBAAsB,4BAA4B,CAAC,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/F;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAEpF"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * Typed schema for the candidate gazetteer's ancestors sidecar (`candidate_ancestor` +
7
+ * `candidate_interval`) — the containment lineage the candidate table itself cannot answer, built
8
+ * into the same `candidate.db` by `build-candidate.ts` and read by
9
+ * {@link WOFCandidateTableLookup.ancestors}.
10
+ *
11
+ * The sidecar stores denormalized closure rows. Each row represents one (place, ancestor) edge. The row includes the
12
+ * parent's placetype, display name and folded key. The two consumers determine this layout:
13
+ *
14
+ * 1. The admin-coherence check needs the winner's chain as (placetype, name) pairs in one probe.
15
+ * A fixed-slot `[id.8]` chain returns ids. Each id would then need a name lookup, but the artifact has no
16
+ * per-id table. That design requires up to 8 indirections. The closure row requires none.
17
+ * 2. The account layer needs every candidate under a `name_key` enumerable with its chain from
18
+ * one artifact probe ("present-but-outranked, discriminated by containment"). That is the
19
+ * candidate probe (contiguous) followed by one `spr_id`-clustered closure probe per candidate
20
+ * — each a handful of adjacent pages.
21
+ *
22
+ * The artifact is read over HTTP byte ranges. A join to a dimension table scatters page fetches. A `without rowid`
23
+ * B-tree clustered on `(spr_id, depth)` keeps a whole chain in 1–2 pages. The builder repeats parent strings to
24
+ * avoid joins during reads.
25
+ *
26
+ * `depth` is 1 for the nearest ancestor (deepest containment tier) and increases outward to the
27
+ * country. This matches the nearest-first order that `ancestry.ts` serves for the FTS backend. Both backends'
28
+ * `ancestors()` results therefore use the same order. The order within a place is deterministic:
29
+ * containment depth descending (`placetypeDepth`), then ancestor id ascending, capped at
30
+ * {@link MAX_ANCESTOR_DEPTH}. `parent_name_key` is the shared {@link normalizeLocalityForKey}
31
+ * fold — the same fold `candidate.name_key` is built with, so a chain entry and a candidate key
32
+ * compare under one normalizer.
33
+ *
34
+ * `candidate_interval` stores pre/post-order labels over the canonical-parent forest. The builder assigns them
35
+ * during construction. The predicate `a.pre <= d.pre and d.post <= a.post` tests whether `a` contains `d` in O(1)
36
+ * time. It needs no chain scan or tier information. Descendants of `a` occupy the contiguous range
37
+ * `pre between a.pre and a.post`. Interval labels add relabeling work to updates. This database is sealed and
38
+ * read-only, so the builder can regenerate all labels together.
39
+ *
40
+ * WOF places can have multiple parents because boundaries can be ambiguous or participate in multiple
41
+ * hierarchies. `candidate_ancestor` stores every parent. Its closure rows hold the complete containment record.
42
+ * One interval pair encodes only a tree. The interval forest therefore links each place to one canonical parent:
43
+ * the depth-1 edge with the finest containment tier and lowest ancestor id. This follows the same MIN-based
44
+ * stability convention as the candidate table's `region_id` stamp. A containment query about another hierarchy
45
+ * must consult the closure rows. The interval result answers only whether a place is contained along the canonical
46
+ * hierarchy.
47
+ *
48
+ * absence semantics (meaning-of-zero): a place with no `candidate_interval` row has no recorded
49
+ * ancestry in the source (extract-fed postcodes and localities, isolated places, cycle-skipped
50
+ * rows). Absence is unverifiable, never a containment verdict.
51
+ */
52
+ import { sql } from "kysely";
53
+ /**
54
+ * The deepest chain the sidecar stores per place.
55
+ *
56
+ * WOF containment within the resolvable placetypes (country … microhood) never legitimately exceeds this.
57
+ * The build drops and counts anything past it as source noise rather than storing it.
58
+ */
59
+ export const MAX_ANCESTOR_DEPTH = 8;
60
+ /**
61
+ * The closure-row table's name — probed with `hasTable` by the reader, so an artifact
62
+ * predating the sidecar degrades to "no ancestors capability" rather than `no such table`.
63
+ */
64
+ export const CANDIDATE_ANCESTOR_TABLE = "candidate_ancestor";
65
+ /**
66
+ * The interval-label table's name — the closure table's seal-time sibling.
67
+ * Existence-restricted the same way.
68
+ */
69
+ export const CANDIDATE_INTERVAL_TABLE = "candidate_interval";
70
+ /**
71
+ * The `candidate_ancestor` columns in clustered-key order.
72
+ *
73
+ * The first two columns form the primary key.
74
+ * The builder's positional `insert` binds values in this order.
75
+ *
76
+ * Keep in sync with {@link CandidateAncestorTable}.
77
+ */
78
+ export const CANDIDATE_ANCESTOR_COLUMNS = [
79
+ "spr_id",
80
+ "depth",
81
+ "parent_spr_id",
82
+ "parent_placetype_id",
83
+ "parent_name",
84
+ "parent_name_key",
85
+ ];
86
+ /**
87
+ * Create the clustered closure table.
88
+ *
89
+ * The builder inserts in `(spr_id, depth)` order so the B-tree leaves are contiguous
90
+ * per place — the byte-range read discipline.
91
+ */
92
+ export async function createCandidateAncestorTable(db) {
93
+ await db.schema
94
+ .createTable(CANDIDATE_ANCESTOR_TABLE)
95
+ .addColumn("spr_id", "integer", (c) => c.notNull())
96
+ .addColumn("depth", "integer", (c) => c.notNull())
97
+ .addColumn("parent_spr_id", "integer", (c) => c.notNull())
98
+ .addColumn("parent_placetype_id", "integer", (c) => c.notNull())
99
+ .addColumn("parent_name", "text", (c) => c.notNull())
100
+ .addColumn("parent_name_key", "text", (c) => c.notNull())
101
+ .addPrimaryKeyConstraint("candidate_ancestor_pk", ["spr_id", "depth"])
102
+ // `without rowid` has no first-class builder. The raw modifier is the idiomatic fallback.
103
+ .modifyEnd(sql `without rowid`)
104
+ .execute();
105
+ }
106
+ /**
107
+ * Create the interval-label table.
108
+ *
109
+ * Small rows probed by primary key — the `without rowid` win case.
110
+ */
111
+ export async function createCandidateIntervalTable(db) {
112
+ await db.schema
113
+ .createTable(CANDIDATE_INTERVAL_TABLE)
114
+ .addColumn("spr_id", "integer", (c) => c.primaryKey())
115
+ .addColumn("pre", "integer", (c) => c.notNull())
116
+ .addColumn("post", "integer", (c) => c.notNull())
117
+ .modifyEnd(sql `without rowid`)
118
+ .execute();
119
+ }
120
+ /**
121
+ * Does `outer` contain `inner` along the canonical hierarchy?
122
+ *
123
+ * Reflexive: a place contains itself (containment degenerates to identity,
124
+ * the same reading the admin-coherence check gives a self-match).
125
+ * The shared function for every consumer of the labels — a re-derived comparison risks
126
+ * disagreeing at exactly the strict/inclusive boundary this line settles.
127
+ */
128
+ export function intervalContains(outer, inner) {
129
+ return outer.pre <= inner.pre && inner.post <= outer.post;
130
+ }
131
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../lib/candidate/ancestors/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,EAAE,GAAG,EAAe,MAAM,QAAQ,CAAA;AAQzC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAA;AAE5D;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAA;AA4D5D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACzC,QAAQ;IACR,OAAO;IACP,eAAe;IACf,qBAAqB;IACrB,aAAa;IACb,iBAAiB;CACR,CAAA;AAEV;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,EAA6B;IAC/E,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,wBAAwB,CAAC;SACrC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAClD,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACzD,SAAS,CAAC,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/D,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACpD,SAAS,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACxD,uBAAuB,CAAC,uBAAuB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtE,0FAA0F;SACzF,SAAS,CAAC,GAAG,CAAA,eAAe,CAAC;SAC7B,OAAO,EAAE,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,EAA6B;IAC/E,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,wBAAwB,CAAC;SACrC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;SACrD,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/C,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAChD,SAAS,CAAC,GAAG,CAAA,eAAe,CAAC;SAC7B,OAAO,EAAE,CAAA;AACZ,CAAC;AAWD;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,KAAoB;IAC1E,OAAO,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAA;AAC1D,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ * @file Pass 3b of the candidate build — the containment sidecar (closure rows + interval labels).
6
+ */
7
+ import type { DatabaseClient } from "@mailwoman/sqlite/client";
8
+ import type { PlaceAttrs } from "#candidate/place-attrs";
9
+ import type { CandidateDatabase } from "#candidate/schema";
10
+ import type { WOFDatabase } from "#schema";
11
+ /**
12
+ * Build the ancestors sidecar (closure rows plus interval labels) from the source
13
+ * `ancestors` table, excluding self rows and placetypes outside the containment ladder.
14
+ * an edge to a parent with no current `spr` row is dropped and counted.
15
+ */
16
+ export declare function buildAncestorsSidecar(ctx: {
17
+ src: DatabaseClient<WOFDatabase>;
18
+ out: DatabaseClient<CandidateDatabase>;
19
+ attrs: Map<number, PlaceAttrs>;
20
+ ptID: (pt: string | null) => number;
21
+ progress: (phase: string, message: string) => void;
22
+ }): Promise<{
23
+ ancestorRows: number;
24
+ ancestorPlaces: number;
25
+ intervalPlaces: number;
26
+ }>;
27
+ //# sourceMappingURL=sidecar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidecar.d.ts","sourceRoot":"","sources":["../../../lib/candidate/ancestors/sidecar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAW9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE;IAChD,GAAG,EAAE,cAAc,CAAC,WAAW,CAAC,CAAA;IAChC,GAAG,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAA;IACtC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC9B,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAA;IACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAClD,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAmKpF"}
@@ -4,17 +4,12 @@
4
4
  * @author Teffen Ellis, et al.
5
5
  * @file Pass 3b of the candidate build — the containment sidecar (closure rows + interval labels).
6
6
  */
7
- import { placetypeDepth } from "#ancestry/index";
8
- import { CANDIDATE_ANCESTOR_COLUMNS, CANDIDATE_ANCESTOR_TABLE, CANDIDATE_INTERVAL_TABLE, createCandidateAncestorTable, createCandidateIntervalTable, MAX_ANCESTOR_DEPTH, } from "#candidate-ancestors-schema";
7
+ import { placetypeDepth } from "#ancestry";
8
+ import { CANDIDATE_ANCESTOR_COLUMNS, CANDIDATE_ANCESTOR_TABLE, CANDIDATE_INTERVAL_TABLE, createCandidateAncestorTable, createCandidateIntervalTable, MAX_ANCESTOR_DEPTH, } from "#candidate/ancestors/schema";
9
9
  /**
10
- * Pass 3b — the ancestors sidecar: closure rows + interval labels (candidate-ancestors-schema.ts owns the encoding
11
- * decision and the DAG/absence semantics). Reads the same source `ancestors` table the region stamp reads,
12
- * denormalizing each edge with the parent's name/key from `attrs`, streamed `ORDER BY id` so the clustered `(spr_id,
13
- * depth)` insert is sorted — the contiguous-leaves discipline of the candidate table itself.
14
- *
15
- * Excluded by policy: self rows, and placetypes outside the containment ladder (continent, empire, …: `placetypeDepth` 0)
16
- * — they discriminate nothing a consumer of this sidecar checks. An edge to a parent with no current `spr` row has no
17
- * name to denormalize; it is dropped and counted rather than stored blind.
10
+ * Build the ancestors sidecar (closure rows plus interval labels) from the source
11
+ * `ancestors` table, excluding self rows and placetypes outside the containment ladder.
12
+ * an edge to a parent with no current `spr` row is dropped and counted.
18
13
  */
19
14
  export async function buildAncestorsSidecar(ctx) {
20
15
  const { src, out, attrs, ptID, progress } = ctx;
@@ -22,23 +17,22 @@ export async function buildAncestorsSidecar(ctx) {
22
17
  await createCandidateAncestorTable(ctx.out);
23
18
  await createCandidateIntervalTable(ctx.out);
24
19
  const insAncestor = out.prepare(`INSERT INTO ${CANDIDATE_ANCESTOR_TABLE} VALUES (${CANDIDATE_ANCESTOR_COLUMNS.map(() => "?").join(", ")})`);
25
- // The canonical-parent forest the interval labels are computed over. One parent per place — the
26
- // depth-1 edge (finest containment tier, lowest ancestor id; the `regionOf` MIN-stability
27
- // convention). ALL parents stay in the closure rows; only the interval tree canonicalizes.
20
+ // One parent per place (the finest containment tier, lowest ancestor id) canonicalizes the interval tree.
21
+ // All parents stay in the closure rows.
28
22
  const canonicalParentOf = new Map();
29
23
  const childrenOf = new Map();
30
24
  const forest = new Set();
31
25
  let ancestorRows = 0;
32
26
  let ancestorPlaces = 0;
33
27
  let droppedParents = 0;
34
- // Per-child edge buffer; the stream below is grouped by child id, so each flush owns one place.
28
+ // The stream is grouped by child id, so each flush owns one place.
35
29
  let childID = -1;
36
30
  let edges = [];
37
31
  const flush = () => {
38
32
  if (childID < 0 || !edges.length)
39
33
  return;
40
- // Deterministic nearest-first: containment depth descending, then ancestor id ascending —
41
- // the FTS backend's `ancestorLineage` ordering, made stable across rebuilds.
34
+ // Deterministic nearest-first: containment depth descending, then ancestor id ascending,
35
+ // matching the FTS backend's `ancestorLineage` ordering across rebuilds.
42
36
  edges.sort((a, b) => placetypeDepth(b.apt) - placetypeDepth(a.apt) || a.aid - b.aid);
43
37
  if (edges.length > MAX_ANCESTOR_DEPTH) {
44
38
  edges = edges.slice(0, MAX_ANCESTOR_DEPTH);
@@ -85,8 +79,8 @@ export async function buildAncestorsSidecar(ctx) {
85
79
  }
86
80
  flush();
87
81
  out.exec("COMMIT");
88
- // Interval labels: pre/post-order DFS over the canonical-parent forest. Root order and child
89
- // order are id-ascending so the labels are stable across rebuilds of the same source.
82
+ // Interval labels are a pre/post-order DFS over the canonical-parent forest, with root
83
+ // and child order id-ascending so labels stay stable across rebuilds.
90
84
  const preOf = new Map();
91
85
  const postOf = new Map();
92
86
  for (const kids of childrenOf.values()) {
@@ -105,8 +99,8 @@ export async function buildAncestorsSidecar(ctx) {
105
99
  const kids = childrenOf.get(top.id);
106
100
  if (kids && top.next < kids.length) {
107
101
  const kid = kids[top.next++];
108
- // Each child holds exactly one canonical parent, so a labeled node here means the
109
- // grouping upstream broke — skip rather than corrupt the numbering.
102
+ // Each child holds exactly one canonical parent, so a labeled node means upstream grouping broke.
103
+ // Skip rather than corrupt the numbering.
110
104
  if (preOf.has(kid))
111
105
  continue;
112
106
  preOf.set(kid, counter++);
@@ -118,9 +112,8 @@ export async function buildAncestorsSidecar(ctx) {
118
112
  }
119
113
  }
120
114
  }
121
- // A canonical-parent CYCLE (corrupt source ancestry) leaves its members unreachable from any
122
- // root: they simply receive no label, and containment against them reads unverifiable — the
123
- // absence semantics the schema module states. Counted so a jump is visible across rebuilds.
115
+ // A canonical-parent cycle leaves its members unreachable from any root,
116
+ // so they receive no label and containment against them reads unverifiable.
124
117
  const cycleSkipped = forest.size - preOf.size;
125
118
  const insInterval = out.prepare(`INSERT INTO ${CANDIDATE_INTERVAL_TABLE} VALUES (?, ?, ?)`);
126
119
  const labeled = [...preOf.keys()];
@@ -137,4 +130,4 @@ export async function buildAncestorsSidecar(ctx) {
137
130
  (cycleSkipped ? `; ${cycleSkipped.toLocaleString()} places skipped (canonical-parent cycle)` : ""));
138
131
  return { ancestorRows, ancestorPlaces, intervalPlaces: preOf.size };
139
132
  }
140
- //# sourceMappingURL=ancestors-sidecar.js.map
133
+ //# sourceMappingURL=sidecar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidecar.js","sourceRoot":"","sources":["../../../lib/candidate/ancestors/sidecar.ts"],"names":[],"mappings":"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"}
@@ -2,26 +2,16 @@
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 type { PlaceAttrs, StageRow } from "#candidate/place-attrs";
8
7
  /**
9
- * Fold every country surface ICU knows onto that country's candidate row (#1678 thread 1).
8
+ * Stages each country name that `Intl.DisplayNames` renders in the codex display-name
9
+ * locales as a non-primary key on that country's candidate row.
10
10
  *
11
- * A bare `格鲁吉亚` (Georgia the country) resolved to NOTHING while `佐治亚州` (Georgia the US state) resolved correctly, and
12
- * the model gave both the same wrong `locality` tag — so the tag was never the variable. Measured 2026-08-15: 140 of
13
- * 237 country rows are synthetic and carry a canonical English name and nothing else; WOF holds no Chinese country
14
- * names at all; and the GeoNames alias fold filters through a Latin-script regex, so neither existing source could ever
15
- * supply them.
11
+ * The row's display name is unchanged, so a query such as `格鲁吉亚` resolves to the existing Georgia row.
12
+ * When several country rows share an ISO code, the most populous one receives the keys.
16
13
  *
17
- * `Intl.DisplayNames` already knows every one — ~280 regions, ~5,244 surfaces, from the same ICU the runtime uses for
18
- * every other locale-sensitive operation. No download, no vendored corpus, no snapshot to drift.
19
- *
20
- * `is_primary = 0`: these are NAMES THE WORLD USES, not the country's canonical name. The display `name` stays whatever
21
- * the gazetteer already had, so resolving `格鲁吉亚` answers with the Georgia country row rather than renaming it.
22
- *
23
- * Returns the row count so the caller can report it — a zero means ICU supplied nothing, which is a different fact from
24
- * the pass not having run.
14
+ * @returns The number of rows staged.
25
15
  */
26
16
  export declare function stageCountryDisplayNames(ctx: {
27
17
  attrs: Map<number, PlaceAttrs>;
@@ -1 +1 @@
1
- {"version":3,"file":"country-display-names.d.ts","sourceRoot":"","sources":["../../lib/candidate/country-display-names.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAGlE;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE;IAC7C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,QAAQ,CAAA;IAClB,EAAE,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAC/B,GAAG,MAAM,CA0CT"}
1
+ {"version":3,"file":"country-display-names.d.ts","sourceRoot":"","sources":["../../lib/candidate/country-display-names.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAGlE;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE;IAC7C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,QAAQ,CAAA;IAClB,EAAE,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAC/B,GAAG,MAAM,CAsCT"}
@@ -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";
8
- import type { CandidateDatabase } from "#candidate-schema";
7
+ import type { PathBuilderLike } from "path-ts";
9
8
  import type { PlaceAttrs, StageRow } from "#candidate/place-attrs";
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,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAmClE;;;;;;;;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"}