@mailwoman/resolver-wof-sqlite 10.0.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 (476) hide show
  1. package/README.md +8 -8
  2. package/lib/address/point/interpolation.ts +39 -37
  3. package/lib/address/point/schema.ts +17 -40
  4. package/lib/address/point.ts +315 -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 +123 -165
  9. package/lib/build/population-corrections.ts +64 -0
  10. package/lib/build/slim.ts +43 -113
  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 +64 -67
  18. package/lib/candidate/lookup.ts +78 -382
  19. package/lib/candidate/name-roles.ts +15 -33
  20. package/lib/candidate/own-name.ts +34 -31
  21. package/lib/candidate/place-attrs.ts +20 -13
  22. package/lib/candidate/schema.ts +29 -65
  23. package/lib/candidate/scoring.ts +30 -69
  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 +22 -67
  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 +71 -142
  45. package/lib/geonames/postal.ts +161 -70
  46. package/lib/index.ts +6 -6
  47. package/lib/interpolation.ts +43 -96
  48. package/lib/lookup.ts +132 -253
  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 +22 -40
  58. package/lib/postal/city/alias/schema.ts +14 -10
  59. package/lib/postal/city/candidate-schema.ts +26 -20
  60. package/lib/postcode-point-lookup.ts +9 -19
  61. package/lib/primary-preference.ts +44 -124
  62. package/lib/proximity-rerank.ts +43 -32
  63. package/lib/ranking-weights.ts +98 -76
  64. package/lib/region-keys.ts +68 -40
  65. package/lib/reverse.ts +108 -72
  66. package/lib/schema.ts +74 -42
  67. package/lib/search-fetch.ts +90 -68
  68. package/lib/sqlite/convention-source.ts +12 -20
  69. package/lib/sqlite/utils.ts +18 -21
  70. package/lib/street/centroid/schema.ts +37 -42
  71. package/lib/street/{centroid/index.ts → centroid.ts} +15 -24
  72. package/lib/street/morphology/fst/builder.ts +50 -41
  73. package/lib/street/morphology/fst/loader.ts +35 -28
  74. package/lib/street/name-lookup.ts +43 -35
  75. package/lib/street/normalize.ts +85 -216
  76. package/lib/street/segment-schema.ts +116 -43
  77. package/lib/{street/index.ts → street.ts} +1 -1
  78. package/lib/types.ts +94 -140
  79. package/lib/unified-schema.ts +29 -29
  80. package/lib/uprn/existence.ts +30 -19
  81. package/lib/uprn/lookup.ts +28 -67
  82. package/lib/uprn/schema.ts +18 -40
  83. package/lib/weights-overlay-linker.ts +204 -232
  84. package/out/address/point/interpolation.d.ts +19 -23
  85. package/out/address/point/interpolation.d.ts.map +1 -1
  86. package/out/address/point/interpolation.js +37 -37
  87. package/out/address/point/interpolation.js.map +1 -1
  88. package/out/address/point/schema.d.ts +12 -35
  89. package/out/address/point/schema.d.ts.map +1 -1
  90. package/out/address/point/schema.js +3 -19
  91. package/out/address/point/schema.js.map +1 -1
  92. package/out/address/point.d.ts +56 -0
  93. package/out/address/point.d.ts.map +1 -0
  94. package/out/address/point.js +205 -0
  95. package/out/address/point.js.map +1 -0
  96. package/out/{address/index.js → address.d.ts} +2 -2
  97. package/out/address.d.ts.map +1 -0
  98. package/out/{address/index.d.ts → address.js} +2 -2
  99. package/out/address.js.map +1 -0
  100. package/out/ancestry/backfill.d.ts +11 -64
  101. package/out/ancestry/backfill.d.ts.map +1 -1
  102. package/out/ancestry/backfill.js +14 -74
  103. package/out/ancestry/backfill.js.map +1 -1
  104. package/out/ancestry.d.ts +49 -0
  105. package/out/ancestry.d.ts.map +1 -0
  106. package/out/ancestry.js +59 -0
  107. package/out/ancestry.js.map +1 -0
  108. package/out/build/candidate.d.ts +87 -107
  109. package/out/build/candidate.d.ts.map +1 -1
  110. package/out/build/candidate.js +19 -95
  111. package/out/build/candidate.js.map +1 -1
  112. package/out/build/population-corrections.d.ts +52 -0
  113. package/out/build/population-corrections.d.ts.map +1 -0
  114. package/out/build/population-corrections.js +40 -0
  115. package/out/build/population-corrections.js.map +1 -0
  116. package/out/build/slim.d.ts +8 -44
  117. package/out/build/slim.d.ts.map +1 -1
  118. package/out/build/slim.js +32 -93
  119. package/out/build/slim.js.map +1 -1
  120. package/out/candidate/alias-bags.d.ts +6 -6
  121. package/out/candidate/alias-bags.d.ts.map +1 -1
  122. package/out/candidate/alias-bags.js +16 -17
  123. package/out/candidate/alias-bags.js.map +1 -1
  124. package/out/candidate/ancestors/schema.d.ts +73 -57
  125. package/out/candidate/ancestors/schema.d.ts.map +1 -1
  126. package/out/candidate/ancestors/schema.js +56 -48
  127. package/out/candidate/ancestors/schema.js.map +1 -1
  128. package/out/candidate/ancestors/sidecar.d.ts +3 -8
  129. package/out/candidate/ancestors/sidecar.d.ts.map +1 -1
  130. package/out/candidate/ancestors/sidecar.js +15 -22
  131. package/out/candidate/ancestors/sidecar.js.map +1 -1
  132. package/out/candidate/country-display-names.d.ts +5 -15
  133. package/out/candidate/country-display-names.d.ts.map +1 -1
  134. package/out/candidate/country-display-names.js +6 -20
  135. package/out/candidate/country-display-names.js.map +1 -1
  136. package/out/candidate/extract-fold.d.ts +7 -15
  137. package/out/candidate/extract-fold.d.ts.map +1 -1
  138. package/out/candidate/extract-fold.js +5 -47
  139. package/out/candidate/extract-fold.js.map +1 -1
  140. package/out/candidate/fts.d.ts +5 -23
  141. package/out/candidate/fts.d.ts.map +1 -1
  142. package/out/candidate/fts.js +5 -23
  143. package/out/candidate/fts.js.map +1 -1
  144. package/out/candidate/importance.d.ts +60 -65
  145. package/out/candidate/importance.d.ts.map +1 -1
  146. package/out/candidate/importance.js +55 -62
  147. package/out/candidate/importance.js.map +1 -1
  148. package/out/candidate/lookup.d.ts +11 -51
  149. package/out/candidate/lookup.d.ts.map +1 -1
  150. package/out/candidate/lookup.js +48 -361
  151. package/out/candidate/lookup.js.map +1 -1
  152. package/out/candidate/name-roles.d.ts +9 -21
  153. package/out/candidate/name-roles.d.ts.map +1 -1
  154. package/out/candidate/name-roles.js +15 -33
  155. package/out/candidate/name-roles.js.map +1 -1
  156. package/out/candidate/own-name.d.ts +23 -25
  157. package/out/candidate/own-name.d.ts.map +1 -1
  158. package/out/candidate/own-name.js +34 -31
  159. package/out/candidate/own-name.js.map +1 -1
  160. package/out/candidate/place-attrs.d.ts +20 -13
  161. package/out/candidate/place-attrs.d.ts.map +1 -1
  162. package/out/candidate/place-attrs.js +4 -5
  163. package/out/candidate/place-attrs.js.map +1 -1
  164. package/out/candidate/schema.d.ts +27 -62
  165. package/out/candidate/schema.d.ts.map +1 -1
  166. package/out/candidate/schema.js +10 -22
  167. package/out/candidate/schema.js.map +1 -1
  168. package/out/candidate/scoring.d.ts +7 -8
  169. package/out/candidate/scoring.d.ts.map +1 -1
  170. package/out/candidate/scoring.js +30 -69
  171. package/out/candidate/scoring.js.map +1 -1
  172. package/out/capital-schema.d.ts +21 -17
  173. package/out/capital-schema.d.ts.map +1 -1
  174. package/out/capital-schema.js +17 -15
  175. package/out/capital-schema.js.map +1 -1
  176. package/out/capitals.d.ts +26 -24
  177. package/out/capitals.d.ts.map +1 -1
  178. package/out/capitals.js +23 -21
  179. package/out/capitals.js.map +1 -1
  180. package/out/coincident-roles.d.ts +60 -43
  181. package/out/coincident-roles.d.ts.map +1 -1
  182. package/out/coincident-roles.js +61 -50
  183. package/out/coincident-roles.js.map +1 -1
  184. package/out/convention/schema.d.ts +12 -6
  185. package/out/convention/schema.d.ts.map +1 -1
  186. package/out/convention/schema.js +6 -4
  187. package/out/convention/schema.js.map +1 -1
  188. package/out/convention.d.ts +97 -0
  189. package/out/convention.d.ts.map +1 -0
  190. package/out/convention.js +81 -0
  191. package/out/convention.js.map +1 -0
  192. package/out/coverage-manifest-schema.d.ts +33 -38
  193. package/out/coverage-manifest-schema.d.ts.map +1 -1
  194. package/out/coverage-manifest-schema.js +20 -29
  195. package/out/coverage-manifest-schema.js.map +1 -1
  196. package/out/currency-backfill.d.ts +11 -33
  197. package/out/currency-backfill.d.ts.map +1 -1
  198. package/out/currency-backfill.js +12 -39
  199. package/out/currency-backfill.js.map +1 -1
  200. package/out/env.d.ts +1 -1
  201. package/out/env.js +1 -1
  202. package/out/exact-match.d.ts +19 -10
  203. package/out/exact-match.d.ts.map +1 -1
  204. package/out/exact-match.js +31 -20
  205. package/out/exact-match.js.map +1 -1
  206. package/out/extracts.d.ts +65 -54
  207. package/out/extracts.d.ts.map +1 -1
  208. package/out/extracts.js +63 -55
  209. package/out/extracts.js.map +1 -1
  210. package/out/fst/autocomplete.d.ts +28 -20
  211. package/out/fst/autocomplete.d.ts.map +1 -1
  212. package/out/fst/autocomplete.js +38 -27
  213. package/out/fst/autocomplete.js.map +1 -1
  214. package/out/fst/builder.d.ts.map +1 -1
  215. package/out/fst/builder.js +30 -36
  216. package/out/fst/builder.js.map +1 -1
  217. package/out/fst/deserialize-web.d.ts +3 -3
  218. package/out/fst/deserialize-web.d.ts.map +1 -1
  219. package/out/fst/deserialize-web.js +8 -9
  220. package/out/fst/deserialize-web.js.map +1 -1
  221. package/out/fst/format.d.ts +41 -23
  222. package/out/fst/format.d.ts.map +1 -1
  223. package/out/fst/format.js +41 -23
  224. package/out/fst/format.js.map +1 -1
  225. package/out/fst/freshness.d.ts +11 -73
  226. package/out/fst/freshness.d.ts.map +1 -1
  227. package/out/fst/freshness.js +12 -76
  228. package/out/fst/freshness.js.map +1 -1
  229. package/out/fst/matcher.d.ts +1 -1
  230. package/out/fst/matcher.js +2 -2
  231. package/out/fst/matcher.js.map +1 -1
  232. package/out/fst/serialize.d.ts +30 -26
  233. package/out/fst/serialize.d.ts.map +1 -1
  234. package/out/fst/serialize.js +44 -58
  235. package/out/fst/serialize.js.map +1 -1
  236. package/out/fst/types.d.ts +71 -59
  237. package/out/fst/types.d.ts.map +1 -1
  238. package/out/fst/types.js +1 -4
  239. package/out/fst/types.js.map +1 -1
  240. package/out/{fst/index.js → fst.d.ts} +1 -1
  241. package/out/fst.d.ts.map +1 -0
  242. package/out/{fst/index.d.ts → fst.js} +1 -1
  243. package/out/fst.js.map +1 -0
  244. package/out/fts/query.d.ts +2 -27
  245. package/out/fts/query.d.ts.map +1 -1
  246. package/out/fts/query.js +5 -36
  247. package/out/fts/query.js.map +1 -1
  248. package/out/fts.d.ts +126 -0
  249. package/out/fts.d.ts.map +1 -0
  250. package/out/fts.js +188 -0
  251. package/out/fts.js.map +1 -0
  252. package/out/geonames/aliases.d.ts +26 -62
  253. package/out/geonames/aliases.d.ts.map +1 -1
  254. package/out/geonames/aliases.js +43 -115
  255. package/out/geonames/aliases.js.map +1 -1
  256. package/out/geonames/postal.d.ts +84 -44
  257. package/out/geonames/postal.d.ts.map +1 -1
  258. package/out/geonames/postal.js +114 -72
  259. package/out/geonames/postal.js.map +1 -1
  260. package/out/{geonames/index.js → geonames.d.ts} +1 -1
  261. package/out/geonames.d.ts.map +1 -0
  262. package/out/{geonames/index.d.ts → geonames.js} +1 -1
  263. package/out/geonames.js.map +1 -0
  264. package/out/index.d.ts +6 -6
  265. package/out/index.d.ts.map +1 -1
  266. package/out/index.js +5 -5
  267. package/out/index.js.map +1 -1
  268. package/out/interpolation.d.ts +15 -52
  269. package/out/interpolation.d.ts.map +1 -1
  270. package/out/interpolation.js +25 -68
  271. package/out/interpolation.js.map +1 -1
  272. package/out/lookup.d.ts +22 -51
  273. package/out/lookup.d.ts.map +1 -1
  274. package/out/lookup.js +114 -220
  275. package/out/lookup.js.map +1 -1
  276. package/out/name-score.d.ts +2 -2
  277. package/out/name-score.d.ts.map +1 -1
  278. package/out/name-score.js +9 -7
  279. package/out/name-score.js.map +1 -1
  280. package/out/nsul/lookup.d.ts +33 -34
  281. package/out/nsul/lookup.d.ts.map +1 -1
  282. package/out/nsul/lookup.js +26 -40
  283. package/out/nsul/lookup.js.map +1 -1
  284. package/out/nsul/schema.d.ts +16 -43
  285. package/out/nsul/schema.d.ts.map +1 -1
  286. package/out/nsul/schema.js +9 -35
  287. package/out/nsul/schema.js.map +1 -1
  288. package/out/{nsul/index.d.ts → nsul.d.ts} +1 -1
  289. package/out/nsul.d.ts.map +1 -0
  290. package/out/{nsul/index.js → nsul.js} +1 -1
  291. package/out/nsul.js.map +1 -0
  292. package/out/paths.d.ts +124 -0
  293. package/out/paths.d.ts.map +1 -0
  294. package/out/paths.js +104 -0
  295. package/out/paths.js.map +1 -0
  296. package/out/place-importance-schema.d.ts +49 -141
  297. package/out/place-importance-schema.d.ts.map +1 -1
  298. package/out/place-importance-schema.js +25 -140
  299. package/out/place-importance-schema.js.map +1 -1
  300. package/out/poi/lookup.d.ts +38 -42
  301. package/out/poi/lookup.d.ts.map +1 -1
  302. package/out/poi/lookup.js +67 -90
  303. package/out/poi/lookup.js.map +1 -1
  304. package/out/poi/schema.d.ts +41 -25
  305. package/out/poi/schema.d.ts.map +1 -1
  306. package/out/poi/schema.js +25 -17
  307. package/out/poi/schema.js.map +1 -1
  308. package/out/{poi/index.js → poi.d.ts} +1 -1
  309. package/out/poi.d.ts.map +1 -0
  310. package/out/{poi/index.d.ts → poi.js} +1 -1
  311. package/out/poi.js.map +1 -0
  312. package/out/polygon-schema.d.ts +10 -6
  313. package/out/polygon-schema.d.ts.map +1 -1
  314. package/out/polygon-schema.js +2 -2
  315. package/out/polygon-schema.js.map +1 -1
  316. package/out/postal/city/alias/lookup.d.ts +20 -23
  317. package/out/postal/city/alias/lookup.d.ts.map +1 -1
  318. package/out/postal/city/alias/lookup.js +17 -30
  319. package/out/postal/city/alias/lookup.js.map +1 -1
  320. package/out/postal/city/alias/schema.d.ts +14 -10
  321. package/out/postal/city/alias/schema.d.ts.map +1 -1
  322. package/out/postal/city/alias/schema.js +10 -8
  323. package/out/postal/city/alias/schema.js.map +1 -1
  324. package/out/postal/city/candidate-schema.d.ts +25 -19
  325. package/out/postal/city/candidate-schema.d.ts.map +1 -1
  326. package/out/postal/city/candidate-schema.js +21 -17
  327. package/out/postal/city/candidate-schema.js.map +1 -1
  328. package/out/{postal/index.d.ts → postal.d.ts} +1 -1
  329. package/out/postal.d.ts.map +1 -0
  330. package/out/{postal/index.js → postal.js} +1 -1
  331. package/out/postal.js.map +1 -0
  332. package/out/postcode-point-lookup.d.ts +9 -19
  333. package/out/postcode-point-lookup.d.ts.map +1 -1
  334. package/out/postcode-point-lookup.js +5 -17
  335. package/out/postcode-point-lookup.js.map +1 -1
  336. package/out/primary-preference.d.ts +38 -92
  337. package/out/primary-preference.d.ts.map +1 -1
  338. package/out/primary-preference.js +13 -97
  339. package/out/primary-preference.js.map +1 -1
  340. package/out/proximity-rerank.d.ts +40 -29
  341. package/out/proximity-rerank.d.ts.map +1 -1
  342. package/out/proximity-rerank.js +38 -29
  343. package/out/proximity-rerank.js.map +1 -1
  344. package/out/ranking-weights.d.ts +91 -62
  345. package/out/ranking-weights.d.ts.map +1 -1
  346. package/out/ranking-weights.js +26 -25
  347. package/out/ranking-weights.js.map +1 -1
  348. package/out/region-keys.d.ts +48 -29
  349. package/out/region-keys.d.ts.map +1 -1
  350. package/out/region-keys.js +68 -40
  351. package/out/region-keys.js.map +1 -1
  352. package/out/reverse.d.ts +75 -50
  353. package/out/reverse.d.ts.map +1 -1
  354. package/out/reverse.js +61 -49
  355. package/out/reverse.js.map +1 -1
  356. package/out/schema.d.ts +74 -42
  357. package/out/schema.d.ts.map +1 -1
  358. package/out/schema.js +4 -5
  359. package/out/schema.js.map +1 -1
  360. package/out/search-fetch.d.ts +16 -12
  361. package/out/search-fetch.d.ts.map +1 -1
  362. package/out/search-fetch.js +83 -63
  363. package/out/search-fetch.js.map +1 -1
  364. package/out/sqlite/convention-source.d.ts +11 -15
  365. package/out/sqlite/convention-source.d.ts.map +1 -1
  366. package/out/sqlite/convention-source.js +11 -20
  367. package/out/sqlite/convention-source.js.map +1 -1
  368. package/out/sqlite/utils.d.ts +18 -18
  369. package/out/sqlite/utils.d.ts.map +1 -1
  370. package/out/sqlite/utils.js +14 -15
  371. package/out/sqlite/utils.js.map +1 -1
  372. package/out/street/centroid/schema.d.ts +37 -42
  373. package/out/street/centroid/schema.d.ts.map +1 -1
  374. package/out/street/centroid/schema.js +9 -21
  375. package/out/street/centroid/schema.js.map +1 -1
  376. package/out/street/centroid.d.ts +30 -0
  377. package/out/street/centroid.d.ts.map +1 -0
  378. package/out/street/{centroid/index.js → centroid.js} +12 -23
  379. package/out/street/centroid.js.map +1 -0
  380. package/out/street/morphology/fst/builder.d.ts +20 -10
  381. package/out/street/morphology/fst/builder.d.ts.map +1 -1
  382. package/out/street/morphology/fst/builder.js +34 -33
  383. package/out/street/morphology/fst/builder.js.map +1 -1
  384. package/out/street/morphology/fst/loader.d.ts +32 -25
  385. package/out/street/morphology/fst/loader.d.ts.map +1 -1
  386. package/out/street/morphology/fst/loader.js +19 -19
  387. package/out/street/morphology/fst/loader.js.map +1 -1
  388. package/out/street/name-lookup.d.ts +24 -18
  389. package/out/street/name-lookup.d.ts.map +1 -1
  390. package/out/street/name-lookup.js +32 -31
  391. package/out/street/name-lookup.js.map +1 -1
  392. package/out/street/normalize.d.ts +35 -136
  393. package/out/street/normalize.d.ts.map +1 -1
  394. package/out/street/normalize.js +74 -191
  395. package/out/street/normalize.js.map +1 -1
  396. package/out/street/segment-schema.d.ts +79 -39
  397. package/out/street/segment-schema.d.ts.map +1 -1
  398. package/out/street/segment-schema.js +71 -21
  399. package/out/street/segment-schema.js.map +1 -1
  400. package/out/{street/index.js → street.d.ts} +2 -2
  401. package/out/street.d.ts.map +1 -0
  402. package/out/{street/index.d.ts → street.js} +2 -2
  403. package/out/street.js.map +1 -0
  404. package/out/types.d.ts +69 -138
  405. package/out/types.d.ts.map +1 -1
  406. package/out/types.js +0 -6
  407. package/out/types.js.map +1 -1
  408. package/out/unified-schema.d.ts +8 -12
  409. package/out/unified-schema.d.ts.map +1 -1
  410. package/out/unified-schema.js +29 -29
  411. package/out/unified-schema.js.map +1 -1
  412. package/out/uprn/existence.d.ts +28 -17
  413. package/out/uprn/existence.d.ts.map +1 -1
  414. package/out/uprn/existence.js +26 -16
  415. package/out/uprn/existence.js.map +1 -1
  416. package/out/uprn/lookup.d.ts +14 -44
  417. package/out/uprn/lookup.d.ts.map +1 -1
  418. package/out/uprn/lookup.js +20 -56
  419. package/out/uprn/lookup.js.map +1 -1
  420. package/out/uprn/schema.d.ts +18 -40
  421. package/out/uprn/schema.d.ts.map +1 -1
  422. package/out/uprn/schema.js +10 -32
  423. package/out/uprn/schema.js.map +1 -1
  424. package/out/{uprn/index.d.ts → uprn.d.ts} +1 -1
  425. package/out/uprn.d.ts.map +1 -0
  426. package/out/{uprn/index.js → uprn.js} +1 -1
  427. package/out/uprn.js.map +1 -0
  428. package/out/weights-overlay-linker.d.ts +132 -141
  429. package/out/weights-overlay-linker.d.ts.map +1 -1
  430. package/out/weights-overlay-linker.js +86 -154
  431. package/out/weights-overlay-linker.js.map +1 -1
  432. package/package.json +88 -593
  433. package/lib/address/point/index.ts +0 -328
  434. package/lib/convention/index.ts +0 -154
  435. package/lib/fts/index.ts +0 -361
  436. package/out/address/index.d.ts.map +0 -1
  437. package/out/address/index.js.map +0 -1
  438. package/out/address/point/index.d.ts +0 -53
  439. package/out/address/point/index.d.ts.map +0 -1
  440. package/out/address/point/index.js +0 -222
  441. package/out/address/point/index.js.map +0 -1
  442. package/out/ancestry/index.d.ts +0 -45
  443. package/out/ancestry/index.d.ts.map +0 -1
  444. package/out/ancestry/index.js +0 -55
  445. package/out/ancestry/index.js.map +0 -1
  446. package/out/convention/index.d.ts +0 -106
  447. package/out/convention/index.d.ts.map +0 -1
  448. package/out/convention/index.js +0 -93
  449. package/out/convention/index.js.map +0 -1
  450. package/out/fst/index.d.ts.map +0 -1
  451. package/out/fst/index.js.map +0 -1
  452. package/out/fts/index.d.ts +0 -184
  453. package/out/fts/index.d.ts.map +0 -1
  454. package/out/fts/index.js +0 -277
  455. package/out/fts/index.js.map +0 -1
  456. package/out/geonames/index.d.ts.map +0 -1
  457. package/out/geonames/index.js.map +0 -1
  458. package/out/nsul/index.d.ts.map +0 -1
  459. package/out/nsul/index.js.map +0 -1
  460. package/out/poi/index.d.ts.map +0 -1
  461. package/out/poi/index.js.map +0 -1
  462. package/out/postal/index.d.ts.map +0 -1
  463. package/out/postal/index.js.map +0 -1
  464. package/out/street/centroid/index.d.ts +0 -40
  465. package/out/street/centroid/index.d.ts.map +0 -1
  466. package/out/street/centroid/index.js.map +0 -1
  467. package/out/street/index.d.ts.map +0 -1
  468. package/out/street/index.js.map +0 -1
  469. package/out/uprn/index.d.ts.map +0 -1
  470. package/out/uprn/index.js.map +0 -1
  471. /package/lib/{fst/index.ts → fst.ts} +0 -0
  472. /package/lib/{geonames/index.ts → geonames.ts} +0 -0
  473. /package/lib/{nsul/index.ts → nsul.ts} +0 -0
  474. /package/lib/{poi/index.ts → poi.ts} +0 -0
  475. /package/lib/{postal/index.ts → postal.ts} +0 -0
  476. /package/lib/{uprn/index.ts → uprn.ts} +0 -0
@@ -3,72 +3,70 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Typed schema for the candidate gazetteer's ANCESTORS sidecar (`candidate_ancestor` +
6
+ * Typed schema for the candidate gazetteer's ancestors sidecar (`candidate_ancestor` +
7
7
  * `candidate_interval`) — the containment lineage the candidate table itself cannot answer, built
8
8
  * into the same `candidate.db` by `build-candidate.ts` and read by
9
9
  * {@link WOFCandidateTableLookup.ancestors}.
10
10
  *
11
- * ENCODING: closure-lite rows, denormalized — one row per (place, ancestor) edge carrying the
12
- * parent's placetype, display name and folded key — rather than a fixed-slot id chain on the
13
- * candidate row. Decided by the two consumers:
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:
14
13
  *
15
- * 1. The admin-coherence check needs the WINNER's chain as (placetype, name) pairs in one probe.
16
- * A fixed-slot `[id;8]` chain answers with ids, and every id then needs a name lookup the
17
- * artifact has no per-id table for — up to 8 indirections where the closure row has zero.
18
- * 2. The account layer needs EVERY candidate under a `name_key` enumerable WITH its chain from
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
19
18
  * one artifact probe ("present-but-outranked, discriminated by containment"). That is the
20
19
  * candidate probe (contiguous) followed by one `spr_id`-clustered closure probe per candidate
21
20
  * — each a handful of adjacent pages.
22
21
  *
23
- * Denormalizing the parent onto the edge is the same discipline as the candidate table itself:
24
- * this artifact is read over HTTP byte ranges, where a join to a dimension table scatters page
25
- * fetches, and a `WITHOUT ROWID` B-tree clustered on `(spr_id, depth)` keeps a whole chain in
26
- * 1-2 pages. The repeated parent strings are the price of the zero-join read, paid at build time.
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.
27
25
  *
28
- * `depth` is 1 for the NEAREST ancestor (deepest containment tier), increasing outward to the
29
- * country — the same nearest-first order `ancestry.ts` serves for the FTS backend, so the two
30
- * backends' `ancestors()` agree by construction. The order within a place is deterministic:
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:
31
29
  * containment depth descending (`placetypeDepth`), then ancestor id ascending, capped at
32
- * {@link MAX_ANCESTOR_DEPTH}. `parent_name_key` is the SHARED {@link normalizeLocalityForKey}
30
+ * {@link MAX_ANCESTOR_DEPTH}. `parent_name_key` is the shared {@link normalizeLocalityForKey}
33
31
  * fold — the same fold `candidate.name_key` is built with, so a chain entry and a candidate key
34
32
  * compare under one normalizer.
35
33
  *
36
- * `candidate_interval` carries pre/post-order labels over the CANONICAL-PARENT FOREST, assigned
37
- * at build time: `a` contains `d` ⟺ `a.pre <= d.pre AND d.post <= a.post` — O(1) in either
38
- * direction with no chain scan and no knowledge of either side's tier — and the descendants of
39
- * `a` are the contiguous range `pre BETWEEN a.pre AND a.post`. Interval labels are classically
40
- * avoided for their relabel-on-update cost; this database is a sealed read-only artifact rebuilt
41
- * whole, which is exactly the regime where that cost is void.
42
- *
43
- * THE DAG CAVEAT, and the recorded choice: WOF places can carry more than one parent (multiple
44
- * hierarchies, ambiguous boundaries). `candidate_ancestor` keeps EVERY parent — the closure rows
45
- * are the complete containment record. A single interval pair can only encode a tree, so the
46
- * interval forest links each place to ONE canonical parent: its depth-1 edge — the finest
47
- * containment tier, lowest ancestor id — the same MIN-stability convention the candidate table's
48
- * `region_id` stamp uses. A containment question about a NON-canonical hierarchy must consult the
49
- * closure rows; the interval answer for it is `false`, which is why interval verdicts are
50
- * "contained along the canonical hierarchy", never "not contained at all".
51
- *
52
- * ABSENCE SEMANTICS (meaning-of-zero): a place with no `candidate_interval` row has no recorded
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
53
49
  * ancestry in the source (extract-fed postcodes and localities, isolated places, cycle-skipped
54
- * rows). Absence is UNVERIFIABLE, never a containment verdict.
50
+ * rows). Absence is unverifiable, never a containment verdict.
55
51
  */
56
52
  import { type Kysely } from "kysely";
57
53
  import type { CandidateDatabase } from "#candidate/schema";
58
54
  import type { NameKey } from "#street/normalize";
59
55
  /**
60
- * The deepest chain the sidecar stores per place. WOF containment within the resolvable placetypes (country …
61
- * microhood) never legitimately exceeds this; anything past it is source noise the build drops (and counts) rather than
62
- * stores.
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.
63
60
  */
64
61
  export declare const MAX_ANCESTOR_DEPTH = 8;
65
62
  /**
66
- * The closure-row table's name — probed with `hasTable` by the reader, so an artifact predating the sidecar degrades to
67
- * "no ancestors capability" rather than `no such table`.
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`.
68
65
  */
69
66
  export declare const CANDIDATE_ANCESTOR_TABLE = "candidate_ancestor";
70
67
  /**
71
- * The interval-label table's name — the closure table's seal-time sibling; existence-restricted the same way.
68
+ * The interval-label table's name — the closure table's seal-time sibling.
69
+ * Existence-restricted the same way.
72
70
  */
73
71
  export declare const CANDIDATE_INTERVAL_TABLE = "candidate_interval";
74
72
  /**
@@ -93,18 +91,23 @@ export interface CandidateAncestorTable {
93
91
  */
94
92
  parent_placetype_id: number;
95
93
  /**
96
- * The ancestor's canonical display name — what {@link Ancestor.name} serves, matching the FTS backend's register.
94
+ * The ancestor's canonical display name.
95
+ *
96
+ * What {@link Ancestor.name} serves, matching the FTS backend's register.
97
97
  */
98
98
  parent_name: string;
99
99
  /**
100
- * The SHARED {@link normalizeLocalityForKey} fold of `parent_name` — comparable against `candidate.name_key` and
101
- * against a query-side fold under one normalizer, by construction.
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
102
  */
103
103
  parent_name_key: NameKey;
104
104
  }
105
105
  /**
106
- * Pre/post-order labels over the canonical-parent forest — one row per place WITH recorded ancestry (see the module
107
- * docstring for absence semantics). `pre < post` always; labels are unique across the artifact.
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.
108
111
  */
109
112
  export interface CandidateIntervalTable {
110
113
  spr_id: number;
@@ -112,39 +115,52 @@ export interface CandidateIntervalTable {
112
115
  post: number;
113
116
  }
114
117
  /**
115
- * The sidecar tables, for a `Kysely` view over the candidate DB. `CandidateDatabase` (candidate-schema.ts) extends
116
- * this, so the builder's one typed client sees both families.
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.
117
122
  */
118
123
  export interface CandidateAncestorsDatabase {
119
124
  candidate_ancestor: CandidateAncestorTable;
120
125
  candidate_interval: CandidateIntervalTable;
121
126
  }
122
127
  /**
123
- * The `candidate_ancestor` columns in clustered-key order — the first two ARE the primary key, and the builder's
124
- * positional `INSERT` binds by this order. Keep in sync with {@link CandidateAncestorTable}.
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}.
125
134
  */
126
135
  export declare const CANDIDATE_ANCESTOR_COLUMNS: readonly ["spr_id", "depth", "parent_spr_id", "parent_placetype_id", "parent_name", "parent_name_key"];
127
136
  /**
128
- * Create the clustered closure table. The builder inserts in `(spr_id, depth)` order so the B-tree leaves are
129
- * contiguous per place — the byte-range read discipline.
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.
130
141
  */
131
142
  export declare function createCandidateAncestorTable(db: Kysely<CandidateDatabase>): Promise<void>;
132
143
  /**
133
- * Create the interval-label table. Small rows probed by primary key — the `WITHOUT ROWID` win case.
144
+ * Create the interval-label table.
145
+ *
146
+ * Small rows probed by primary key — the `without rowid` win case.
134
147
  */
135
148
  export declare function createCandidateIntervalTable(db: Kysely<CandidateDatabase>): Promise<void>;
136
149
  /**
137
- * One place's interval label — the shape both sides of a containment comparison read.
150
+ * One place's interval label.
151
+ * The shape both sides of a containment comparison read.
138
152
  */
139
153
  export interface IntervalLabel {
140
154
  pre: number;
141
155
  post: number;
142
156
  }
143
157
  /**
144
- * Does `outer` contain `inner` along the canonical hierarchy? Reflexive: a place contains itself (containment
145
- * degenerates to identity, the same reading the admin-coherence check gives a self-match). The shared FUNCTION for
146
- * every consumer of the labels — a re-derived comparison risks disagreeing at exactly the strict/inclusive boundary
147
- * this line settles.
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.
148
164
  */
149
165
  export declare function intervalContains(outer: IntervalLabel, inner: IntervalLabel): boolean;
150
166
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../lib/candidate/ancestors/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;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;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC;;;GAGG;AACH,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAE5D;;GAEG;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;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAA;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IAC1C,kBAAkB,EAAE,sBAAsB,CAAA;IAC1C,kBAAkB,EAAE,sBAAsB,CAAA;CAC1C;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B,YACtC,QAAQ,EACR,OAAO,EACP,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,iBAAiB,CACR,CAAA;AAEV;;;GAGG;AACH,wBAAsB,4BAA4B,CAAC,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/F;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/F;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAEpF"}
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"}
@@ -3,75 +3,77 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Typed schema for the candidate gazetteer's ANCESTORS sidecar (`candidate_ancestor` +
6
+ * Typed schema for the candidate gazetteer's ancestors sidecar (`candidate_ancestor` +
7
7
  * `candidate_interval`) — the containment lineage the candidate table itself cannot answer, built
8
8
  * into the same `candidate.db` by `build-candidate.ts` and read by
9
9
  * {@link WOFCandidateTableLookup.ancestors}.
10
10
  *
11
- * ENCODING: closure-lite rows, denormalized — one row per (place, ancestor) edge carrying the
12
- * parent's placetype, display name and folded key — rather than a fixed-slot id chain on the
13
- * candidate row. Decided by the two consumers:
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:
14
13
  *
15
- * 1. The admin-coherence check needs the WINNER's chain as (placetype, name) pairs in one probe.
16
- * A fixed-slot `[id;8]` chain answers with ids, and every id then needs a name lookup the
17
- * artifact has no per-id table for — up to 8 indirections where the closure row has zero.
18
- * 2. The account layer needs EVERY candidate under a `name_key` enumerable WITH its chain from
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
19
18
  * one artifact probe ("present-but-outranked, discriminated by containment"). That is the
20
19
  * candidate probe (contiguous) followed by one `spr_id`-clustered closure probe per candidate
21
20
  * — each a handful of adjacent pages.
22
21
  *
23
- * Denormalizing the parent onto the edge is the same discipline as the candidate table itself:
24
- * this artifact is read over HTTP byte ranges, where a join to a dimension table scatters page
25
- * fetches, and a `WITHOUT ROWID` B-tree clustered on `(spr_id, depth)` keeps a whole chain in
26
- * 1-2 pages. The repeated parent strings are the price of the zero-join read, paid at build time.
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.
27
25
  *
28
- * `depth` is 1 for the NEAREST ancestor (deepest containment tier), increasing outward to the
29
- * country — the same nearest-first order `ancestry.ts` serves for the FTS backend, so the two
30
- * backends' `ancestors()` agree by construction. The order within a place is deterministic:
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:
31
29
  * containment depth descending (`placetypeDepth`), then ancestor id ascending, capped at
32
- * {@link MAX_ANCESTOR_DEPTH}. `parent_name_key` is the SHARED {@link normalizeLocalityForKey}
30
+ * {@link MAX_ANCESTOR_DEPTH}. `parent_name_key` is the shared {@link normalizeLocalityForKey}
33
31
  * fold — the same fold `candidate.name_key` is built with, so a chain entry and a candidate key
34
32
  * compare under one normalizer.
35
33
  *
36
- * `candidate_interval` carries pre/post-order labels over the CANONICAL-PARENT FOREST, assigned
37
- * at build time: `a` contains `d` ⟺ `a.pre <= d.pre AND d.post <= a.post` — O(1) in either
38
- * direction with no chain scan and no knowledge of either side's tier — and the descendants of
39
- * `a` are the contiguous range `pre BETWEEN a.pre AND a.post`. Interval labels are classically
40
- * avoided for their relabel-on-update cost; this database is a sealed read-only artifact rebuilt
41
- * whole, which is exactly the regime where that cost is void.
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.
42
39
  *
43
- * THE DAG CAVEAT, and the recorded choice: WOF places can carry more than one parent (multiple
44
- * hierarchies, ambiguous boundaries). `candidate_ancestor` keeps EVERY parent — the closure rows
45
- * are the complete containment record. A single interval pair can only encode a tree, so the
46
- * interval forest links each place to ONE canonical parent: its depth-1 edge — the finest
47
- * containment tier, lowest ancestor id — the same MIN-stability convention the candidate table's
48
- * `region_id` stamp uses. A containment question about a NON-canonical hierarchy must consult the
49
- * closure rows; the interval answer for it is `false`, which is why interval verdicts are
50
- * "contained along the canonical hierarchy", never "not contained at all".
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.
51
47
  *
52
- * ABSENCE SEMANTICS (meaning-of-zero): a place with no `candidate_interval` row has no recorded
48
+ * absence semantics (meaning-of-zero): a place with no `candidate_interval` row has no recorded
53
49
  * ancestry in the source (extract-fed postcodes and localities, isolated places, cycle-skipped
54
- * rows). Absence is UNVERIFIABLE, never a containment verdict.
50
+ * rows). Absence is unverifiable, never a containment verdict.
55
51
  */
56
52
  import { sql } from "kysely";
57
53
  /**
58
- * The deepest chain the sidecar stores per place. WOF containment within the resolvable placetypes (country …
59
- * microhood) never legitimately exceeds this; anything past it is source noise the build drops (and counts) rather than
60
- * stores.
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.
61
58
  */
62
59
  export const MAX_ANCESTOR_DEPTH = 8;
63
60
  /**
64
- * The closure-row table's name — probed with `hasTable` by the reader, so an artifact predating the sidecar degrades to
65
- * "no ancestors capability" rather than `no such table`.
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`.
66
63
  */
67
64
  export const CANDIDATE_ANCESTOR_TABLE = "candidate_ancestor";
68
65
  /**
69
- * The interval-label table's name — the closure table's seal-time sibling; existence-restricted the same way.
66
+ * The interval-label table's name — the closure table's seal-time sibling.
67
+ * Existence-restricted the same way.
70
68
  */
71
69
  export const CANDIDATE_INTERVAL_TABLE = "candidate_interval";
72
70
  /**
73
- * The `candidate_ancestor` columns in clustered-key order — the first two ARE the primary key, and the builder's
74
- * positional `INSERT` binds by this order. Keep in sync with {@link CandidateAncestorTable}.
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}.
75
77
  */
76
78
  export const CANDIDATE_ANCESTOR_COLUMNS = [
77
79
  "spr_id",
@@ -82,8 +84,10 @@ export const CANDIDATE_ANCESTOR_COLUMNS = [
82
84
  "parent_name_key",
83
85
  ];
84
86
  /**
85
- * Create the clustered closure table. The builder inserts in `(spr_id, depth)` order so the B-tree leaves are
86
- * contiguous per place — the byte-range read discipline.
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.
87
91
  */
88
92
  export async function createCandidateAncestorTable(db) {
89
93
  await db.schema
@@ -95,12 +99,14 @@ export async function createCandidateAncestorTable(db) {
95
99
  .addColumn("parent_name", "text", (c) => c.notNull())
96
100
  .addColumn("parent_name_key", "text", (c) => c.notNull())
97
101
  .addPrimaryKeyConstraint("candidate_ancestor_pk", ["spr_id", "depth"])
98
- // `WITHOUT ROWID` has no first-class builder; the raw modifier is the idiomatic fallback.
102
+ // `without rowid` has no first-class builder. The raw modifier is the idiomatic fallback.
99
103
  .modifyEnd(sql `without rowid`)
100
104
  .execute();
101
105
  }
102
106
  /**
103
- * Create the interval-label table. Small rows probed by primary key — the `WITHOUT ROWID` win case.
107
+ * Create the interval-label table.
108
+ *
109
+ * Small rows probed by primary key — the `without rowid` win case.
104
110
  */
105
111
  export async function createCandidateIntervalTable(db) {
106
112
  await db.schema
@@ -112,10 +118,12 @@ export async function createCandidateIntervalTable(db) {
112
118
  .execute();
113
119
  }
114
120
  /**
115
- * Does `outer` contain `inner` along the canonical hierarchy? Reflexive: a place contains itself (containment
116
- * degenerates to identity, the same reading the admin-coherence check gives a self-match). The shared FUNCTION for
117
- * every consumer of the labels — a re-derived comparison risks disagreeing at exactly the strict/inclusive boundary
118
- * this line settles.
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.
119
127
  */
120
128
  export function intervalContains(outer, inner) {
121
129
  return outer.pre <= inner.pre && inner.post <= outer.post;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../lib/candidate/ancestors/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,OAAO,EAAE,GAAG,EAAe,MAAM,QAAQ,CAAA;AAQzC;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAA;AAE5D;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAA;AAqD5D;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACzC,QAAQ;IACR,OAAO;IACP,eAAe;IACf,qBAAqB;IACrB,aAAa;IACb,iBAAiB;CACR,CAAA;AAEV;;;GAGG;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;;GAEG;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;AAUD;;;;;GAKG;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"}
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"}
@@ -9,14 +9,9 @@ import type { PlaceAttrs } from "#candidate/place-attrs";
9
9
  import type { CandidateDatabase } from "#candidate/schema";
10
10
  import type { WOFDatabase } from "#schema";
11
11
  /**
12
- * Pass 3b — the ancestors sidecar: closure rows + interval labels (candidate-ancestors-schema.ts owns the encoding
13
- * decision and the DAG/absence semantics). Reads the same source `ancestors` table the region stamp reads,
14
- * denormalizing each edge with the parent's name/key from `attrs`, streamed `ORDER BY id` so the clustered `(spr_id,
15
- * depth)` insert is sorted — the contiguous-leaves discipline of the candidate table itself.
16
- *
17
- * Excluded by policy: self rows, and placetypes outside the containment ladder (continent, empire, …: `placetypeDepth` 0)
18
- * — they discriminate nothing a consumer of this sidecar checks. An edge to a parent with no current `spr` row has no
19
- * name to denormalize; it is dropped and counted rather than stored blind.
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.
20
15
  */
21
16
  export declare function buildAncestorsSidecar(ctx: {
22
17
  src: DatabaseClient<WOFDatabase>;
@@ -1 +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;;;;;;;;;GASG;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,CAqKpF"}
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";
7
+ import { placetypeDepth } from "#ancestry";
8
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()];
@@ -1 +1 @@
1
- {"version":3,"file":"sidecar.js","sourceRoot":"","sources":["../../../lib/candidate/ancestors/sidecar.ts"],"names":[],"mappings":"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"}
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"}