@mailwoman/resolver-wof-sqlite 10.0.0 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. package/README.md +9 -8
  2. package/lib/address/point/interpolation.ts +45 -39
  3. package/lib/address/point/schema.ts +17 -40
  4. package/lib/address/point.ts +316 -0
  5. package/lib/{address/index.ts → address.ts} +1 -1
  6. package/lib/ancestry/backfill.ts +20 -86
  7. package/lib/{ancestry/index.ts → ancestry.ts} +19 -15
  8. package/lib/build/candidate.ts +122 -174
  9. package/lib/build/population-corrections.ts +64 -0
  10. package/lib/build/slim.ts +44 -114
  11. package/lib/candidate/alias-bags.ts +16 -17
  12. package/lib/candidate/ancestors/schema.ts +77 -61
  13. package/lib/candidate/ancestors/sidecar.ts +15 -22
  14. package/lib/candidate/country-display-names.ts +6 -20
  15. package/lib/candidate/extract-fold.ts +10 -55
  16. package/lib/candidate/fts.ts +5 -23
  17. package/lib/candidate/importance.ts +65 -68
  18. package/lib/candidate/lookup.ts +124 -415
  19. package/lib/candidate/name-roles.ts +15 -33
  20. package/lib/candidate/own-name.ts +35 -32
  21. package/lib/candidate/place-attrs.ts +20 -13
  22. package/lib/candidate/schema.ts +29 -65
  23. package/lib/candidate/scoring.ts +54 -93
  24. package/lib/capital-schema.ts +21 -17
  25. package/lib/capitals.ts +29 -27
  26. package/lib/coincident-roles.ts +85 -55
  27. package/lib/convention/schema.ts +15 -16
  28. package/lib/convention.ts +144 -0
  29. package/lib/coverage-manifest-schema.ts +40 -45
  30. package/lib/currency-backfill.ts +34 -79
  31. package/lib/env.ts +1 -1
  32. package/lib/exact-match.ts +32 -21
  33. package/lib/extracts.ts +97 -74
  34. package/lib/fst/autocomplete.ts +54 -37
  35. package/lib/fst/builder.ts +37 -41
  36. package/lib/fst/deserialize-web.ts +16 -17
  37. package/lib/fst/format.ts +41 -23
  38. package/lib/fst/freshness.ts +43 -120
  39. package/lib/fst/matcher.ts +7 -5
  40. package/lib/fst/serialize.ts +54 -74
  41. package/lib/fst/types.ts +78 -75
  42. package/lib/{fst/index.ts → fst.ts} +1 -0
  43. package/lib/fts/query.ts +5 -36
  44. package/lib/fts.ts +280 -0
  45. package/lib/geonames/aliases.ts +73 -144
  46. package/lib/geonames/postal.ts +162 -71
  47. package/lib/index.ts +9 -8
  48. package/lib/interpolation.ts +48 -100
  49. package/lib/lookup.ts +155 -270
  50. package/lib/name-score.ts +9 -7
  51. package/lib/nsul/lookup.ts +37 -54
  52. package/lib/nsul/schema.ts +16 -43
  53. package/lib/paths.ts +159 -0
  54. package/lib/place-importance-schema.ts +62 -169
  55. package/lib/poi/lookup.ts +104 -121
  56. package/lib/poi/schema.ts +42 -26
  57. package/lib/polygon-schema.ts +10 -6
  58. package/lib/postal/city/alias/lookup.ts +22 -40
  59. package/lib/postal/city/alias/schema.ts +14 -10
  60. package/lib/postal/city/candidate-schema.ts +26 -20
  61. package/lib/postcode-point-lookup.ts +8 -27
  62. package/lib/primary-preference.ts +46 -126
  63. package/lib/proximity-rerank.ts +44 -33
  64. package/lib/ranking-weights.ts +105 -78
  65. package/lib/region-keys.ts +70 -42
  66. package/lib/reverse.ts +149 -86
  67. package/lib/schema.ts +73 -50
  68. package/lib/search-fetch.ts +90 -68
  69. package/lib/sqlite/convention-source.ts +15 -23
  70. package/lib/sqlite/utils.ts +19 -22
  71. package/lib/street/centroid/schema.ts +37 -42
  72. package/lib/street/{centroid/index.ts → centroid.ts} +16 -25
  73. package/lib/street/morphology/fst/builder.ts +60 -42
  74. package/lib/street/morphology/fst/loader.ts +40 -32
  75. package/lib/street/name-lookup.ts +45 -41
  76. package/lib/street/normalize.ts +88 -219
  77. package/lib/street/segment-schema.ts +116 -43
  78. package/lib/{street/index.ts → street.ts} +1 -1
  79. package/lib/types.ts +109 -150
  80. package/lib/unified-schema.ts +29 -29
  81. package/lib/uprn/existence.ts +30 -19
  82. package/lib/uprn/lookup.ts +29 -68
  83. package/lib/uprn/schema.ts +18 -40
  84. package/lib/weights-overlay-linker.ts +236 -252
  85. package/out/address/point/interpolation.d.ts +20 -23
  86. package/out/address/point/interpolation.d.ts.map +1 -1
  87. package/out/address/point/interpolation.js +42 -39
  88. package/out/address/point/interpolation.js.map +1 -1
  89. package/out/address/point/schema.d.ts +12 -35
  90. package/out/address/point/schema.d.ts.map +1 -1
  91. package/out/address/point/schema.js +3 -19
  92. package/out/address/point/schema.js.map +1 -1
  93. package/out/address/point.d.ts +57 -0
  94. package/out/address/point.d.ts.map +1 -0
  95. package/out/address/point.js +206 -0
  96. package/out/address/point.js.map +1 -0
  97. package/out/{address/index.js → address.d.ts} +2 -2
  98. package/out/address.d.ts.map +1 -0
  99. package/out/{address/index.d.ts → address.js} +2 -2
  100. package/out/address.js.map +1 -0
  101. package/out/ancestry/backfill.d.ts +11 -64
  102. package/out/ancestry/backfill.d.ts.map +1 -1
  103. package/out/ancestry/backfill.js +14 -74
  104. package/out/ancestry/backfill.js.map +1 -1
  105. package/out/ancestry.d.ts +49 -0
  106. package/out/ancestry.d.ts.map +1 -0
  107. package/out/ancestry.js +59 -0
  108. package/out/ancestry.js.map +1 -0
  109. package/out/build/candidate.d.ts +82 -112
  110. package/out/build/candidate.d.ts.map +1 -1
  111. package/out/build/candidate.js +17 -100
  112. package/out/build/candidate.js.map +1 -1
  113. package/out/build/population-corrections.d.ts +52 -0
  114. package/out/build/population-corrections.d.ts.map +1 -0
  115. package/out/build/population-corrections.js +40 -0
  116. package/out/build/population-corrections.js.map +1 -0
  117. package/out/build/slim.d.ts +8 -44
  118. package/out/build/slim.d.ts.map +1 -1
  119. package/out/build/slim.js +33 -94
  120. package/out/build/slim.js.map +1 -1
  121. package/out/candidate/alias-bags.d.ts +6 -6
  122. package/out/candidate/alias-bags.d.ts.map +1 -1
  123. package/out/candidate/alias-bags.js +16 -17
  124. package/out/candidate/alias-bags.js.map +1 -1
  125. package/out/candidate/ancestors/schema.d.ts +73 -57
  126. package/out/candidate/ancestors/schema.d.ts.map +1 -1
  127. package/out/candidate/ancestors/schema.js +56 -48
  128. package/out/candidate/ancestors/schema.js.map +1 -1
  129. package/out/candidate/ancestors/sidecar.d.ts +3 -8
  130. package/out/candidate/ancestors/sidecar.d.ts.map +1 -1
  131. package/out/candidate/ancestors/sidecar.js +15 -22
  132. package/out/candidate/ancestors/sidecar.js.map +1 -1
  133. package/out/candidate/country-display-names.d.ts +5 -15
  134. package/out/candidate/country-display-names.d.ts.map +1 -1
  135. package/out/candidate/country-display-names.js +6 -20
  136. package/out/candidate/country-display-names.js.map +1 -1
  137. package/out/candidate/extract-fold.d.ts +7 -15
  138. package/out/candidate/extract-fold.d.ts.map +1 -1
  139. package/out/candidate/extract-fold.js +5 -47
  140. package/out/candidate/extract-fold.js.map +1 -1
  141. package/out/candidate/fts.d.ts +5 -23
  142. package/out/candidate/fts.d.ts.map +1 -1
  143. package/out/candidate/fts.js +5 -23
  144. package/out/candidate/fts.js.map +1 -1
  145. package/out/candidate/importance.d.ts +60 -65
  146. package/out/candidate/importance.d.ts.map +1 -1
  147. package/out/candidate/importance.js +56 -63
  148. package/out/candidate/importance.js.map +1 -1
  149. package/out/candidate/lookup.d.ts +18 -55
  150. package/out/candidate/lookup.d.ts.map +1 -1
  151. package/out/candidate/lookup.js +82 -385
  152. package/out/candidate/lookup.js.map +1 -1
  153. package/out/candidate/name-roles.d.ts +9 -21
  154. package/out/candidate/name-roles.d.ts.map +1 -1
  155. package/out/candidate/name-roles.js +15 -33
  156. package/out/candidate/name-roles.js.map +1 -1
  157. package/out/candidate/own-name.d.ts +23 -25
  158. package/out/candidate/own-name.d.ts.map +1 -1
  159. package/out/candidate/own-name.js +35 -32
  160. package/out/candidate/own-name.js.map +1 -1
  161. package/out/candidate/place-attrs.d.ts +20 -13
  162. package/out/candidate/place-attrs.d.ts.map +1 -1
  163. package/out/candidate/place-attrs.js +4 -5
  164. package/out/candidate/place-attrs.js.map +1 -1
  165. package/out/candidate/schema.d.ts +27 -62
  166. package/out/candidate/schema.d.ts.map +1 -1
  167. package/out/candidate/schema.js +10 -22
  168. package/out/candidate/schema.js.map +1 -1
  169. package/out/candidate/scoring.d.ts +7 -8
  170. package/out/candidate/scoring.d.ts.map +1 -1
  171. package/out/candidate/scoring.js +52 -89
  172. package/out/candidate/scoring.js.map +1 -1
  173. package/out/capital-schema.d.ts +21 -17
  174. package/out/capital-schema.d.ts.map +1 -1
  175. package/out/capital-schema.js +17 -15
  176. package/out/capital-schema.js.map +1 -1
  177. package/out/capitals.d.ts +27 -25
  178. package/out/capitals.d.ts.map +1 -1
  179. package/out/capitals.js +23 -21
  180. package/out/capitals.js.map +1 -1
  181. package/out/coincident-roles.d.ts +60 -43
  182. package/out/coincident-roles.d.ts.map +1 -1
  183. package/out/coincident-roles.js +72 -50
  184. package/out/coincident-roles.js.map +1 -1
  185. package/out/convention/schema.d.ts +14 -14
  186. package/out/convention/schema.d.ts.map +1 -1
  187. package/out/convention/schema.js +6 -4
  188. package/out/convention/schema.js.map +1 -1
  189. package/out/convention.d.ts +97 -0
  190. package/out/convention.d.ts.map +1 -0
  191. package/out/convention.js +81 -0
  192. package/out/convention.js.map +1 -0
  193. package/out/coverage-manifest-schema.d.ts +34 -39
  194. package/out/coverage-manifest-schema.d.ts.map +1 -1
  195. package/out/coverage-manifest-schema.js +25 -34
  196. package/out/coverage-manifest-schema.js.map +1 -1
  197. package/out/currency-backfill.d.ts +16 -38
  198. package/out/currency-backfill.d.ts.map +1 -1
  199. package/out/currency-backfill.js +19 -46
  200. package/out/currency-backfill.js.map +1 -1
  201. package/out/env.d.ts +1 -1
  202. package/out/env.js +1 -1
  203. package/out/exact-match.d.ts +19 -10
  204. package/out/exact-match.d.ts.map +1 -1
  205. package/out/exact-match.js +32 -21
  206. package/out/exact-match.js.map +1 -1
  207. package/out/extracts.d.ts +66 -55
  208. package/out/extracts.d.ts.map +1 -1
  209. package/out/extracts.js +63 -55
  210. package/out/extracts.js.map +1 -1
  211. package/out/fst/autocomplete.d.ts +29 -21
  212. package/out/fst/autocomplete.d.ts.map +1 -1
  213. package/out/fst/autocomplete.js +39 -28
  214. package/out/fst/autocomplete.js.map +1 -1
  215. package/out/fst/builder.d.ts.map +1 -1
  216. package/out/fst/builder.js +37 -41
  217. package/out/fst/builder.js.map +1 -1
  218. package/out/fst/deserialize-web.d.ts +4 -4
  219. package/out/fst/deserialize-web.d.ts.map +1 -1
  220. package/out/fst/deserialize-web.js +15 -16
  221. package/out/fst/deserialize-web.js.map +1 -1
  222. package/out/fst/format.d.ts +41 -23
  223. package/out/fst/format.d.ts.map +1 -1
  224. package/out/fst/format.js +41 -23
  225. package/out/fst/format.js.map +1 -1
  226. package/out/fst/freshness.d.ts +19 -81
  227. package/out/fst/freshness.d.ts.map +1 -1
  228. package/out/fst/freshness.js +31 -94
  229. package/out/fst/freshness.js.map +1 -1
  230. package/out/fst/matcher.d.ts +5 -4
  231. package/out/fst/matcher.d.ts.map +1 -1
  232. package/out/fst/matcher.js +2 -2
  233. package/out/fst/matcher.js.map +1 -1
  234. package/out/fst/serialize.d.ts +28 -28
  235. package/out/fst/serialize.d.ts.map +1 -1
  236. package/out/fst/serialize.js +53 -71
  237. package/out/fst/serialize.js.map +1 -1
  238. package/out/fst/types.d.ts +78 -74
  239. package/out/fst/types.d.ts.map +1 -1
  240. package/out/fst/types.js +1 -4
  241. package/out/fst/types.js.map +1 -1
  242. package/out/{fst/index.js → fst.d.ts} +2 -1
  243. package/out/fst.d.ts.map +1 -0
  244. package/out/{fst/index.d.ts → fst.js} +2 -1
  245. package/out/fst.js.map +1 -0
  246. package/out/fts/query.d.ts +2 -27
  247. package/out/fts/query.d.ts.map +1 -1
  248. package/out/fts/query.js +5 -36
  249. package/out/fts/query.js.map +1 -1
  250. package/out/fts.d.ts +126 -0
  251. package/out/fts.d.ts.map +1 -0
  252. package/out/fts.js +188 -0
  253. package/out/fts.js.map +1 -0
  254. package/out/geonames/aliases.d.ts +26 -62
  255. package/out/geonames/aliases.d.ts.map +1 -1
  256. package/out/geonames/aliases.js +45 -117
  257. package/out/geonames/aliases.js.map +1 -1
  258. package/out/geonames/postal.d.ts +84 -44
  259. package/out/geonames/postal.d.ts.map +1 -1
  260. package/out/geonames/postal.js +115 -73
  261. package/out/geonames/postal.js.map +1 -1
  262. package/out/{geonames/index.js → geonames.d.ts} +1 -1
  263. package/out/geonames.d.ts.map +1 -0
  264. package/out/{geonames/index.d.ts → geonames.js} +1 -1
  265. package/out/geonames.js.map +1 -0
  266. package/out/index.d.ts +9 -8
  267. package/out/index.d.ts.map +1 -1
  268. package/out/index.js +6 -5
  269. package/out/index.js.map +1 -1
  270. package/out/interpolation.d.ts +18 -55
  271. package/out/interpolation.d.ts.map +1 -1
  272. package/out/interpolation.js +27 -69
  273. package/out/interpolation.js.map +1 -1
  274. package/out/lookup.d.ts +23 -51
  275. package/out/lookup.d.ts.map +1 -1
  276. package/out/lookup.js +136 -234
  277. package/out/lookup.js.map +1 -1
  278. package/out/name-score.d.ts +2 -2
  279. package/out/name-score.d.ts.map +1 -1
  280. package/out/name-score.js +9 -7
  281. package/out/name-score.js.map +1 -1
  282. package/out/nsul/lookup.d.ts +33 -34
  283. package/out/nsul/lookup.d.ts.map +1 -1
  284. package/out/nsul/lookup.js +26 -40
  285. package/out/nsul/lookup.js.map +1 -1
  286. package/out/nsul/schema.d.ts +16 -43
  287. package/out/nsul/schema.d.ts.map +1 -1
  288. package/out/nsul/schema.js +9 -35
  289. package/out/nsul/schema.js.map +1 -1
  290. package/out/{nsul/index.d.ts → nsul.d.ts} +1 -1
  291. package/out/nsul.d.ts.map +1 -0
  292. package/out/{nsul/index.js → nsul.js} +1 -1
  293. package/out/nsul.js.map +1 -0
  294. package/out/paths.d.ts +124 -0
  295. package/out/paths.d.ts.map +1 -0
  296. package/out/paths.js +104 -0
  297. package/out/paths.js.map +1 -0
  298. package/out/place-importance-schema.d.ts +51 -143
  299. package/out/place-importance-schema.d.ts.map +1 -1
  300. package/out/place-importance-schema.js +28 -143
  301. package/out/place-importance-schema.js.map +1 -1
  302. package/out/poi/lookup.d.ts +40 -47
  303. package/out/poi/lookup.d.ts.map +1 -1
  304. package/out/poi/lookup.js +69 -96
  305. package/out/poi/lookup.js.map +1 -1
  306. package/out/poi/schema.d.ts +41 -25
  307. package/out/poi/schema.d.ts.map +1 -1
  308. package/out/poi/schema.js +25 -17
  309. package/out/poi/schema.js.map +1 -1
  310. package/out/{poi/index.js → poi.d.ts} +1 -1
  311. package/out/poi.d.ts.map +1 -0
  312. package/out/{poi/index.d.ts → poi.js} +1 -1
  313. package/out/poi.js.map +1 -0
  314. package/out/polygon-schema.d.ts +10 -6
  315. package/out/polygon-schema.d.ts.map +1 -1
  316. package/out/polygon-schema.js +2 -2
  317. package/out/polygon-schema.js.map +1 -1
  318. package/out/postal/city/alias/lookup.d.ts +20 -23
  319. package/out/postal/city/alias/lookup.d.ts.map +1 -1
  320. package/out/postal/city/alias/lookup.js +17 -30
  321. package/out/postal/city/alias/lookup.js.map +1 -1
  322. package/out/postal/city/alias/schema.d.ts +14 -10
  323. package/out/postal/city/alias/schema.d.ts.map +1 -1
  324. package/out/postal/city/alias/schema.js +10 -8
  325. package/out/postal/city/alias/schema.js.map +1 -1
  326. package/out/postal/city/candidate-schema.d.ts +25 -19
  327. package/out/postal/city/candidate-schema.d.ts.map +1 -1
  328. package/out/postal/city/candidate-schema.js +21 -17
  329. package/out/postal/city/candidate-schema.js.map +1 -1
  330. package/out/{postal/index.d.ts → postal.d.ts} +1 -1
  331. package/out/postal.d.ts.map +1 -0
  332. package/out/{postal/index.js → postal.js} +1 -1
  333. package/out/postal.js.map +1 -0
  334. package/out/postcode-point-lookup.d.ts +6 -24
  335. package/out/postcode-point-lookup.d.ts.map +1 -1
  336. package/out/postcode-point-lookup.js +5 -17
  337. package/out/postcode-point-lookup.js.map +1 -1
  338. package/out/primary-preference.d.ts +38 -92
  339. package/out/primary-preference.d.ts.map +1 -1
  340. package/out/primary-preference.js +15 -99
  341. package/out/primary-preference.js.map +1 -1
  342. package/out/proximity-rerank.d.ts +41 -30
  343. package/out/proximity-rerank.d.ts.map +1 -1
  344. package/out/proximity-rerank.js +38 -29
  345. package/out/proximity-rerank.js.map +1 -1
  346. package/out/ranking-weights.d.ts +98 -64
  347. package/out/ranking-weights.d.ts.map +1 -1
  348. package/out/ranking-weights.js +26 -25
  349. package/out/ranking-weights.js.map +1 -1
  350. package/out/region-keys.d.ts +50 -31
  351. package/out/region-keys.d.ts.map +1 -1
  352. package/out/region-keys.js +68 -40
  353. package/out/region-keys.js.map +1 -1
  354. package/out/reverse.d.ts +78 -50
  355. package/out/reverse.d.ts.map +1 -1
  356. package/out/reverse.js +98 -61
  357. package/out/reverse.js.map +1 -1
  358. package/out/schema.d.ts +72 -49
  359. package/out/schema.d.ts.map +1 -1
  360. package/out/schema.js +4 -5
  361. package/out/schema.js.map +1 -1
  362. package/out/search-fetch.d.ts +16 -12
  363. package/out/search-fetch.d.ts.map +1 -1
  364. package/out/search-fetch.js +83 -63
  365. package/out/search-fetch.js.map +1 -1
  366. package/out/sqlite/convention-source.d.ts +12 -16
  367. package/out/sqlite/convention-source.d.ts.map +1 -1
  368. package/out/sqlite/convention-source.js +13 -22
  369. package/out/sqlite/convention-source.js.map +1 -1
  370. package/out/sqlite/utils.d.ts +19 -19
  371. package/out/sqlite/utils.d.ts.map +1 -1
  372. package/out/sqlite/utils.js +14 -15
  373. package/out/sqlite/utils.js.map +1 -1
  374. package/out/street/centroid/schema.d.ts +37 -42
  375. package/out/street/centroid/schema.d.ts.map +1 -1
  376. package/out/street/centroid/schema.js +9 -21
  377. package/out/street/centroid/schema.js.map +1 -1
  378. package/out/street/centroid.d.ts +30 -0
  379. package/out/street/centroid.d.ts.map +1 -0
  380. package/out/street/{centroid/index.js → centroid.js} +13 -24
  381. package/out/street/centroid.js.map +1 -0
  382. package/out/street/morphology/fst/builder.d.ts +20 -10
  383. package/out/street/morphology/fst/builder.d.ts.map +1 -1
  384. package/out/street/morphology/fst/builder.js +44 -34
  385. package/out/street/morphology/fst/builder.js.map +1 -1
  386. package/out/street/morphology/fst/loader.d.ts +33 -26
  387. package/out/street/morphology/fst/loader.d.ts.map +1 -1
  388. package/out/street/morphology/fst/loader.js +23 -22
  389. package/out/street/morphology/fst/loader.js.map +1 -1
  390. package/out/street/name-lookup.d.ts +24 -18
  391. package/out/street/name-lookup.d.ts.map +1 -1
  392. package/out/street/name-lookup.js +34 -35
  393. package/out/street/name-lookup.js.map +1 -1
  394. package/out/street/normalize.d.ts +35 -136
  395. package/out/street/normalize.d.ts.map +1 -1
  396. package/out/street/normalize.js +77 -194
  397. package/out/street/normalize.js.map +1 -1
  398. package/out/street/segment-schema.d.ts +79 -39
  399. package/out/street/segment-schema.d.ts.map +1 -1
  400. package/out/street/segment-schema.js +71 -21
  401. package/out/street/segment-schema.js.map +1 -1
  402. package/out/{street/index.js → street.d.ts} +2 -2
  403. package/out/street.d.ts.map +1 -0
  404. package/out/{street/index.d.ts → street.js} +2 -2
  405. package/out/street.js.map +1 -0
  406. package/out/types.d.ts +84 -149
  407. package/out/types.d.ts.map +1 -1
  408. package/out/types.js +0 -6
  409. package/out/types.js.map +1 -1
  410. package/out/unified-schema.d.ts +8 -12
  411. package/out/unified-schema.d.ts.map +1 -1
  412. package/out/unified-schema.js +29 -29
  413. package/out/unified-schema.js.map +1 -1
  414. package/out/uprn/existence.d.ts +28 -17
  415. package/out/uprn/existence.d.ts.map +1 -1
  416. package/out/uprn/existence.js +26 -16
  417. package/out/uprn/existence.js.map +1 -1
  418. package/out/uprn/lookup.d.ts +14 -44
  419. package/out/uprn/lookup.d.ts.map +1 -1
  420. package/out/uprn/lookup.js +21 -57
  421. package/out/uprn/lookup.js.map +1 -1
  422. package/out/uprn/schema.d.ts +18 -40
  423. package/out/uprn/schema.d.ts.map +1 -1
  424. package/out/uprn/schema.js +10 -32
  425. package/out/uprn/schema.js.map +1 -1
  426. package/out/{uprn/index.d.ts → uprn.d.ts} +1 -1
  427. package/out/uprn.d.ts.map +1 -0
  428. package/out/{uprn/index.js → uprn.js} +1 -1
  429. package/out/uprn.js.map +1 -0
  430. package/out/weights-overlay-linker.d.ts +138 -144
  431. package/out/weights-overlay-linker.d.ts.map +1 -1
  432. package/out/weights-overlay-linker.js +105 -159
  433. package/out/weights-overlay-linker.js.map +1 -1
  434. package/package.json +91 -596
  435. package/lib/address/point/index.ts +0 -328
  436. package/lib/convention/index.ts +0 -154
  437. package/lib/fts/index.ts +0 -361
  438. package/out/address/index.d.ts.map +0 -1
  439. package/out/address/index.js.map +0 -1
  440. package/out/address/point/index.d.ts +0 -53
  441. package/out/address/point/index.d.ts.map +0 -1
  442. package/out/address/point/index.js +0 -222
  443. package/out/address/point/index.js.map +0 -1
  444. package/out/ancestry/index.d.ts +0 -45
  445. package/out/ancestry/index.d.ts.map +0 -1
  446. package/out/ancestry/index.js +0 -55
  447. package/out/ancestry/index.js.map +0 -1
  448. package/out/convention/index.d.ts +0 -106
  449. package/out/convention/index.d.ts.map +0 -1
  450. package/out/convention/index.js +0 -93
  451. package/out/convention/index.js.map +0 -1
  452. package/out/fst/index.d.ts.map +0 -1
  453. package/out/fst/index.js.map +0 -1
  454. package/out/fts/index.d.ts +0 -184
  455. package/out/fts/index.d.ts.map +0 -1
  456. package/out/fts/index.js +0 -277
  457. package/out/fts/index.js.map +0 -1
  458. package/out/geonames/index.d.ts.map +0 -1
  459. package/out/geonames/index.js.map +0 -1
  460. package/out/nsul/index.d.ts.map +0 -1
  461. package/out/nsul/index.js.map +0 -1
  462. package/out/poi/index.d.ts.map +0 -1
  463. package/out/poi/index.js.map +0 -1
  464. package/out/postal/index.d.ts.map +0 -1
  465. package/out/postal/index.js.map +0 -1
  466. package/out/street/centroid/index.d.ts +0 -40
  467. package/out/street/centroid/index.d.ts.map +0 -1
  468. package/out/street/centroid/index.js.map +0 -1
  469. package/out/street/index.d.ts.map +0 -1
  470. package/out/street/index.js.map +0 -1
  471. package/out/uprn/index.d.ts.map +0 -1
  472. package/out/uprn/index.js.map +0 -1
  473. /package/lib/{geonames/index.ts → geonames.ts} +0 -0
  474. /package/lib/{nsul/index.ts → nsul.ts} +0 -0
  475. /package/lib/{poi/index.ts → poi.ts} +0 -0
  476. /package/lib/{postal/index.ts → postal.ts} +0 -0
  477. /package/lib/{uprn/index.ts → uprn.ts} +0 -0
package/README.md CHANGED
@@ -40,7 +40,7 @@ Databases are `ATTACH`ed by a schema name **derived from the filename**, and que
40
40
  - The name does not route. `postcode-ca-overture.db` derives `postcode_ca_overture`, and the router tests `startsWith("postalcode_")` — **"postcode" is not "postalcode"**. It held 843,739 Canadian codes and answered every query with zero hits, which is indistinguishable from "this country has no places".
41
41
  - The database carries `spr` but no `place_search`. It routes, then dies mid-`SELECT`.
42
42
 
43
- The predicate is the **table, not the filename**: a database carrying `spr` is claiming to be a place database, and every lookup path here reaches the FTS index. A relation-table database like `postcode-locality-<cc>.db` carries no `spr`, never makes that claim, and is exempt — which is what keeps the documented default database list working.
43
+ The predicate is the **table rather than the filename**: a database carrying `spr` is claiming to be a place database, and every lookup path here reaches the FTS index. A relation-table database like `postcode-locality-<cc>.db` carries no `spr`, never makes that claim, and is exempt — which is what keeps the documented default database list working.
44
44
 
45
45
  ```
46
46
  WOFSQLitePlaceLookup: …/postcode-ca-overture.db carries "spr" but no "place_search" table, so it
@@ -81,7 +81,7 @@ Cross-database `UNION` queries are not supported in one `findPlace` call — BM2
81
81
  comparable across separately-indexed corpora. Issue two `findPlace` calls and merge in your
82
82
  caller if you need that.
83
83
 
84
- ## Getting the WOF SQLite distribution
84
+ ## Get the WOF SQLite distribution
85
85
 
86
86
  The Geocode Earth team mirrors WOF SQLite distributions at <https://data.geocode.earth/wof/dist/sqlite/>. The two relevant distributions for v1:
87
87
 
@@ -137,7 +137,7 @@ Builds a trimmed WOF SQLite distribution sized for browser-side deployments (Pat
137
137
  # Defaults: --top 1000 localities, --countries US, drops geojson after building aux tables
138
138
  # The slim wof-hot.db distribution is RETIRED (2026-06-20): the demo byte-range-resolves
139
139
  # against the global candidate table. `buildSlimWOFDatabase` remains importable from
140
- # `@mailwoman/resolver-wof-sqlite/build-slim` for test fixtures. Historical invocation:
140
+ # `@mailwoman/resolver-wof-sqlite/build/slim` for test fixtures. Historical invocation:
141
141
  # mailwoman-wof-build-slim \
142
142
  --in /path/to/whosonfirst-data-admin-us-latest.db \
143
143
  --in /path/to/whosonfirst-data-postalcode-us-latest.db \
@@ -166,6 +166,7 @@ You can also build the index programmatically via the package's `./fts` subpath:
166
166
 
167
167
  ```ts
168
168
  import { DatabaseSync } from "node:sqlite"
169
+
169
170
  import { buildPlaceSearchFts } from "@mailwoman/resolver-wof-sqlite/fts"
170
171
 
171
172
  using db = new DatabaseSync("/path/to/wof.db")
@@ -175,7 +176,7 @@ const { created, indexedRows, durationMs } = buildPlaceSearchFts(db, {
175
176
  })
176
177
  ```
177
178
 
178
- ## Ranking
179
+ ## Rank places
179
180
 
180
181
  The resolver scores candidates by:
181
182
 
@@ -237,11 +238,11 @@ are all stripped safely before going to FTS5. Per-token rules:
237
238
 
238
239
  - **Bare tokens** (`"Paris"`, `"62701"`) become FTS5 **phrase matches**: `"Paris"` matches places
239
240
  named exactly "Paris", `"62701"` matches the postcode 62701 exactly.
240
- - **Trailing `*`** (`"627*"`, `"Pari*"`) becomes FTS5 **prefix syntax**: `627*` matches every
241
+ - **A trailing `*`** (`"627*"`, `"Pari*"`) becomes FTS5 **prefix syntax**: `627*` matches every
241
242
  postcode starting with 627, `Pari*` matches Paris / Parishville / etc. The caller explicitly
242
243
  signals "prefix"; bare tokens stay phrase-matched for safety.
243
- - **Multiple tokens** join with implicit AND: `"Pari* TX"` matches places whose name contains
244
- both a `Pari*`-prefixed word AND the word `TX`.
244
+ - **Multiple tokens** join with an implicit `AND`: `"Pari* TX"` matches places whose name contains
245
+ both a `Pari*`-prefixed word and the word `TX`.
245
246
 
246
247
  Example: `findPlace({ text: "902*", placetype: "postalcode" })` returns 90201, 90210, 90211, …
247
248
  matching the Los Angeles ZIP corridor.
@@ -256,7 +257,7 @@ This package itself is AGPL-3.0; the WOF data it indexes is CC-BY 4.0. The two l
256
257
 
257
258
  ## Integration tests
258
259
 
259
- `resolver-wof-sqlite/integration.test.ts` exercises the resolver against a real WOF SQLite distribution. The suite is **skipped** when no DB is present — set `MAILWOMAN_WOF_DB` to override the lookup path, otherwise it defaults to `/mnt/playpen/mailwoman-data/wof/whosonfirst-data-admin-us-latest.db` (the canonical lab location). CI runs against the fixture-only suites; operators with real WOF data locally get an extra layer of validation.
260
+ `resolver-wof-sqlite/integration.test.ts` exercises the resolver against a real WOF SQLite distribution. The suite is **skipped** when no DB is present — set `MAILWOMAN_WOF_DB` to override the lookup path, otherwise it defaults to `$MAILWOMAN_DATA_ROOT/db/wof/whosonfirst-data-admin-us-latest.db` (the canonical lab location). CI runs against the fixture-only suites; operators with real WOF data locally get an extra layer of validation.
260
261
 
261
262
  Coverage includes: placetype filtering, country filtering, the empty-result case, FTS5 special-character sanitization, Japanese alt-name resolution, parent-constrained lookup, and a performance budget (`findPlace` < 250 ms against the 142 k-row US admin database).
262
263
 
@@ -3,34 +3,30 @@
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
5
  *
6
- * Address-point interpolation — "Method 2" of the resolution ladder (#483, Phase 1 of
7
- * `docs/articles/plan/2026-06-11-resolution-ladder.md`): when the exact address-point tier (#476)
8
- * misses a house number, bracket the number with REAL neighbor points on the same street from the
9
- * same #476 extract and interpolate linearly in house-number space between them. Real occupancy
10
- * replaces TIGER's uniform-spacing assumption — the dominant error term of the TIGER pilot's check
11
- * miss; TIGER range interpolation (`StreetInterpolator`) demotes to the fallback for streets too
12
- * sparse to bracket.
6
+ * Address-point interpolation, the second method of the resolution ladder. When the exact
7
+ * address-point tier misses a house number, bracket the number with real neighbor points on the
8
+ * same street and interpolate linearly in house-number space between them. Real occupancy
9
+ * replaces the tiger range tier's uniform-spacing assumption. Tiger range interpolation
10
+ * (`StreetInterpolator`) is the fallback for streets too sparse to bracket.
13
11
  *
14
- * Matching key is `street_key` — THE shared normalizer plus the route fold
15
- * (`canonicalizeRouteKey`), identical at build time (`scripts/build-address-point-extract.ts`) and
16
- * query time, by construction. Scope is postcode-first like the segment tier; a query without a
17
- * postcode goes straight to the fallback (which carries its own statewide-ambiguity abstention).
12
+ * The matching key is `street_key`, the shared normalizer plus the route fold
13
+ * (`canonicalizeRouteKey`), identical at build time (`mailwoman situs address-points`) and query
14
+ * time by construction. Scope is postcode-first like the segment tier. A query without a postcode
15
+ * goes straight to the fallback. The fallback has its own statewide-ambiguity abstention.
18
16
  *
19
- * Bracketing contract:
17
+ * Neighbor candidates never include the queried number itself, so production never overrides an
18
+ * on-file number and grading against the same extract is non-circular.
20
19
  *
21
- * - Neighbor candidates NEVER include the queried number itself (any unit/duplicate row of it) — in
22
- * production the exact tier would already have answered an on-file number, and in the eval
23
- * this is what makes grading against the same extract non-circular by construction.
24
20
  * - Both-sided bracket (`bracket: "both"`): linear interpolation between the nearest known number
25
- * below and above; `uncertaintyM` = half the distance between them.
26
- * - Single-sided (`bracket: "single"`): linear extrapolation along the two nearest known numbers on
27
- * that side, capped at one pair-span beyond the nearest point (`t ≤ 2` — beyond that the line
28
- * carries no evidence and the query falls through); `uncertaintyM` = the pair distance plus
29
- * the extrapolated overshoot, explicitly larger than the both-sided radius.
30
- * - No bracket (no neighbors, a single known number, or past the extrapolation cap): fall through to
31
- * the TIGER fallback when configured, else null.
21
+ * below and above. `uncertaintyM` is half the distance between them.
22
+ * - Single-sided (`bracket: "single"`): linear extrapolation along the two nearest known numbers
23
+ * on that side, capped at one pair-span beyond the nearest point (`t ≤ 2`, past which the line
24
+ * provides no evidence and the query falls through). `uncertaintyM` is the pair distance plus
25
+ * the extrapolated overshoot, larger than the both-sided radius.
26
+ * - No bracket, meaning no neighbors, a single known number, or past the extrapolation cap: fall
27
+ * through to the tiger fallback when configured, else null.
32
28
  *
33
- * Standalone like the segment tier — core wiring rides the Phase 2 ordered `spatialTiers` list.
29
+ * Standalone like the segment tier, wired through the ordered `spatialTiers` list.
34
30
  */
35
31
 
36
32
  import type { InterpolationLookup } from "@mailwoman/core/resolver"
@@ -42,8 +38,10 @@ import type { InterpolatedHit, InterpolationQuery, StreetInterpolator } from "#i
42
38
  import { hasTable, prepareAll, type PreparedAll } from "#sqlite-utils"
43
39
  import { canonicalizeRouteKey, type RouteKey, streetKeyVariants } from "#street/normalize"
44
40
  /**
45
- * Extrapolation cap for a single-sided bracket: at most one pair-span beyond the nearest known point (`t = 2`). Past
46
- * it, the two-point line carries no evidence about the query number.
41
+ * Extrapolation cap for a single-sided bracket: at most one pair-span beyond
42
+ * the nearest known point (`t = 2`).
43
+ *
44
+ * Past it, the two-point line provides no evidence about the query number.
47
45
  */
48
46
  const MAX_EXTRAPOLATION_T = 2
49
47
 
@@ -71,29 +69,31 @@ export class AddressPointInterpolator<
71
69
  > implements InterpolationLookup {
72
70
  readonly #db: DatabaseClient<DB>
73
71
  /**
74
- * Resources this instance opened. A connection handed in by a caller is NOT in here, so disposal cannot reach it —
75
- * ownership is membership rather than a flag a later branch has to check.
72
+ * Resources this instance opened.
73
+ *
74
+ * A connection handed in by a caller is not in here, so disposal cannot reach it.
75
+ * Ownership is membership rather than a flag a later branch checks.
76
76
  */
77
- readonly #resources = new DisposableStack()
77
+ readonly #resources: DisposableStack
78
78
  readonly #fallback: StreetInterpolator | undefined
79
79
  readonly #byPostcode: PreparedAll<[postcode: string, street: RouteKey, number: number], PointRow> | undefined
80
80
 
81
81
  constructor(opts: { dbPath?: string; database?: DatabaseClient<DB>; fallback?: StreetInterpolator }) {
82
+ using resources = new DisposableStack()
83
+
82
84
  if (opts.database) {
83
85
  this.#db = opts.database
84
86
  } else if (opts.dbPath) {
85
- this.#db = this.#resources.use(new DatabaseClient<DB>(opts.dbPath, { readOnly: true }))
87
+ this.#db = resources.use(new DatabaseClient<DB>(opts.dbPath, { readOnly: true }))
86
88
  } else {
87
89
  throw new Error("AddressPointInterpolator: one of dbPath or database is required")
88
90
  }
89
91
 
90
92
  this.#fallback = opts.fallback
91
93
 
92
- // Degrade gracefully on an empty/tableless extract (#568): with no `address_point` table this tier
93
- // is skipped, deferring to the segment fallback rather than crashing at construction.
94
+ // Degrade gracefully on an extract without an `address_point` table.
95
+ // The tier is skipped and defers to the segment fallback rather than crashing at construction.
94
96
  if (hasTable(this.#db, "address_point")) {
95
- // Strictly-numeric neighbor numbers on the route-folded street key within the ZIP. The
96
- // queried number itself is excluded HERE (see module doc: non-circular by construction).
97
97
  this.#byPostcode = prepareAll(
98
98
  this.#db,
99
99
  `SELECT CAST(number AS INTEGER) AS n, lat, lon, source, release
@@ -103,18 +103,21 @@ export class AddressPointInterpolator<
103
103
  AND CAST(number AS INTEGER) != ?`
104
104
  )
105
105
  }
106
+
107
+ this.#resources = resources.move()
106
108
  }
107
109
 
110
+ readonly radiusCalibration = null
111
+
108
112
  find(query: InterpolationQuery): InterpolatedHit | null {
109
113
  const numberRaw = query.number.trim()
110
114
 
111
115
  if (!/^\d+$/.test(numberRaw)) return null
112
116
  const n = Number(numberRaw)
113
117
 
114
- // No own table (empty extract) or no postcode → defer to the segment fallback rather than query.
115
118
  if (!this.#byPostcode || !query.postcode) return this.#fallback?.find(query) ?? null
116
119
 
117
- // Key-variant ladder (see `streetKeyVariants`) — same probe order as the exact-point reader.
120
+ // Key-variant ladder (see `streetKeyVariants`), the same probe order as the exact-point reader.
118
121
  let rows: PointRow[] = []
119
122
 
120
123
  for (const variant of streetKeyVariants(query.street)) {
@@ -165,9 +168,10 @@ function anchorsByNumber(rows: readonly PointRow[]): NumberAnchor[] {
165
168
  function interpolateFromNeighbors(rows: readonly PointRow[], n: number): InterpolatedHit | null {
166
169
  const anchors = anchorsByNumber(rows)
167
170
 
168
- // Nearest known number below and above the query (the rows never contain n itself).
169
- let below: NumberAnchor | undefined
170
- let above: NumberAnchor | undefined
171
+ // Nearest known number below and above the query.
172
+ // The rows never contain n itself.
173
+ let below: NumberAnchor | null = null
174
+ let above: NumberAnchor | null = null
171
175
 
172
176
  for (const anchor of anchors) {
173
177
  if (anchor.n < n) {
@@ -188,6 +192,7 @@ function interpolateFromNeighbors(rows: readonly PointRow[], n: number): Interpo
188
192
  lon: below.lon + (above.lon - below.lon) * t,
189
193
  interpolated: true,
190
194
  method: "address_point",
195
+ parityMatched: null,
191
196
  bracket: "both",
192
197
  uncertaintyM: Math.round(spanM / 2),
193
198
  source: below.source,
@@ -196,7 +201,7 @@ function interpolateFromNeighbors(rows: readonly PointRow[], n: number): Interpo
196
201
  }
197
202
 
198
203
  // Single-sided: extrapolate along the two nearest known numbers on the populated side.
199
- // `near` is the anchor closest to n, `far` the next one out; t > 1 by construction.
204
+ // `t > 1` by construction because n lies outside the span.
200
205
  const side = below ? anchors.slice(-2) : anchors.slice(0, 2)
201
206
 
202
207
  if (side.length < 2) return null
@@ -215,6 +220,7 @@ function interpolateFromNeighbors(rows: readonly PointRow[], n: number): Interpo
215
220
  lon,
216
221
  interpolated: true,
217
222
  method: "address_point",
223
+ parityMatched: null,
218
224
  bracket: "single",
219
225
  // Explicitly larger than the both-sided radius: the whole pair span plus the overshoot.
220
226
  uncertaintyM: Math.round(pairM + overshootM),
@@ -2,18 +2,6 @@
2
2
  * @copyright Sister Software
3
3
  * @license AGPL-3.0
4
4
  * @author Teffen Ellis, et al.
5
- *
6
- * Typed schema for the SITUS / rooftop ADDRESS-POINT extracts (`address-points-<cc>-<slug>.db`, built
7
- * by `scripts/build-address-point-extract.ts` — the #476/#567 national rooftop tier behind the
8
- * demo's "type any US address, get the building"). Single source of truth for the columns shared
9
- * by the BUILDER and the READER ({@link AddressPointSqliteLookup}), so a column rename in one is a
10
- * compile error in the other.
11
- *
12
- * The builder's hot INSERT (tens of millions of rows per state) stays a POSITIONAL prepared
13
- * statement for throughput — but its column list is derived from {@link ADDRESS_POINT_COLUMNS}
14
- * here, and its table comes from {@link createAddressPointTable}, so the positional order can't
15
- * silently drift from what the reader expects. (Same convention as the candidate build: typed
16
- * schema guards the contract; positional inserts keep the speed.)
17
5
  */
18
6
 
19
7
  import type { Kysely } from "kysely"
@@ -21,9 +9,8 @@ import type { Kysely } from "kysely"
21
9
  import type { NameKey, RouteKey, StreetKey } from "#street/normalize"
22
10
 
23
11
  /**
24
- * One rooftop address point. `(street_norm, number)` within a `postcode` (preferred) or `locality_norm` scope is the
25
- * lookup; `street_key` is the #483 route-fold key for interpolation. Coordinates are non-null (the builder drops
26
- * non-finite coords). `unit`/`postcode`/`locality_norm` are nullable (not every source carries all three).
12
+ * One rooftop address point; `(street_norm, number)` within a `postcode`
13
+ * or `locality_norm` scope is the lookup.
27
14
  */
28
15
  export interface AddressPointTable {
29
16
  /**
@@ -31,12 +18,12 @@ export interface AddressPointTable {
31
18
  */
32
19
  street_norm: StreetKey
33
20
  /**
34
- * `canonicalizeRouteKey(street_norm)` — the route-fold key (#483 Method 2). Its own brand, so it cannot be
35
- * interchanged with the plain `street_norm` above.
21
+ * `canonicalizeRouteKey(street_norm)` — the route-fold key, branded
22
+ * so it cannot be interchanged with `street_norm`.
36
23
  */
37
24
  street_key: RouteKey
38
25
  /**
39
- * House number, normalized lower-case (kept TEXT — "123-A", "12 1/2" must survive).
26
+ * House number, normalized lower-case (kept text — "123-A", "12 1/2" must survive).
40
27
  */
41
28
  number: string
42
29
  unit: string | null
@@ -45,9 +32,7 @@ export interface AddressPointTable {
45
32
  * Shared {@link normalizeLocalityForKey} of the locality — the fallback scope.
46
33
  */
47
34
  locality_norm: NameKey | null
48
- /**
49
- * The street as it appeared in the source (kept for display / debugging).
50
- */
35
+
51
36
  street_raw: string
52
37
  lat: number
53
38
  lon: number
@@ -55,18 +40,16 @@ export interface AddressPointTable {
55
40
  * Provenance: the dataset this point came from (e.g. `overture:us`, `openaddresses`).
56
41
  */
57
42
  source: string
58
- /**
59
- * The pinned data release the point was ingested from.
60
- */
43
+
61
44
  release: string
62
45
  /**
63
- * The source register's stable administrative key for the point's commune or municipality — BAN's `code_insee`. A
64
- * display name (`locality_norm`) is not a key; the coverage basis is computed per THIS.
46
+ * The source register's stable administrative key for the point's commune or municipality —
47
+ * BAN's `code_insee`; the coverage basis is computed per this key.
65
48
  */
66
49
  admin_code: string | null
67
50
  /**
68
- * The register's own certification flag for the point (BAN `certification_commune`: 1 certified by the commune, 0
69
- * not), or null for a source that states none. A basis is never inferred from a share of these.
51
+ * The register's own certification flag for the point
52
+ * (BAN `certification_commune`: 1 certified, 0 not), never inferred from a share.
70
53
  */
71
54
  certified: number | null
72
55
  }
@@ -79,17 +62,13 @@ export interface AddressPointDatabase {
79
62
  }
80
63
 
81
64
  /**
82
- * The slice of a Kysely handle the `address_point` DDL touches — the parameter type its builders take.
83
- *
84
- * Kysely is invariant in its schema parameter (the incompatibility is in `transaction()`), so a extract that EXTENDS
85
- * `AddressPointTable` — OSM adds `h3_cell` — cannot pass its own handle to a `Kysely<AddressPointDatabase>` parameter.
86
- * Naming only `schema` lets it, and the DDL below needs nothing else.
65
+ * The subset of a Kysely handle the DDL touches, narrowed to `schema`
66
+ * because Kysely is invariant in its schema parameter.
87
67
  */
88
68
  export type AddressPointSchemaHandle = Pick<Kysely<AddressPointDatabase>, "schema">
89
69
 
90
70
  /**
91
- * The `address_point` columns in INSERT order. The builder's positional prepared statement derives its placeholder list
92
- * from this, so the positional order can't drift from the DDL / the reader.
71
+ * The `address_point` columns in insert order, from which the builder derives its positional placeholders.
93
72
  */
94
73
  export const ADDRESS_POINT_COLUMNS = [
95
74
  "street_norm",
@@ -114,7 +93,7 @@ export async function createAddressPointTable(db: AddressPointSchemaHandle): Pro
114
93
  await db.schema
115
94
  .createTable("address_point")
116
95
  .addColumn("street_norm", "text", (c) => c.notNull())
117
- // `street_key` = canonicalizeRouteKey(street_norm): the route-fold key (#483 Method 2).
96
+
118
97
  .addColumn("street_key", "text", (c) => c.notNull())
119
98
  .addColumn("number", "text", (c) => c.notNull())
120
99
  .addColumn("unit", "text")
@@ -147,9 +126,7 @@ export async function createAddressPointIndexes(db: AddressPointSchemaHandle): P
147
126
  .execute()
148
127
 
149
128
  await db.schema.createIndex("idx_ap_streetkey").on("address_point").columns(["postcode", "street_key"]).execute()
150
- // Street-first index for the BBOX scope (#247): OSM points often carry no postcode/locality, so the
151
- // reader scopes a `(street_norm, number)` probe by the resolved locality's bbox (lat/lon BETWEEN). The
152
- // postcode/locality indexes lead with their scope column and can't serve this; US situs never probes by
153
- // bbox so it simply carries one extra (cheap) index on a future rebuild.
129
+ // Street-first index for the bbox scope: OSM points often have no postcode or locality,
130
+ // so the reader scopes a `(street_norm, number)` probe by the resolved locality's bbox.
154
131
  await db.schema.createIndex("idx_ap_street").on("address_point").columns(["street_norm", "number"]).execute()
155
132
  }