@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
|
@@ -2,33 +2,6 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* The TWO-SCORE SPLIT (ROAD_TO_V9 §2 R1) — typed schema, table builder, and the two derivations, in
|
|
7
|
-
* one module so the read contract and the DDL cannot drift.
|
|
8
|
-
*
|
|
9
|
-
* THE POLICY THIS ENCODES, ratified 2026-08-06: **the importance of a knowledge-base article is not
|
|
10
|
-
* the probability that this is the place the user means.** The geocoder ranks by REFERENTIAL
|
|
11
|
-
* likelihood; encyclopedic importance is carried as data and is never the ranking key. So the one
|
|
12
|
-
* `place_importance.importance` column — which was a Wikipedia score where the concordance join
|
|
13
|
-
* landed and a population-derived pseudo-score everywhere else — becomes two named columns that can
|
|
14
|
-
* never be confused for one another:
|
|
15
|
-
*
|
|
16
|
-
* - {@link PlaceImportanceTable.referential} — population-anchored, ALWAYS derivable, the ranking
|
|
17
|
-
* backbone. {@link referentialFromPopulation} is the normalization the FST builder's population
|
|
18
|
-
* fallback has always used; naming it here is the whole change.
|
|
19
|
-
* - {@link PlaceImportanceTable.encyclopedic} — the fan-out-guarded Wikipedia join
|
|
20
|
-
* (`importance-fanout.ts`, #1497). NULLABLE, and null means ABSENT, never "an importance of
|
|
21
|
-
* zero": ~1.5 M of the 1.54 M rows in the 2026-08-05 build have no Wikipedia article at all, and
|
|
22
|
-
* a consumer that reads a 0 there would be reading a fact nobody recorded.
|
|
23
|
-
*
|
|
24
|
-
* WHY SAINT-DENIS IS THE TEST. The Seine-Saint-Denis suburb (pop 96,128) carries encyclopedic
|
|
25
|
-
* 0.1173; the Aude hamlet (pop 418) carries 0.5683 — the encyclopedic signal ranks the hamlet 4.8x
|
|
26
|
-
* ABOVE the place every user means. Referentially the suburb wins by 230x on population. One score
|
|
27
|
-
* cannot serve both readers, which is why there are two.
|
|
28
|
-
*
|
|
29
|
-
* THE LEGACY COLUMN STAYS, AND IS DERIVED. `importance` is written by {@link blendImportance} — the
|
|
30
|
-
* bounded blend the bare-toponym fame consumer (#28) ranks on. It is the CONFLATION, and nothing new
|
|
31
|
-
* should read it; new code reads the split columns.
|
|
32
5
|
*/
|
|
33
6
|
|
|
34
7
|
import { referentialFromPopulation } from "@mailwoman/core/resolver"
|
|
@@ -36,42 +9,49 @@ import { allRows } from "@mailwoman/core/utils"
|
|
|
36
9
|
import type { DatabaseClient } from "@mailwoman/sqlite/client"
|
|
37
10
|
import type { Kysely } from "kysely"
|
|
38
11
|
|
|
39
|
-
//#region Schema
|
|
40
|
-
|
|
41
12
|
/**
|
|
42
|
-
*
|
|
13
|
+
* Describes one row of the `place_importance` table, keyed by WOF place id.
|
|
43
14
|
*/
|
|
44
15
|
export interface PlaceImportanceTable {
|
|
45
16
|
id: number
|
|
17
|
+
|
|
46
18
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
19
|
+
* The population-anchored referential likelihood in [0, 1], from {@link referentialFromPopulation}.
|
|
20
|
+
*
|
|
21
|
+
* It is never NULL.
|
|
22
|
+
* A place without a population row scores `0`.
|
|
23
|
+
*
|
|
24
|
+
* That score represents no population evidence, so it earns no boost or penalty.
|
|
50
25
|
*/
|
|
51
26
|
referential: number
|
|
27
|
+
|
|
52
28
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
29
|
+
* The fan-out-guarded Wikipedia importance in [0, 1], or NULL when the place has no surviving concordance.
|
|
30
|
+
*
|
|
31
|
+
* NULL means absence, so consumers must not coalesce it to 0 or rank on it.
|
|
55
32
|
*/
|
|
56
33
|
encyclopedic: number | null
|
|
34
|
+
|
|
57
35
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
36
|
+
* Deprecated blend of the two scores, written by {@link blendImportance} for
|
|
37
|
+
* consumers that still need one scale.
|
|
38
|
+
*
|
|
39
|
+
* New code ranks on `referential` and displays `encyclopedic`.
|
|
61
40
|
*/
|
|
62
41
|
importance: number
|
|
63
42
|
}
|
|
64
43
|
|
|
65
44
|
/**
|
|
66
|
-
*
|
|
45
|
+
* Types the `place_importance` table of a WOF admin database
|
|
46
|
+
* for `new DatabaseClient<PlaceImportanceDatabase>(...)`.
|
|
67
47
|
*/
|
|
68
48
|
export interface PlaceImportanceDatabase {
|
|
69
49
|
place_importance: PlaceImportanceTable
|
|
70
50
|
}
|
|
71
51
|
|
|
72
52
|
/**
|
|
73
|
-
*
|
|
74
|
-
* {@link PlaceImportanceTable}
|
|
53
|
+
* Lists the `place_importance` columns in declaration order, each checked
|
|
54
|
+
* against {@link PlaceImportanceTable}.
|
|
75
55
|
*/
|
|
76
56
|
export const PLACE_IMPORTANCE_COLUMNS = [
|
|
77
57
|
"id",
|
|
@@ -81,8 +61,7 @@ export const PLACE_IMPORTANCE_COLUMNS = [
|
|
|
81
61
|
] as const satisfies readonly (keyof PlaceImportanceTable)[]
|
|
82
62
|
|
|
83
63
|
/**
|
|
84
|
-
*
|
|
85
|
-
* `mailwoman gazetteer importance`, never a migration.
|
|
64
|
+
* Drops and recreates the `place_importance` table with separate referential and encyclopedic columns.
|
|
86
65
|
*/
|
|
87
66
|
export async function createPlaceImportanceTable(db: Kysely<PlaceImportanceDatabase>): Promise<void> {
|
|
88
67
|
await db.schema.dropTable("place_importance").ifExists().execute()
|
|
@@ -96,110 +75,55 @@ export async function createPlaceImportanceTable(db: Kysely<PlaceImportanceDatab
|
|
|
96
75
|
.execute()
|
|
97
76
|
}
|
|
98
77
|
|
|
99
|
-
//#endregion
|
|
100
|
-
|
|
101
|
-
//#region The referential derivation
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Re-exported from `@mailwoman/core/resolver`, which is where the derivation lives so that `@mailwoman/resolver`
|
|
105
|
-
* (backend-agnostic — it cannot import this package) reads the same number. Re-exported HERE so the schema module stays
|
|
106
|
-
* the one-stop read for the table: the column and the function that fills it are one hop apart.
|
|
107
|
-
*/
|
|
108
|
-
|
|
109
|
-
//#endregion
|
|
110
|
-
|
|
111
|
-
//#region The legacy blend
|
|
112
|
-
|
|
113
78
|
/**
|
|
114
|
-
*
|
|
115
|
-
* score.
|
|
116
|
-
*
|
|
117
|
-
* In referential units 0.25 is 3.5 population doublings (the referential curve divides log2 by 14), so an article can
|
|
118
|
-
* promote a place as if it were up to ~11x its recorded population — never more. The bound exists because the two
|
|
119
|
-
* channels' scales CROSS at the article floor: merely having a Wikipedia article scores ~0.25–0.35, which exceeds the
|
|
120
|
-
* referential score of a mid-size town, so an unbounded blend ranks a 136-person village with an article above a
|
|
121
|
-
* 16,026-person town without one.
|
|
122
|
-
*
|
|
123
|
-
* The value is bracketed by two decided contests, measured on the 2026-08-24 staging build:
|
|
79
|
+
* Caps how far the encyclopedic score may raise a place's blended importance above its referential score.
|
|
124
80
|
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* - `< 0.2790`, or bare `Tó`/`To` answers Tó PT (pop 136, referential 0.0131, encyclopedic 0.3375) over Tô BF (pop
|
|
128
|
-
* 16,026, no article) — the `bf-gloss-to-*` board pair.
|
|
129
|
-
*
|
|
130
|
-
* 0.25 sits mid-interval with ~0.02 margin to each bound.
|
|
81
|
+
* Merely having an article scores about 0.25 to 0.35, above a mid-size town's referential score,
|
|
82
|
+
* so without the cap a tiny village with an article outranks a large town without one.
|
|
131
83
|
*/
|
|
132
84
|
export const ENCYCLOPEDIC_BOOST_CAP = 0.25
|
|
133
85
|
|
|
134
86
|
/**
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* - No population evidence (`referential` 0) → the encyclopedic score stands alone: there is nothing to bound the
|
|
140
|
-
* article's claim against, and a constant cap would demote every famous place WOF records no population for
|
|
141
|
-
* (meaning-of-zero: referential 0 is "unmeasured", not "tiny").
|
|
142
|
-
* - Both present → the encyclopedic value clamped to at most {@link ENCYCLOPEDIC_BOOST_CAP} above the referential score,
|
|
143
|
-
* and never below it. The floor half repairs the downward inversion (the Seine-Saint-Denis suburb's weak article
|
|
144
|
-
* scored 0.1173 and REPLACED its referential 0.4716 under the old `COALESCE`, so a 418-person Aude hamlet outranked
|
|
145
|
-
* it 4.8x); the cap half repairs the upward one (`Tó`, above).
|
|
146
|
-
*
|
|
147
|
-
* Scale of the clamp on the 2026-08-24 staging build: of 628,202 article-bearing rows, 209,738 sit above the cap and
|
|
148
|
-
* 13,888 sit below their referential floor; the 305,168 article-without-population rows pass through unchanged.
|
|
87
|
+
* Blends the two channels into the legacy `importance` column: the referential score
|
|
88
|
+
* when there is no article, only the encyclopedic score when population is unknown
|
|
89
|
+
* (`referential` 0), and otherwise the encyclopedic score clamped between the
|
|
90
|
+
* referential score and {@link ENCYCLOPEDIC_BOOST_CAP} above it.
|
|
149
91
|
*/
|
|
150
|
-
export function blendImportance(referential: number, encyclopedic: number | null
|
|
151
|
-
if (encyclopedic === null
|
|
92
|
+
export function blendImportance(referential: number, encyclopedic: number | null): number {
|
|
93
|
+
if (encyclopedic === null) return referential
|
|
152
94
|
|
|
153
95
|
if (referential <= 0) return encyclopedic
|
|
154
96
|
|
|
155
97
|
return Math.max(referential, Math.min(encyclopedic, referential + ENCYCLOPEDIC_BOOST_CAP))
|
|
156
98
|
}
|
|
157
99
|
|
|
158
|
-
//#endregion
|
|
159
|
-
|
|
160
|
-
//#region Reading a database that may or may not carry the split
|
|
161
|
-
|
|
162
100
|
/**
|
|
163
|
-
*
|
|
164
|
-
*
|
|
101
|
+
* Source names used by {@link loadImportanceSplit}.
|
|
102
|
+
* The FST stamp records these values as provenance.
|
|
165
103
|
*/
|
|
166
104
|
export const IMPORTANCE_SPLIT_SOURCES = {
|
|
167
|
-
/**
|
|
168
|
-
* `place_importance` carries `referential` + `encyclopedic` — the post-split build.
|
|
169
|
-
*/
|
|
170
105
|
splitColumns: "split-columns",
|
|
171
|
-
|
|
172
|
-
* `place_importance` carries only the conflated `importance`; the split was RECONSTRUCTED against `place_population`
|
|
173
|
-
* (see {@link splitLegacyImportance}).
|
|
174
|
-
*/
|
|
106
|
+
|
|
175
107
|
legacyReconstructed: "legacy-reconstructed",
|
|
176
|
-
|
|
177
|
-
* No `place_importance` at all — referential from `place_population`, encyclopedic absent for every place.
|
|
178
|
-
*/
|
|
108
|
+
|
|
179
109
|
populationOnly: "population-only",
|
|
180
|
-
|
|
181
|
-
* Neither table. Every score is 0, and 0 here means the database carries no salience evidence whatsoever.
|
|
182
|
-
*/
|
|
110
|
+
|
|
183
111
|
none: "none",
|
|
184
112
|
} as const
|
|
185
113
|
|
|
114
|
+
/**
|
|
115
|
+
* Identifies how an {@link ImportanceSplit} was obtained, as one of the
|
|
116
|
+
* {@link IMPORTANCE_SPLIT_SOURCES} values.
|
|
117
|
+
*/
|
|
186
118
|
export type ImportanceSplitSource = (typeof IMPORTANCE_SPLIT_SOURCES)[keyof typeof IMPORTANCE_SPLIT_SOURCES]
|
|
187
119
|
|
|
188
120
|
/**
|
|
189
|
-
*
|
|
190
|
-
*
|
|
121
|
+
* Returns the `select` term and `left join` that add `encyclopedic` to name-lookup results
|
|
122
|
+
* for `schemaName`, degrading to `NULL` and no join when the column is absent.
|
|
191
123
|
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
195
|
-
* encyclopedic would surface the exact confusion ROAD_TO_V9 §2 exists to end.
|
|
196
|
-
*
|
|
197
|
-
* There is deliberately no ORDER BY counterpart, and there should never be one: §2's policy is that this score is
|
|
198
|
-
* carried and never ranked on. Without the column the select degrades to a literal `NULL` and the join is the empty
|
|
199
|
-
* string, so a pre-split extract's query plan is byte-identical to what it was before the split. No shipped gazetteer
|
|
200
|
-
* carries the column yet, so today that degraded form is the only one anything builds.
|
|
201
|
-
*
|
|
202
|
-
* Call it ONCE per extract and cache the result — it runs a `PRAGMA`, and the callers are per-keystroke hot.
|
|
124
|
+
* It probes for the column rather than the table, because a pre-split table's
|
|
125
|
+
* `importance` mixes Wikipedia and population scores.
|
|
126
|
+
* Cache the result per extract, since it runs a `PRAGMA` and lookups are per keystroke.
|
|
203
127
|
*/
|
|
204
128
|
export function encyclopedicClauses<DB>(db: DatabaseClient<DB>, schemaName: string): { select: string; join: string } {
|
|
205
129
|
let present: boolean
|
|
@@ -221,47 +145,26 @@ export function encyclopedicClauses<DB>(db: DatabaseClient<DB>, schemaName: stri
|
|
|
221
145
|
}
|
|
222
146
|
|
|
223
147
|
/**
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
* ~1e-15 absolute against scores Nominatim publishes to four decimals.
|
|
148
|
+
* Sets the relative tolerance within which {@link splitLegacyImportance} treats
|
|
149
|
+
* a value as lying on the population curve.
|
|
227
150
|
*/
|
|
228
151
|
export const LEGACY_FALLBACK_EPSILON = 8 * Number.EPSILON
|
|
229
152
|
|
|
230
153
|
/**
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
* of `min(1, log2(1+pop/1000)/14)` for every place with a population that Wikipedia had missed. So a legacy value is a
|
|
235
|
-
* fallback row IFF it reproduces {@link referentialFromPopulation} of that place's population — the two passes wrote
|
|
236
|
-
* different arithmetic, and a score from Nominatim's four-decimal TSV landing on the log2 curve is a measure-zero
|
|
237
|
-
* event.
|
|
154
|
+
* Splits a legacy `place_importance` value into referential and encyclopedic scores,
|
|
155
|
+
* treating it as a population fallback when it matches {@link referentialFromPopulation}
|
|
156
|
+
* within {@link LEGACY_FALLBACK_EPSILON}.
|
|
238
157
|
*
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
* encyclopedic rows against Node's 133,096: `math.log2` and V8's `Math.log2` disagree by one ULP on 33,542 of the 1.5 M
|
|
242
|
-
* inputs (worked example: wof 85803233, population 21,299 — stored 0.31992193633838988953, CPython
|
|
243
|
-
* 0.31992193633838994504, delta 5.55e-17). Bit equality would therefore INVENT 33,542 encyclopedic scores for anyone
|
|
244
|
-
* who ported this rule to another runtime, and invented data is the failure mode this whole module exists to end. The
|
|
245
|
-
* tolerance is a few ULP of the score's own magnitude; a genuine Wikipedia value that close to the population curve is
|
|
246
|
-
* not distinguishable from it by any consequence.
|
|
247
|
-
*
|
|
248
|
-
* MEASURED, not reasoned (2026-08-06, `wof/fst-staging-2026-08-05/admin-global-priority-importance.db`): 1,543,753 rows
|
|
249
|
-
* split **1,410,657 fallback / 133,096 encyclopedic**, and the arithmetic closes on itself — 1,410,657 + 108,861
|
|
250
|
-
* (encyclopedic rows that ALSO have a population) = 1,519,518, which is exactly the count of `place_population` rows
|
|
251
|
-
* with `population > 0`, i.e. every row the fallback pass could have written. The remaining 24,235 encyclopedic rows
|
|
252
|
-
* have no population row at all. Under the exact-equality rule, Node found ZERO mismatches within one ULP, so the
|
|
253
|
-
* tolerance changes no classification on this database — it only makes the answer runtime-independent.
|
|
254
|
-
*
|
|
255
|
-
* Referential is NOT read out of the legacy column under any branch — it is always re-derived from population, because
|
|
256
|
-
* a legacy Wikipedia row overwrote whatever population would have said.
|
|
158
|
+
* The match allows a small tolerance because `log2` differs by an ULP across runtimes.
|
|
159
|
+
* Bit equality would invent encyclopedic scores.
|
|
257
160
|
*/
|
|
258
161
|
export function splitLegacyImportance(
|
|
259
|
-
legacy: number |
|
|
162
|
+
legacy: number | null,
|
|
260
163
|
population: number | null | undefined
|
|
261
164
|
): { referential: number; encyclopedic?: number } {
|
|
262
|
-
const referential = referentialFromPopulation(population)
|
|
165
|
+
const referential = referentialFromPopulation(population ?? null)
|
|
263
166
|
|
|
264
|
-
if (legacy ===
|
|
167
|
+
if (legacy === null) return { referential }
|
|
265
168
|
|
|
266
169
|
if (Math.abs(legacy - referential) <= LEGACY_FALLBACK_EPSILON * Math.max(referential, 1)) return { referential }
|
|
267
170
|
|
|
@@ -273,24 +176,23 @@ export function splitLegacyImportance(
|
|
|
273
176
|
*/
|
|
274
177
|
export interface ImportanceSplit {
|
|
275
178
|
/**
|
|
276
|
-
* WOF
|
|
179
|
+
* Referential likelihood by WOF ID, where a missing ID means 0 because only positive scores are stored.
|
|
277
180
|
*/
|
|
278
181
|
referential: Map<number, number>
|
|
182
|
+
|
|
279
183
|
/**
|
|
280
|
-
* WOF
|
|
184
|
+
* Encyclopedic importance by WOF ID, where a missing ID means no score and must not be filled with 0.
|
|
281
185
|
*/
|
|
282
186
|
encyclopedic: Map<number, number>
|
|
283
187
|
source: ImportanceSplitSource
|
|
188
|
+
|
|
284
189
|
/**
|
|
285
|
-
*
|
|
286
|
-
*
|
|
190
|
+
* The number of legacy rows attributed to the population fallback,
|
|
191
|
+
* nonzero only for the `legacy-reconstructed` source.
|
|
287
192
|
*/
|
|
288
193
|
legacyFallbackRows: number
|
|
289
194
|
}
|
|
290
195
|
|
|
291
|
-
/**
|
|
292
|
-
* Does `table` exist in `db`, and if so which of `columns` does it have?
|
|
293
|
-
*/
|
|
294
196
|
function tableColumns<DB>(db: DatabaseClient<DB>, table: string): Set<string> {
|
|
295
197
|
try {
|
|
296
198
|
const rows = allRows<{ name: string }>(db.prepare(`PRAGMA table_info(${table})`))
|
|
@@ -302,11 +204,7 @@ function tableColumns<DB>(db: DatabaseClient<DB>, table: string): Set<string> {
|
|
|
302
204
|
}
|
|
303
205
|
|
|
304
206
|
/**
|
|
305
|
-
*
|
|
306
|
-
*
|
|
307
|
-
* Handles all four states in {@link IMPORTANCE_SPLIT_SOURCES} so callers never branch on schema themselves — the FST
|
|
308
|
-
* builder in particular must read the shipped population-only databases, the read-only 2026-08-05 staging database
|
|
309
|
-
* (legacy conflated column), and post-split builds with one code path.
|
|
207
|
+
* Loads both importance scores from a WOF admin database, whichever schema generation it uses.
|
|
310
208
|
*/
|
|
311
209
|
export function loadImportanceSplit<DB>(db: DatabaseClient<DB>): ImportanceSplit {
|
|
312
210
|
const referential = new Map<number, number>()
|
|
@@ -334,9 +232,6 @@ export function loadImportanceSplit<DB>(db: DatabaseClient<DB>): ImportanceSplit
|
|
|
334
232
|
const importanceColumns = tableColumns(db, "place_importance")
|
|
335
233
|
|
|
336
234
|
if (importanceColumns.has("referential")) {
|
|
337
|
-
// Post-split build: the columns ARE the contract. Referential is read verbatim rather than
|
|
338
|
-
// re-derived, so a build that scored referential differently stays visible instead of being
|
|
339
|
-
// silently overwritten by this reader's own formula.
|
|
340
235
|
const rows = allRows<{
|
|
341
236
|
id: number
|
|
342
237
|
referential: number
|
|
@@ -389,5 +284,3 @@ export function loadImportanceSplit<DB>(db: DatabaseClient<DB>): ImportanceSplit
|
|
|
389
284
|
legacyFallbackRows: 0,
|
|
390
285
|
}
|
|
391
286
|
}
|
|
392
|
-
|
|
393
|
-
//#endregion
|