@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.
- package/README.md +9 -8
- package/lib/address/point/interpolation.ts +45 -39
- package/lib/address/point/schema.ts +17 -40
- package/lib/address/point.ts +316 -0
- package/lib/{address/index.ts → address.ts} +1 -1
- package/lib/ancestry/backfill.ts +20 -86
- package/lib/{ancestry/index.ts → ancestry.ts} +19 -15
- package/lib/build/candidate.ts +122 -174
- package/lib/build/population-corrections.ts +64 -0
- package/lib/build/slim.ts +44 -114
- package/lib/candidate/alias-bags.ts +16 -17
- package/lib/candidate/ancestors/schema.ts +77 -61
- package/lib/candidate/ancestors/sidecar.ts +15 -22
- package/lib/candidate/country-display-names.ts +6 -20
- package/lib/candidate/extract-fold.ts +10 -55
- package/lib/candidate/fts.ts +5 -23
- package/lib/candidate/importance.ts +65 -68
- package/lib/candidate/lookup.ts +124 -415
- package/lib/candidate/name-roles.ts +15 -33
- package/lib/candidate/own-name.ts +35 -32
- package/lib/candidate/place-attrs.ts +20 -13
- package/lib/candidate/schema.ts +29 -65
- package/lib/candidate/scoring.ts +54 -93
- package/lib/capital-schema.ts +21 -17
- package/lib/capitals.ts +29 -27
- package/lib/coincident-roles.ts +85 -55
- package/lib/convention/schema.ts +15 -16
- package/lib/convention.ts +144 -0
- package/lib/coverage-manifest-schema.ts +40 -45
- package/lib/currency-backfill.ts +34 -79
- package/lib/env.ts +1 -1
- package/lib/exact-match.ts +32 -21
- package/lib/extracts.ts +97 -74
- package/lib/fst/autocomplete.ts +54 -37
- package/lib/fst/builder.ts +37 -41
- package/lib/fst/deserialize-web.ts +16 -17
- package/lib/fst/format.ts +41 -23
- package/lib/fst/freshness.ts +43 -120
- package/lib/fst/matcher.ts +7 -5
- package/lib/fst/serialize.ts +54 -74
- package/lib/fst/types.ts +78 -75
- package/lib/{fst/index.ts → fst.ts} +1 -0
- package/lib/fts/query.ts +5 -36
- package/lib/fts.ts +280 -0
- package/lib/geonames/aliases.ts +73 -144
- package/lib/geonames/postal.ts +162 -71
- package/lib/index.ts +9 -8
- package/lib/interpolation.ts +48 -100
- package/lib/lookup.ts +155 -270
- package/lib/name-score.ts +9 -7
- package/lib/nsul/lookup.ts +37 -54
- package/lib/nsul/schema.ts +16 -43
- package/lib/paths.ts +159 -0
- package/lib/place-importance-schema.ts +62 -169
- package/lib/poi/lookup.ts +104 -121
- package/lib/poi/schema.ts +42 -26
- package/lib/polygon-schema.ts +10 -6
- package/lib/postal/city/alias/lookup.ts +22 -40
- package/lib/postal/city/alias/schema.ts +14 -10
- package/lib/postal/city/candidate-schema.ts +26 -20
- package/lib/postcode-point-lookup.ts +8 -27
- package/lib/primary-preference.ts +46 -126
- package/lib/proximity-rerank.ts +44 -33
- package/lib/ranking-weights.ts +105 -78
- package/lib/region-keys.ts +70 -42
- package/lib/reverse.ts +149 -86
- package/lib/schema.ts +73 -50
- package/lib/search-fetch.ts +90 -68
- package/lib/sqlite/convention-source.ts +15 -23
- package/lib/sqlite/utils.ts +19 -22
- package/lib/street/centroid/schema.ts +37 -42
- package/lib/street/{centroid/index.ts → centroid.ts} +16 -25
- package/lib/street/morphology/fst/builder.ts +60 -42
- package/lib/street/morphology/fst/loader.ts +40 -32
- package/lib/street/name-lookup.ts +45 -41
- package/lib/street/normalize.ts +88 -219
- package/lib/street/segment-schema.ts +116 -43
- package/lib/{street/index.ts → street.ts} +1 -1
- package/lib/types.ts +109 -150
- package/lib/unified-schema.ts +29 -29
- package/lib/uprn/existence.ts +30 -19
- package/lib/uprn/lookup.ts +29 -68
- package/lib/uprn/schema.ts +18 -40
- package/lib/weights-overlay-linker.ts +236 -252
- package/out/address/point/interpolation.d.ts +20 -23
- package/out/address/point/interpolation.d.ts.map +1 -1
- package/out/address/point/interpolation.js +42 -39
- package/out/address/point/interpolation.js.map +1 -1
- package/out/address/point/schema.d.ts +12 -35
- package/out/address/point/schema.d.ts.map +1 -1
- package/out/address/point/schema.js +3 -19
- package/out/address/point/schema.js.map +1 -1
- package/out/address/point.d.ts +57 -0
- package/out/address/point.d.ts.map +1 -0
- package/out/address/point.js +206 -0
- package/out/address/point.js.map +1 -0
- package/out/{address/index.js → address.d.ts} +2 -2
- package/out/address.d.ts.map +1 -0
- package/out/{address/index.d.ts → address.js} +2 -2
- package/out/address.js.map +1 -0
- package/out/ancestry/backfill.d.ts +11 -64
- package/out/ancestry/backfill.d.ts.map +1 -1
- package/out/ancestry/backfill.js +14 -74
- package/out/ancestry/backfill.js.map +1 -1
- package/out/ancestry.d.ts +49 -0
- package/out/ancestry.d.ts.map +1 -0
- package/out/ancestry.js +59 -0
- package/out/ancestry.js.map +1 -0
- package/out/build/candidate.d.ts +82 -112
- package/out/build/candidate.d.ts.map +1 -1
- package/out/build/candidate.js +17 -100
- package/out/build/candidate.js.map +1 -1
- package/out/build/population-corrections.d.ts +52 -0
- package/out/build/population-corrections.d.ts.map +1 -0
- package/out/build/population-corrections.js +40 -0
- package/out/build/population-corrections.js.map +1 -0
- package/out/build/slim.d.ts +8 -44
- package/out/build/slim.d.ts.map +1 -1
- package/out/build/slim.js +33 -94
- package/out/build/slim.js.map +1 -1
- package/out/candidate/alias-bags.d.ts +6 -6
- package/out/candidate/alias-bags.d.ts.map +1 -1
- package/out/candidate/alias-bags.js +16 -17
- package/out/candidate/alias-bags.js.map +1 -1
- package/out/candidate/ancestors/schema.d.ts +73 -57
- package/out/candidate/ancestors/schema.d.ts.map +1 -1
- package/out/candidate/ancestors/schema.js +56 -48
- package/out/candidate/ancestors/schema.js.map +1 -1
- package/out/candidate/ancestors/sidecar.d.ts +3 -8
- package/out/candidate/ancestors/sidecar.d.ts.map +1 -1
- package/out/candidate/ancestors/sidecar.js +15 -22
- package/out/candidate/ancestors/sidecar.js.map +1 -1
- package/out/candidate/country-display-names.d.ts +5 -15
- package/out/candidate/country-display-names.d.ts.map +1 -1
- package/out/candidate/country-display-names.js +6 -20
- package/out/candidate/country-display-names.js.map +1 -1
- package/out/candidate/extract-fold.d.ts +7 -15
- package/out/candidate/extract-fold.d.ts.map +1 -1
- package/out/candidate/extract-fold.js +5 -47
- package/out/candidate/extract-fold.js.map +1 -1
- package/out/candidate/fts.d.ts +5 -23
- package/out/candidate/fts.d.ts.map +1 -1
- package/out/candidate/fts.js +5 -23
- package/out/candidate/fts.js.map +1 -1
- package/out/candidate/importance.d.ts +60 -65
- package/out/candidate/importance.d.ts.map +1 -1
- package/out/candidate/importance.js +56 -63
- package/out/candidate/importance.js.map +1 -1
- package/out/candidate/lookup.d.ts +18 -55
- package/out/candidate/lookup.d.ts.map +1 -1
- package/out/candidate/lookup.js +82 -385
- package/out/candidate/lookup.js.map +1 -1
- package/out/candidate/name-roles.d.ts +9 -21
- package/out/candidate/name-roles.d.ts.map +1 -1
- package/out/candidate/name-roles.js +15 -33
- package/out/candidate/name-roles.js.map +1 -1
- package/out/candidate/own-name.d.ts +23 -25
- package/out/candidate/own-name.d.ts.map +1 -1
- package/out/candidate/own-name.js +35 -32
- package/out/candidate/own-name.js.map +1 -1
- package/out/candidate/place-attrs.d.ts +20 -13
- package/out/candidate/place-attrs.d.ts.map +1 -1
- package/out/candidate/place-attrs.js +4 -5
- package/out/candidate/place-attrs.js.map +1 -1
- package/out/candidate/schema.d.ts +27 -62
- package/out/candidate/schema.d.ts.map +1 -1
- package/out/candidate/schema.js +10 -22
- package/out/candidate/schema.js.map +1 -1
- package/out/candidate/scoring.d.ts +7 -8
- package/out/candidate/scoring.d.ts.map +1 -1
- package/out/candidate/scoring.js +52 -89
- package/out/candidate/scoring.js.map +1 -1
- package/out/capital-schema.d.ts +21 -17
- package/out/capital-schema.d.ts.map +1 -1
- package/out/capital-schema.js +17 -15
- package/out/capital-schema.js.map +1 -1
- package/out/capitals.d.ts +27 -25
- package/out/capitals.d.ts.map +1 -1
- package/out/capitals.js +23 -21
- package/out/capitals.js.map +1 -1
- package/out/coincident-roles.d.ts +60 -43
- package/out/coincident-roles.d.ts.map +1 -1
- package/out/coincident-roles.js +72 -50
- package/out/coincident-roles.js.map +1 -1
- package/out/convention/schema.d.ts +14 -14
- package/out/convention/schema.d.ts.map +1 -1
- package/out/convention/schema.js +6 -4
- package/out/convention/schema.js.map +1 -1
- package/out/convention.d.ts +97 -0
- package/out/convention.d.ts.map +1 -0
- package/out/convention.js +81 -0
- package/out/convention.js.map +1 -0
- package/out/coverage-manifest-schema.d.ts +34 -39
- package/out/coverage-manifest-schema.d.ts.map +1 -1
- package/out/coverage-manifest-schema.js +25 -34
- package/out/coverage-manifest-schema.js.map +1 -1
- package/out/currency-backfill.d.ts +16 -38
- package/out/currency-backfill.d.ts.map +1 -1
- package/out/currency-backfill.js +19 -46
- package/out/currency-backfill.js.map +1 -1
- package/out/env.d.ts +1 -1
- package/out/env.js +1 -1
- package/out/exact-match.d.ts +19 -10
- package/out/exact-match.d.ts.map +1 -1
- package/out/exact-match.js +32 -21
- package/out/exact-match.js.map +1 -1
- package/out/extracts.d.ts +66 -55
- package/out/extracts.d.ts.map +1 -1
- package/out/extracts.js +63 -55
- package/out/extracts.js.map +1 -1
- package/out/fst/autocomplete.d.ts +29 -21
- package/out/fst/autocomplete.d.ts.map +1 -1
- package/out/fst/autocomplete.js +39 -28
- package/out/fst/autocomplete.js.map +1 -1
- package/out/fst/builder.d.ts.map +1 -1
- package/out/fst/builder.js +37 -41
- package/out/fst/builder.js.map +1 -1
- package/out/fst/deserialize-web.d.ts +4 -4
- package/out/fst/deserialize-web.d.ts.map +1 -1
- package/out/fst/deserialize-web.js +15 -16
- package/out/fst/deserialize-web.js.map +1 -1
- package/out/fst/format.d.ts +41 -23
- package/out/fst/format.d.ts.map +1 -1
- package/out/fst/format.js +41 -23
- package/out/fst/format.js.map +1 -1
- package/out/fst/freshness.d.ts +19 -81
- package/out/fst/freshness.d.ts.map +1 -1
- package/out/fst/freshness.js +31 -94
- package/out/fst/freshness.js.map +1 -1
- package/out/fst/matcher.d.ts +5 -4
- package/out/fst/matcher.d.ts.map +1 -1
- package/out/fst/matcher.js +2 -2
- package/out/fst/matcher.js.map +1 -1
- package/out/fst/serialize.d.ts +28 -28
- package/out/fst/serialize.d.ts.map +1 -1
- package/out/fst/serialize.js +53 -71
- package/out/fst/serialize.js.map +1 -1
- package/out/fst/types.d.ts +78 -74
- package/out/fst/types.d.ts.map +1 -1
- package/out/fst/types.js +1 -4
- package/out/fst/types.js.map +1 -1
- package/out/{fst/index.js → fst.d.ts} +2 -1
- package/out/fst.d.ts.map +1 -0
- package/out/{fst/index.d.ts → fst.js} +2 -1
- package/out/fst.js.map +1 -0
- package/out/fts/query.d.ts +2 -27
- package/out/fts/query.d.ts.map +1 -1
- package/out/fts/query.js +5 -36
- package/out/fts/query.js.map +1 -1
- package/out/fts.d.ts +126 -0
- package/out/fts.d.ts.map +1 -0
- package/out/fts.js +188 -0
- package/out/fts.js.map +1 -0
- package/out/geonames/aliases.d.ts +26 -62
- package/out/geonames/aliases.d.ts.map +1 -1
- package/out/geonames/aliases.js +45 -117
- package/out/geonames/aliases.js.map +1 -1
- package/out/geonames/postal.d.ts +84 -44
- package/out/geonames/postal.d.ts.map +1 -1
- package/out/geonames/postal.js +115 -73
- package/out/geonames/postal.js.map +1 -1
- package/out/{geonames/index.js → geonames.d.ts} +1 -1
- package/out/geonames.d.ts.map +1 -0
- package/out/{geonames/index.d.ts → geonames.js} +1 -1
- package/out/geonames.js.map +1 -0
- package/out/index.d.ts +9 -8
- package/out/index.d.ts.map +1 -1
- package/out/index.js +6 -5
- package/out/index.js.map +1 -1
- package/out/interpolation.d.ts +18 -55
- package/out/interpolation.d.ts.map +1 -1
- package/out/interpolation.js +27 -69
- package/out/interpolation.js.map +1 -1
- package/out/lookup.d.ts +23 -51
- package/out/lookup.d.ts.map +1 -1
- package/out/lookup.js +136 -234
- package/out/lookup.js.map +1 -1
- package/out/name-score.d.ts +2 -2
- package/out/name-score.d.ts.map +1 -1
- package/out/name-score.js +9 -7
- package/out/name-score.js.map +1 -1
- package/out/nsul/lookup.d.ts +33 -34
- package/out/nsul/lookup.d.ts.map +1 -1
- package/out/nsul/lookup.js +26 -40
- package/out/nsul/lookup.js.map +1 -1
- package/out/nsul/schema.d.ts +16 -43
- package/out/nsul/schema.d.ts.map +1 -1
- package/out/nsul/schema.js +9 -35
- package/out/nsul/schema.js.map +1 -1
- package/out/{nsul/index.d.ts → nsul.d.ts} +1 -1
- package/out/nsul.d.ts.map +1 -0
- package/out/{nsul/index.js → nsul.js} +1 -1
- package/out/nsul.js.map +1 -0
- package/out/paths.d.ts +124 -0
- package/out/paths.d.ts.map +1 -0
- package/out/paths.js +104 -0
- package/out/paths.js.map +1 -0
- package/out/place-importance-schema.d.ts +51 -143
- package/out/place-importance-schema.d.ts.map +1 -1
- package/out/place-importance-schema.js +28 -143
- package/out/place-importance-schema.js.map +1 -1
- package/out/poi/lookup.d.ts +40 -47
- package/out/poi/lookup.d.ts.map +1 -1
- package/out/poi/lookup.js +69 -96
- package/out/poi/lookup.js.map +1 -1
- package/out/poi/schema.d.ts +41 -25
- package/out/poi/schema.d.ts.map +1 -1
- package/out/poi/schema.js +25 -17
- package/out/poi/schema.js.map +1 -1
- package/out/{poi/index.js → poi.d.ts} +1 -1
- package/out/poi.d.ts.map +1 -0
- package/out/{poi/index.d.ts → poi.js} +1 -1
- package/out/poi.js.map +1 -0
- package/out/polygon-schema.d.ts +10 -6
- package/out/polygon-schema.d.ts.map +1 -1
- package/out/polygon-schema.js +2 -2
- package/out/polygon-schema.js.map +1 -1
- package/out/postal/city/alias/lookup.d.ts +20 -23
- package/out/postal/city/alias/lookup.d.ts.map +1 -1
- package/out/postal/city/alias/lookup.js +17 -30
- package/out/postal/city/alias/lookup.js.map +1 -1
- package/out/postal/city/alias/schema.d.ts +14 -10
- package/out/postal/city/alias/schema.d.ts.map +1 -1
- package/out/postal/city/alias/schema.js +10 -8
- package/out/postal/city/alias/schema.js.map +1 -1
- package/out/postal/city/candidate-schema.d.ts +25 -19
- package/out/postal/city/candidate-schema.d.ts.map +1 -1
- package/out/postal/city/candidate-schema.js +21 -17
- package/out/postal/city/candidate-schema.js.map +1 -1
- package/out/{postal/index.d.ts → postal.d.ts} +1 -1
- package/out/postal.d.ts.map +1 -0
- package/out/{postal/index.js → postal.js} +1 -1
- package/out/postal.js.map +1 -0
- package/out/postcode-point-lookup.d.ts +6 -24
- package/out/postcode-point-lookup.d.ts.map +1 -1
- package/out/postcode-point-lookup.js +5 -17
- package/out/postcode-point-lookup.js.map +1 -1
- package/out/primary-preference.d.ts +38 -92
- package/out/primary-preference.d.ts.map +1 -1
- package/out/primary-preference.js +15 -99
- package/out/primary-preference.js.map +1 -1
- package/out/proximity-rerank.d.ts +41 -30
- package/out/proximity-rerank.d.ts.map +1 -1
- package/out/proximity-rerank.js +38 -29
- package/out/proximity-rerank.js.map +1 -1
- package/out/ranking-weights.d.ts +98 -64
- package/out/ranking-weights.d.ts.map +1 -1
- package/out/ranking-weights.js +26 -25
- package/out/ranking-weights.js.map +1 -1
- package/out/region-keys.d.ts +50 -31
- package/out/region-keys.d.ts.map +1 -1
- package/out/region-keys.js +68 -40
- package/out/region-keys.js.map +1 -1
- package/out/reverse.d.ts +78 -50
- package/out/reverse.d.ts.map +1 -1
- package/out/reverse.js +98 -61
- package/out/reverse.js.map +1 -1
- package/out/schema.d.ts +72 -49
- package/out/schema.d.ts.map +1 -1
- package/out/schema.js +4 -5
- package/out/schema.js.map +1 -1
- package/out/search-fetch.d.ts +16 -12
- package/out/search-fetch.d.ts.map +1 -1
- package/out/search-fetch.js +83 -63
- package/out/search-fetch.js.map +1 -1
- package/out/sqlite/convention-source.d.ts +12 -16
- package/out/sqlite/convention-source.d.ts.map +1 -1
- package/out/sqlite/convention-source.js +13 -22
- package/out/sqlite/convention-source.js.map +1 -1
- package/out/sqlite/utils.d.ts +19 -19
- package/out/sqlite/utils.d.ts.map +1 -1
- package/out/sqlite/utils.js +14 -15
- package/out/sqlite/utils.js.map +1 -1
- package/out/street/centroid/schema.d.ts +37 -42
- package/out/street/centroid/schema.d.ts.map +1 -1
- package/out/street/centroid/schema.js +9 -21
- package/out/street/centroid/schema.js.map +1 -1
- package/out/street/centroid.d.ts +30 -0
- package/out/street/centroid.d.ts.map +1 -0
- package/out/street/{centroid/index.js → centroid.js} +13 -24
- package/out/street/centroid.js.map +1 -0
- package/out/street/morphology/fst/builder.d.ts +20 -10
- package/out/street/morphology/fst/builder.d.ts.map +1 -1
- package/out/street/morphology/fst/builder.js +44 -34
- package/out/street/morphology/fst/builder.js.map +1 -1
- package/out/street/morphology/fst/loader.d.ts +33 -26
- package/out/street/morphology/fst/loader.d.ts.map +1 -1
- package/out/street/morphology/fst/loader.js +23 -22
- package/out/street/morphology/fst/loader.js.map +1 -1
- package/out/street/name-lookup.d.ts +24 -18
- package/out/street/name-lookup.d.ts.map +1 -1
- package/out/street/name-lookup.js +34 -35
- package/out/street/name-lookup.js.map +1 -1
- package/out/street/normalize.d.ts +35 -136
- package/out/street/normalize.d.ts.map +1 -1
- package/out/street/normalize.js +77 -194
- package/out/street/normalize.js.map +1 -1
- package/out/street/segment-schema.d.ts +79 -39
- package/out/street/segment-schema.d.ts.map +1 -1
- package/out/street/segment-schema.js +71 -21
- package/out/street/segment-schema.js.map +1 -1
- package/out/{street/index.js → street.d.ts} +2 -2
- package/out/street.d.ts.map +1 -0
- package/out/{street/index.d.ts → street.js} +2 -2
- package/out/street.js.map +1 -0
- package/out/types.d.ts +84 -149
- package/out/types.d.ts.map +1 -1
- package/out/types.js +0 -6
- package/out/types.js.map +1 -1
- package/out/unified-schema.d.ts +8 -12
- package/out/unified-schema.d.ts.map +1 -1
- package/out/unified-schema.js +29 -29
- package/out/unified-schema.js.map +1 -1
- package/out/uprn/existence.d.ts +28 -17
- package/out/uprn/existence.d.ts.map +1 -1
- package/out/uprn/existence.js +26 -16
- package/out/uprn/existence.js.map +1 -1
- package/out/uprn/lookup.d.ts +14 -44
- package/out/uprn/lookup.d.ts.map +1 -1
- package/out/uprn/lookup.js +21 -57
- package/out/uprn/lookup.js.map +1 -1
- package/out/uprn/schema.d.ts +18 -40
- package/out/uprn/schema.d.ts.map +1 -1
- package/out/uprn/schema.js +10 -32
- package/out/uprn/schema.js.map +1 -1
- package/out/{uprn/index.d.ts → uprn.d.ts} +1 -1
- package/out/uprn.d.ts.map +1 -0
- package/out/{uprn/index.js → uprn.js} +1 -1
- package/out/uprn.js.map +1 -0
- package/out/weights-overlay-linker.d.ts +138 -144
- package/out/weights-overlay-linker.d.ts.map +1 -1
- package/out/weights-overlay-linker.js +105 -159
- package/out/weights-overlay-linker.js.map +1 -1
- package/package.json +91 -596
- package/lib/address/point/index.ts +0 -328
- package/lib/convention/index.ts +0 -154
- package/lib/fts/index.ts +0 -361
- package/out/address/index.d.ts.map +0 -1
- package/out/address/index.js.map +0 -1
- package/out/address/point/index.d.ts +0 -53
- package/out/address/point/index.d.ts.map +0 -1
- package/out/address/point/index.js +0 -222
- package/out/address/point/index.js.map +0 -1
- package/out/ancestry/index.d.ts +0 -45
- package/out/ancestry/index.d.ts.map +0 -1
- package/out/ancestry/index.js +0 -55
- package/out/ancestry/index.js.map +0 -1
- package/out/convention/index.d.ts +0 -106
- package/out/convention/index.d.ts.map +0 -1
- package/out/convention/index.js +0 -93
- package/out/convention/index.js.map +0 -1
- package/out/fst/index.d.ts.map +0 -1
- package/out/fst/index.js.map +0 -1
- package/out/fts/index.d.ts +0 -184
- package/out/fts/index.d.ts.map +0 -1
- package/out/fts/index.js +0 -277
- package/out/fts/index.js.map +0 -1
- package/out/geonames/index.d.ts.map +0 -1
- package/out/geonames/index.js.map +0 -1
- package/out/nsul/index.d.ts.map +0 -1
- package/out/nsul/index.js.map +0 -1
- package/out/poi/index.d.ts.map +0 -1
- package/out/poi/index.js.map +0 -1
- package/out/postal/index.d.ts.map +0 -1
- package/out/postal/index.js.map +0 -1
- package/out/street/centroid/index.d.ts +0 -40
- package/out/street/centroid/index.d.ts.map +0 -1
- package/out/street/centroid/index.js.map +0 -1
- package/out/street/index.d.ts.map +0 -1
- package/out/street/index.js.map +0 -1
- package/out/uprn/index.d.ts.map +0 -1
- package/out/uprn/index.js.map +0 -1
- /package/lib/{geonames/index.ts → geonames.ts} +0 -0
- /package/lib/{nsul/index.ts → nsul.ts} +0 -0
- /package/lib/{poi/index.ts → poi.ts} +0 -0
- /package/lib/{postal/index.ts → postal.ts} +0 -0
- /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
|
|
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
|
-
##
|
|
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
|
|
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
|
-
##
|
|
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
|
-
- **
|
|
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
|
|
244
|
-
both a `Pari*`-prefixed word
|
|
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
|
|
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
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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
|
-
*
|
|
15
|
-
* (`canonicalizeRouteKey`), identical at build time (`
|
|
16
|
-
*
|
|
17
|
-
*
|
|
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
|
-
*
|
|
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
|
|
26
|
-
* - Single-sided (`bracket: "single"`): linear extrapolation along the two nearest known numbers
|
|
27
|
-
* that side, capped at one pair-span beyond the nearest point (`t ≤ 2
|
|
28
|
-
*
|
|
29
|
-
* the extrapolated overshoot,
|
|
30
|
-
* - No bracket
|
|
31
|
-
* the
|
|
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
|
|
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
|
|
46
|
-
*
|
|
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.
|
|
75
|
-
*
|
|
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
|
|
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 =
|
|
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
|
|
93
|
-
// is skipped
|
|
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`)
|
|
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
|
|
169
|
-
|
|
170
|
-
let
|
|
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
|
-
// `
|
|
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
|
|
25
|
-
*
|
|
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
|
|
35
|
-
* interchanged with
|
|
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
|
|
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 —
|
|
64
|
-
*
|
|
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
|
|
69
|
-
*
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
151
|
-
// reader scopes a `(street_norm, number)` probe by the resolved locality's bbox
|
|
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
|
}
|