@mailwoman/resolver-wof-sqlite 9.4.0 → 10.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -8
- package/lib/address/{point-interpolation.ts → point/interpolation.ts} +40 -38
- package/lib/address/point/schema.ts +132 -0
- package/lib/address/point.ts +68 -81
- package/lib/{address/index.ts → address.ts} +2 -2
- package/lib/ancestry/backfill.ts +24 -88
- package/lib/{ancestry/index.ts → ancestry.ts} +19 -15
- package/lib/build/candidate.ts +608 -0
- package/lib/build/population-corrections.ts +64 -0
- package/lib/build/slim.ts +338 -0
- package/lib/candidate/alias-bags.ts +74 -14
- package/lib/candidate/ancestors/schema.ts +211 -0
- package/lib/candidate/{ancestors-sidecar.ts → ancestors/sidecar.ts} +17 -24
- package/lib/candidate/country-display-names.ts +6 -20
- package/lib/candidate/extract-fold.ts +12 -57
- package/lib/candidate/fts.ts +28 -0
- package/lib/candidate/importance.ts +221 -0
- package/lib/candidate/lookup.ts +669 -0
- package/lib/candidate/name-roles.ts +16 -34
- package/lib/candidate/own-name.ts +34 -31
- package/lib/candidate/place-attrs.ts +20 -13
- package/lib/candidate/schema.ts +211 -0
- package/lib/candidate/scoring.ts +222 -0
- package/lib/capital-schema.ts +21 -17
- package/lib/capitals.ts +26 -24
- package/lib/coincident-roles.ts +74 -55
- package/lib/convention/schema.ts +13 -7
- package/lib/convention.ts +144 -0
- package/lib/coverage-manifest-schema.ts +34 -39
- package/lib/currency-backfill.ts +24 -69
- package/lib/env.ts +1 -1
- package/lib/exact-match.ts +31 -20
- package/lib/extracts.ts +96 -73
- package/lib/fst/autocomplete.ts +52 -35
- package/lib/fst/builder.ts +30 -36
- package/lib/fst/deserialize-web.ts +8 -9
- package/lib/fst/format.ts +41 -23
- package/lib/fst/freshness.ts +17 -95
- package/lib/fst/matcher.ts +2 -2
- package/lib/fst/serialize.ts +45 -60
- package/lib/fst/types.ts +71 -59
- package/lib/fts/query.ts +5 -36
- package/lib/fts.ts +280 -0
- package/lib/geonames/aliases.ts +72 -149
- package/lib/geonames/postal.ts +162 -77
- package/lib/index.ts +20 -27
- package/lib/interpolation.ts +43 -96
- package/lib/lookup.ts +137 -257
- package/lib/name-score.ts +9 -7
- package/lib/nsul/lookup.ts +36 -53
- package/lib/nsul/schema.ts +16 -43
- package/lib/paths.ts +159 -0
- package/lib/place-importance-schema.ts +57 -164
- package/lib/poi/lookup.ts +100 -109
- package/lib/poi/schema.ts +42 -26
- package/lib/polygon-schema.ts +10 -6
- package/lib/postal/city/alias/lookup.ts +79 -0
- package/lib/postal/{city-alias-schema.ts → city/alias/schema.ts} +14 -10
- package/lib/postal/{city-candidate-schema.ts → city/candidate-schema.ts} +26 -20
- package/lib/postal.ts +9 -0
- package/lib/postcode-point-lookup.ts +9 -19
- package/lib/primary-preference.ts +45 -125
- package/lib/proximity-rerank.ts +43 -32
- package/lib/ranking-weights.ts +98 -76
- package/lib/region-keys.ts +68 -40
- package/lib/reverse.ts +108 -72
- package/lib/schema.ts +74 -42
- package/lib/search-fetch.ts +90 -68
- package/lib/sqlite/convention-source.ts +57 -0
- package/lib/sqlite/utils.ts +79 -0
- package/lib/street/centroid/schema.ts +149 -0
- package/lib/street/centroid.ts +16 -25
- package/lib/street/{morphology-fst-builder.ts → morphology/fst/builder.ts} +56 -41
- package/lib/street/{morphology-fst-loader.ts → morphology/fst/loader.ts} +36 -29
- package/lib/street/name-lookup.ts +43 -35
- package/lib/street/normalize.ts +85 -216
- package/lib/street/segment-schema.ts +116 -43
- package/lib/{street/index.ts → street.ts} +3 -3
- package/lib/types.ts +94 -140
- package/lib/unified-schema.ts +29 -29
- package/lib/uprn/existence.ts +30 -19
- package/lib/uprn/lookup.ts +28 -67
- package/lib/uprn/schema.ts +18 -40
- package/lib/weights-overlay-linker.ts +204 -232
- package/out/address/point/interpolation.d.ts +45 -0
- package/out/address/point/interpolation.d.ts.map +1 -0
- package/out/address/{point-interpolation.js → point/interpolation.js} +38 -38
- package/out/address/point/interpolation.js.map +1 -0
- package/out/address/point/schema.d.ts +74 -0
- package/out/address/point/schema.d.ts.map +1 -0
- package/out/address/{point-schema.js → point/schema.js} +4 -20
- package/out/address/point/schema.js.map +1 -0
- package/out/address/point.d.ts +24 -21
- package/out/address/point.d.ts.map +1 -1
- package/out/address/point.js +60 -77
- package/out/address/point.js.map +1 -1
- package/out/{address/index.js → address.d.ts} +3 -3
- package/out/address.d.ts.map +1 -0
- package/out/{address/index.d.ts → address.js} +3 -3
- 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 +18 -76
- 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 +170 -0
- package/out/build/candidate.d.ts.map +1 -0
- package/out/{build-candidate.js → build/candidate.js} +33 -102
- package/out/build/candidate.js.map +1 -0
- 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 +44 -0
- package/out/build/slim.d.ts.map +1 -0
- package/out/{build-slim.js → build/slim.js} +33 -94
- package/out/build/slim.js.map +1 -0
- package/out/candidate/alias-bags.d.ts +13 -5
- package/out/candidate/alias-bags.d.ts.map +1 -1
- package/out/candidate/alias-bags.js +55 -12
- package/out/candidate/alias-bags.js.map +1 -1
- package/out/candidate/ancestors/schema.d.ts +166 -0
- package/out/candidate/ancestors/schema.d.ts.map +1 -0
- package/out/candidate/ancestors/schema.js +131 -0
- package/out/candidate/ancestors/schema.js.map +1 -0
- package/out/candidate/ancestors/sidecar.d.ts +27 -0
- package/out/candidate/ancestors/sidecar.d.ts.map +1 -0
- package/out/candidate/{ancestors-sidecar.js → ancestors/sidecar.js} +17 -24
- package/out/candidate/ancestors/sidecar.js.map +1 -0
- 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 +8 -16
- package/out/candidate/extract-fold.d.ts.map +1 -1
- package/out/candidate/extract-fold.js +6 -48
- package/out/candidate/extract-fold.js.map +1 -1
- package/out/candidate/fts.d.ts +19 -0
- package/out/candidate/fts.d.ts.map +1 -0
- package/out/candidate/fts.js +22 -0
- package/out/candidate/fts.js.map +1 -0
- package/out/candidate/importance.d.ts +127 -0
- package/out/candidate/importance.d.ts.map +1 -0
- package/out/candidate/importance.js +162 -0
- package/out/candidate/importance.js.map +1 -0
- package/out/candidate/lookup.d.ts +36 -0
- package/out/candidate/lookup.d.ts.map +1 -0
- package/out/candidate/lookup.js +456 -0
- package/out/candidate/lookup.js.map +1 -0
- package/out/candidate/name-roles.d.ts +10 -22
- 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 +34 -31
- 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 +120 -0
- package/out/candidate/schema.d.ts.map +1 -0
- package/out/{candidate-schema.js → candidate/schema.js} +11 -23
- package/out/candidate/schema.js.map +1 -0
- package/out/{candidate-scoring.d.ts → candidate/scoring.d.ts} +8 -9
- package/out/candidate/scoring.d.ts.map +1 -0
- package/out/candidate/scoring.js +157 -0
- package/out/candidate/scoring.js.map +1 -0
- 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 +26 -24
- 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 +61 -50
- package/out/coincident-roles.js.map +1 -1
- package/out/convention/schema.d.ts +12 -6
- 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 +33 -38
- package/out/coverage-manifest-schema.d.ts.map +1 -1
- package/out/coverage-manifest-schema.js +20 -29
- package/out/coverage-manifest-schema.js.map +1 -1
- package/out/currency-backfill.d.ts +13 -35
- package/out/currency-backfill.d.ts.map +1 -1
- package/out/currency-backfill.js +12 -39
- package/out/currency-backfill.js.map +1 -1
- package/out/env.d.ts +2 -2
- 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 +31 -20
- package/out/exact-match.js.map +1 -1
- package/out/extracts.d.ts +65 -54
- 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 +28 -20
- package/out/fst/autocomplete.d.ts.map +1 -1
- package/out/fst/autocomplete.js +38 -27
- package/out/fst/autocomplete.js.map +1 -1
- package/out/fst/builder.d.ts.map +1 -1
- package/out/fst/builder.js +30 -36
- package/out/fst/builder.js.map +1 -1
- package/out/fst/deserialize-web.d.ts +3 -3
- package/out/fst/deserialize-web.d.ts.map +1 -1
- package/out/fst/deserialize-web.js +8 -9
- 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 +11 -73
- package/out/fst/freshness.d.ts.map +1 -1
- package/out/fst/freshness.js +12 -76
- package/out/fst/freshness.js.map +1 -1
- package/out/fst/matcher.d.ts +1 -1
- 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 +30 -26
- package/out/fst/serialize.d.ts.map +1 -1
- package/out/fst/serialize.js +44 -58
- package/out/fst/serialize.js.map +1 -1
- package/out/fst/types.d.ts +71 -59
- 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} +1 -1
- package/out/fst.d.ts.map +1 -0
- package/out/{fst/index.d.ts → fst.js} +1 -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 -67
- package/out/geonames/aliases.d.ts.map +1 -1
- package/out/geonames/aliases.js +44 -121
- package/out/geonames/aliases.js.map +1 -1
- package/out/geonames/postal.d.ts +84 -50
- package/out/geonames/postal.d.ts.map +1 -1
- package/out/geonames/postal.js +115 -78
- 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 +20 -21
- package/out/index.d.ts.map +1 -1
- package/out/index.js +14 -15
- package/out/index.js.map +1 -1
- package/out/interpolation.d.ts +15 -52
- package/out/interpolation.d.ts.map +1 -1
- package/out/interpolation.js +25 -68
- package/out/interpolation.js.map +1 -1
- package/out/lookup.d.ts +24 -53
- package/out/lookup.d.ts.map +1 -1
- package/out/lookup.js +117 -223
- 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 +49 -141
- package/out/place-importance-schema.d.ts.map +1 -1
- package/out/place-importance-schema.js +25 -140
- package/out/place-importance-schema.js.map +1 -1
- package/out/poi/lookup.d.ts +38 -42
- package/out/poi/lookup.d.ts.map +1 -1
- package/out/poi/lookup.js +67 -90
- 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 → city/alias/lookup.d.ts} +22 -25
- package/out/postal/city/alias/lookup.d.ts.map +1 -0
- package/out/postal/city/alias/lookup.js +49 -0
- package/out/postal/city/alias/lookup.js.map +1 -0
- package/out/postal/{city-alias-schema.d.ts → city/alias/schema.d.ts} +15 -11
- package/out/postal/city/alias/schema.d.ts.map +1 -0
- package/out/postal/{city-alias-schema.js → city/alias/schema.js} +11 -9
- package/out/postal/city/alias/schema.js.map +1 -0
- package/out/postal/city/candidate-schema.d.ts +72 -0
- package/out/postal/city/candidate-schema.d.ts.map +1 -0
- package/out/postal/city/candidate-schema.js +60 -0
- package/out/postal/city/candidate-schema.js.map +1 -0
- package/out/postal.d.ts +9 -0
- package/out/postal.d.ts.map +1 -0
- package/out/postal.js +9 -0
- package/out/postal.js.map +1 -0
- package/out/postcode-point-lookup.d.ts +9 -19
- 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 +39 -93
- package/out/primary-preference.d.ts.map +1 -1
- package/out/primary-preference.js +13 -97
- package/out/primary-preference.js.map +1 -1
- package/out/proximity-rerank.d.ts +40 -29
- 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 +91 -62
- 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 +48 -29
- 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 +75 -50
- package/out/reverse.d.ts.map +1 -1
- package/out/reverse.js +61 -49
- package/out/reverse.js.map +1 -1
- package/out/schema.d.ts +74 -42
- 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 +25 -0
- package/out/sqlite/convention-source.d.ts.map +1 -0
- package/out/sqlite/convention-source.js +48 -0
- package/out/sqlite/convention-source.js.map +1 -0
- package/out/sqlite/utils.d.ts +45 -0
- package/out/sqlite/utils.d.ts.map +1 -0
- package/out/sqlite/utils.js +56 -0
- package/out/sqlite/utils.js.map +1 -0
- package/out/street/centroid/schema.d.ts +100 -0
- package/out/street/centroid/schema.d.ts.map +1 -0
- package/out/street/centroid/schema.js +66 -0
- package/out/street/centroid/schema.js.map +1 -0
- package/out/street/centroid.d.ts +9 -19
- package/out/street/centroid.d.ts.map +1 -1
- package/out/street/centroid.js +11 -22
- package/out/street/centroid.js.map +1 -1
- package/out/street/{morphology-fst-builder.d.ts → morphology/fst/builder.d.ts} +21 -11
- package/out/street/morphology/fst/builder.d.ts.map +1 -0
- package/out/street/{morphology-fst-builder.js → morphology/fst/builder.js} +40 -34
- package/out/street/morphology/fst/builder.js.map +1 -0
- package/out/street/morphology/fst/loader.d.ts +74 -0
- package/out/street/morphology/fst/loader.d.ts.map +1 -0
- package/out/street/{morphology-fst-loader.js → morphology/fst/loader.js} +21 -21
- package/out/street/morphology/fst/loader.js.map +1 -0
- 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 +32 -31
- 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 +74 -191
- 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.d.ts → street.d.ts} +4 -4
- package/out/street.d.ts.map +1 -0
- package/out/{street/index.js → street.js} +4 -4
- package/out/street.js.map +1 -0
- package/out/types.d.ts +69 -138
- 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 +20 -56
- 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 +132 -141
- package/out/weights-overlay-linker.d.ts.map +1 -1
- package/out/weights-overlay-linker.js +86 -154
- package/out/weights-overlay-linker.js.map +1 -1
- package/package.json +94 -599
- package/lib/address/point-schema.ts +0 -155
- package/lib/build-candidate.ts +0 -632
- package/lib/build-slim.ts +0 -408
- package/lib/candidate-ancestors-schema.ts +0 -195
- package/lib/candidate-fts.ts +0 -46
- package/lib/candidate-importance.ts +0 -224
- package/lib/candidate-lookup.ts +0 -977
- package/lib/candidate-schema.ts +0 -247
- package/lib/candidate-scoring.ts +0 -261
- package/lib/convention/index.ts +0 -154
- package/lib/fts/index.ts +0 -361
- package/lib/postal/city-alias-lookup.ts +0 -97
- package/lib/postal/index.ts +0 -9
- package/lib/sqlite-convention-source.ts +0 -65
- package/lib/sqlite-utils.ts +0 -82
- package/lib/street/centroid-schema.ts +0 -154
- package/out/address/index.d.ts.map +0 -1
- package/out/address/index.js.map +0 -1
- package/out/address/point-interpolation.d.ts +0 -49
- package/out/address/point-interpolation.d.ts.map +0 -1
- package/out/address/point-interpolation.js.map +0 -1
- package/out/address/point-schema.d.ts +0 -97
- package/out/address/point-schema.d.ts.map +0 -1
- package/out/address/point-schema.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/build-candidate.d.ts +0 -184
- package/out/build-candidate.d.ts.map +0 -1
- package/out/build-candidate.js.map +0 -1
- package/out/build-slim.d.ts +0 -80
- package/out/build-slim.d.ts.map +0 -1
- package/out/build-slim.js.map +0 -1
- package/out/candidate/ancestors-sidecar.d.ts +0 -32
- package/out/candidate/ancestors-sidecar.d.ts.map +0 -1
- package/out/candidate/ancestors-sidecar.js.map +0 -1
- package/out/candidate-ancestors-schema.d.ts +0 -150
- package/out/candidate-ancestors-schema.d.ts.map +0 -1
- package/out/candidate-ancestors-schema.js +0 -123
- package/out/candidate-ancestors-schema.js.map +0 -1
- package/out/candidate-fts.d.ts +0 -37
- package/out/candidate-fts.d.ts.map +0 -1
- package/out/candidate-fts.js +0 -40
- package/out/candidate-fts.js.map +0 -1
- package/out/candidate-importance.d.ts +0 -132
- package/out/candidate-importance.d.ts.map +0 -1
- package/out/candidate-importance.js +0 -169
- package/out/candidate-importance.js.map +0 -1
- package/out/candidate-lookup.d.ts +0 -76
- package/out/candidate-lookup.d.ts.map +0 -1
- package/out/candidate-lookup.js +0 -768
- package/out/candidate-lookup.js.map +0 -1
- package/out/candidate-schema.d.ts +0 -155
- package/out/candidate-schema.d.ts.map +0 -1
- package/out/candidate-schema.js.map +0 -1
- package/out/candidate-scoring.d.ts.map +0 -1
- package/out/candidate-scoring.js +0 -196
- package/out/candidate-scoring.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/city-alias-lookup.d.ts.map +0 -1
- package/out/postal/city-alias-lookup.js +0 -62
- package/out/postal/city-alias-lookup.js.map +0 -1
- package/out/postal/city-alias-schema.d.ts.map +0 -1
- package/out/postal/city-alias-schema.js.map +0 -1
- package/out/postal/city-candidate-schema.d.ts +0 -66
- package/out/postal/city-candidate-schema.d.ts.map +0 -1
- package/out/postal/city-candidate-schema.js +0 -56
- package/out/postal/city-candidate-schema.js.map +0 -1
- package/out/postal/index.d.ts +0 -9
- package/out/postal/index.d.ts.map +0 -1
- package/out/postal/index.js +0 -9
- package/out/postal/index.js.map +0 -1
- package/out/sqlite-convention-source.d.ts +0 -29
- package/out/sqlite-convention-source.d.ts.map +0 -1
- package/out/sqlite-convention-source.js +0 -57
- package/out/sqlite-convention-source.js.map +0 -1
- package/out/sqlite-utils.d.ts +0 -45
- package/out/sqlite-utils.d.ts.map +0 -1
- package/out/sqlite-utils.js +0 -57
- package/out/sqlite-utils.js.map +0 -1
- package/out/street/centroid-schema.d.ts +0 -105
- package/out/street/centroid-schema.d.ts.map +0 -1
- package/out/street/centroid-schema.js +0 -78
- package/out/street/centroid-schema.js.map +0 -1
- package/out/street/index.d.ts.map +0 -1
- package/out/street/index.js.map +0 -1
- package/out/street/morphology-fst-builder.d.ts.map +0 -1
- package/out/street/morphology-fst-builder.js.map +0 -1
- package/out/street/morphology-fst-loader.d.ts +0 -67
- package/out/street/morphology-fst-loader.d.ts.map +0 -1
- package/out/street/morphology-fst-loader.js.map +0 -1
- package/out/uprn/index.d.ts.map +0 -1
- package/out/uprn/index.js.map +0 -1
- /package/lib/{fst/index.ts → fst.ts} +0 -0
- /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/{uprn/index.ts → uprn.ts} +0 -0
|
@@ -2,64 +2,54 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
+
* @file Schema and read/write helpers for the candidate gazetteer's coverage manifest.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* - `country_coverage`: the hard-country-filter coverage record (#743/#194) — per-country
|
|
11
|
-
* promotion-eval verdicts + the measured hard-resolve rates that used to live in a code comment on
|
|
12
|
-
* `HARD_PLACE_COUNTRY_SAFELIST`. Presence = measured; `hard_filter_safe = 0` = measured and
|
|
13
|
-
* FAILED the check (FI 69.5%, PL 77.8%) — distinguishable from a country never measured at all
|
|
14
|
-
* (the meaning-of-zero rule, `docs/engineering/reference/layer-contract.mdx`).
|
|
15
|
-
* - `country_bbox`: the coarse guard-B plausibility boxes that used to live in
|
|
16
|
-
* `resolver/plausibility.ts`'s `COUNTRY_BBOX`. An absent row fails open (never trips the guard),
|
|
17
|
-
* exactly like an absent key in the constant.
|
|
18
|
-
*
|
|
19
|
-
* Emission happens at build time (`mailwoman/gazetteer-pipeline/coverage-manifest.ts` owns the
|
|
20
|
-
* measured record and calls {@link writeGazetteerCoverageManifest} before the DB is sealed — never
|
|
21
|
-
* patch a shipped DB, rebuild). The read happens at open time ({@link WOFCandidateTableLookup}
|
|
22
|
-
* calls {@link readGazetteerCoverageManifest} in its constructor); an artifact that predates the
|
|
23
|
-
* manifest returns `undefined` and every consumer falls back to the code constants byte-identically.
|
|
7
|
+
* The manifest holds two country-keyed tables. `country_coverage` records each measured country's hard-filter
|
|
8
|
+
* verdict. A missing row means the country was never measured. `hard_filter_safe = 0` means measurement found the
|
|
9
|
+
* filter unsafe. `country_bbox` holds coarse plausibility boxes. A missing bbox row never trips the guard.
|
|
24
10
|
*/
|
|
25
11
|
import { type CountryBBoxFact, type CountryCoverageFact, type GazetteerArtifactCoverage } from "@mailwoman/core/resolver";
|
|
26
12
|
import type { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
27
13
|
import { type Kysely } from "kysely";
|
|
28
14
|
/**
|
|
29
|
-
*
|
|
15
|
+
* The stored form of {@link CountryCoverageFact}, one row per country.
|
|
30
16
|
*/
|
|
31
17
|
export interface CountryCoverageTable {
|
|
32
18
|
/**
|
|
33
|
-
* ISO 3166-1 alpha-2
|
|
19
|
+
* The upper-case ISO 3166-1 alpha-2 code.
|
|
20
|
+
* This field is the primary key.
|
|
34
21
|
*/
|
|
35
22
|
country: string;
|
|
36
23
|
/**
|
|
37
|
-
*
|
|
24
|
+
* The promotion-eval verdict as 0 or 1.
|
|
25
|
+
*
|
|
26
|
+
* It is stored directly because the rate by itself does not decide it.
|
|
38
27
|
*/
|
|
39
28
|
hard_filter_safe: number;
|
|
40
29
|
/**
|
|
41
|
-
*
|
|
30
|
+
* The hard-resolve rate from 0 to 1 on the panel given in `source`, or NULL when none was recorded.
|
|
42
31
|
*/
|
|
43
32
|
hard_resolve_rate: number | null;
|
|
44
33
|
/**
|
|
45
|
-
*
|
|
34
|
+
* The panel size behind `hard_resolve_rate`, or NULL when none was recorded.
|
|
46
35
|
*/
|
|
47
36
|
sample_size: number | null;
|
|
48
37
|
/**
|
|
49
|
-
* ISO
|
|
38
|
+
* The ISO 8601 date of the measurement.
|
|
50
39
|
*/
|
|
51
40
|
measured_at: string;
|
|
52
41
|
/**
|
|
53
|
-
* The
|
|
42
|
+
* The panel or check that produced this row.
|
|
54
43
|
*/
|
|
55
44
|
source: string;
|
|
56
45
|
}
|
|
57
46
|
/**
|
|
58
|
-
*
|
|
47
|
+
* The stored form of {@link CountryBBoxFact}, one coarse bounding box per country.
|
|
59
48
|
*/
|
|
60
49
|
export interface CountryBBoxTable {
|
|
61
50
|
/**
|
|
62
|
-
* ISO 3166-1 alpha-2
|
|
51
|
+
* The upper-case ISO 3166-1 alpha-2 code.
|
|
52
|
+
* This field is the primary key.
|
|
63
53
|
*/
|
|
64
54
|
country: string;
|
|
65
55
|
lat_min: number;
|
|
@@ -67,7 +57,7 @@ export interface CountryBBoxTable {
|
|
|
67
57
|
lon_min: number;
|
|
68
58
|
lon_max: number;
|
|
69
59
|
/**
|
|
70
|
-
*
|
|
60
|
+
* The provenance of the box.
|
|
71
61
|
*/
|
|
72
62
|
source: string;
|
|
73
63
|
}
|
|
@@ -79,34 +69,39 @@ export interface GazetteerCoverageDatabase {
|
|
|
79
69
|
country_bbox: CountryBBoxTable;
|
|
80
70
|
}
|
|
81
71
|
/**
|
|
82
|
-
*
|
|
72
|
+
* The name of the per-country coverage table.
|
|
73
|
+
* Readers check that it exists before querying it.
|
|
83
74
|
*/
|
|
84
75
|
export declare const COUNTRY_COVERAGE_TABLE = "country_coverage";
|
|
85
76
|
/**
|
|
86
|
-
*
|
|
77
|
+
* The name of the per-country bounding-box table, used to reject a placement outside its own country.
|
|
87
78
|
*/
|
|
88
79
|
export declare const COUNTRY_BBOX_TABLE = "country_bbox";
|
|
89
80
|
/**
|
|
90
|
-
*
|
|
81
|
+
* Creates the `country_coverage` table as a `WITHOUT ROWID` table keyed by country.
|
|
91
82
|
*/
|
|
92
83
|
export declare function createCountryCoverageTable(db: Kysely<GazetteerCoverageDatabase>): Promise<void>;
|
|
93
84
|
/**
|
|
94
|
-
*
|
|
85
|
+
* Creates the `country_bbox` table as a `WITHOUT ROWID` table keyed by country.
|
|
95
86
|
*/
|
|
96
87
|
export declare function createCountryBBoxTable(db: Kysely<GazetteerCoverageDatabase>): Promise<void>;
|
|
97
88
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
89
|
+
* Creates both manifest tables in a candidate database under construction and inserts the facts.
|
|
90
|
+
*
|
|
91
|
+
* The gazetteer build calls it once.
|
|
92
|
+
* A shipped database is rebuilt instead of patched.
|
|
100
93
|
*/
|
|
101
94
|
export declare function writeGazetteerCoverageManifest(db: Kysely<GazetteerCoverageDatabase>, facts: {
|
|
102
95
|
coverage: readonly CountryCoverageFact[];
|
|
103
96
|
bboxes: readonly CountryBBoxFact[];
|
|
104
97
|
}): Promise<void>;
|
|
105
98
|
/**
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
99
|
+
* Reads the coverage manifest from an open candidate database.
|
|
100
|
+
*
|
|
101
|
+
* It returns `undefined` when neither table exists.
|
|
102
|
+
* Consumers then fall back to the code constants.
|
|
103
|
+
*
|
|
104
|
+
* The reads are synchronous because the candidate lookup calls this from its constructor.
|
|
110
105
|
*/
|
|
111
106
|
export declare function readGazetteerCoverageManifest<DB>(db: DatabaseClient<DB>): GazetteerArtifactCoverage | undefined;
|
|
112
107
|
//# sourceMappingURL=coverage-manifest-schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage-manifest-schema.d.ts","sourceRoot":"","sources":["../lib/coverage-manifest-schema.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"coverage-manifest-schema.d.ts","sourceRoot":"","sources":["../lib/coverage-manifest-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAEN,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,MAAM,0BAA0B,CAAA;AAEjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAIzC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAA;IACxB;;OAEG;IACH,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC;;OAEG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACzC,gBAAgB,EAAE,oBAAoB,CAAA;IACtC,YAAY,EAAE,gBAAgB,CAAA;CAC9B;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAA;AACxD;;GAEG;AACH,eAAO,MAAM,kBAAkB,iBAAiB,CAAA;AAEhD;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,MAAM,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAarG;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAYjG;AAED;;;;;GAKG;AACH,wBAAsB,8BAA8B,CACnD,EAAE,EAAE,MAAM,CAAC,yBAAyB,CAAC,EACrC,KAAK,EAAE;IAAE,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;CAAE,GACrF,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,yBAAyB,GAAG,SAAS,CAuD/G"}
|
|
@@ -2,40 +2,27 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
+
* @file Schema and read/write helpers for the candidate gazetteer's coverage manifest.
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* - `country_coverage`: the hard-country-filter coverage record (#743/#194) — per-country
|
|
11
|
-
* promotion-eval verdicts + the measured hard-resolve rates that used to live in a code comment on
|
|
12
|
-
* `HARD_PLACE_COUNTRY_SAFELIST`. Presence = measured; `hard_filter_safe = 0` = measured and
|
|
13
|
-
* FAILED the check (FI 69.5%, PL 77.8%) — distinguishable from a country never measured at all
|
|
14
|
-
* (the meaning-of-zero rule, `docs/engineering/reference/layer-contract.mdx`).
|
|
15
|
-
* - `country_bbox`: the coarse guard-B plausibility boxes that used to live in
|
|
16
|
-
* `resolver/plausibility.ts`'s `COUNTRY_BBOX`. An absent row fails open (never trips the guard),
|
|
17
|
-
* exactly like an absent key in the constant.
|
|
18
|
-
*
|
|
19
|
-
* Emission happens at build time (`mailwoman/gazetteer-pipeline/coverage-manifest.ts` owns the
|
|
20
|
-
* measured record and calls {@link writeGazetteerCoverageManifest} before the DB is sealed — never
|
|
21
|
-
* patch a shipped DB, rebuild). The read happens at open time ({@link WOFCandidateTableLookup}
|
|
22
|
-
* calls {@link readGazetteerCoverageManifest} in its constructor); an artifact that predates the
|
|
23
|
-
* manifest returns `undefined` and every consumer falls back to the code constants byte-identically.
|
|
7
|
+
* The manifest holds two country-keyed tables. `country_coverage` records each measured country's hard-filter
|
|
8
|
+
* verdict. A missing row means the country was never measured. `hard_filter_safe = 0` means measurement found the
|
|
9
|
+
* filter unsafe. `country_bbox` holds coarse plausibility boxes. A missing bbox row never trips the guard.
|
|
24
10
|
*/
|
|
25
11
|
import { hardCountrySafelistFromCoverage, } from "@mailwoman/core/resolver";
|
|
26
12
|
import { allRows } from "@mailwoman/core/utils";
|
|
27
13
|
import { sql } from "kysely";
|
|
28
14
|
import { hasTable } from "#sqlite-utils";
|
|
29
15
|
/**
|
|
30
|
-
*
|
|
16
|
+
* The name of the per-country coverage table.
|
|
17
|
+
* Readers check that it exists before querying it.
|
|
31
18
|
*/
|
|
32
19
|
export const COUNTRY_COVERAGE_TABLE = "country_coverage";
|
|
33
20
|
/**
|
|
34
|
-
*
|
|
21
|
+
* The name of the per-country bounding-box table, used to reject a placement outside its own country.
|
|
35
22
|
*/
|
|
36
23
|
export const COUNTRY_BBOX_TABLE = "country_bbox";
|
|
37
24
|
/**
|
|
38
|
-
*
|
|
25
|
+
* Creates the `country_coverage` table as a `WITHOUT ROWID` table keyed by country.
|
|
39
26
|
*/
|
|
40
27
|
export async function createCountryCoverageTable(db) {
|
|
41
28
|
await db.schema
|
|
@@ -47,12 +34,12 @@ export async function createCountryCoverageTable(db) {
|
|
|
47
34
|
.addColumn("sample_size", "integer")
|
|
48
35
|
.addColumn("measured_at", "text", (c) => c.notNull())
|
|
49
36
|
.addColumn("source", "text", (c) => c.notNull())
|
|
50
|
-
//
|
|
37
|
+
// Kysely has no builder method for `without rowid`.
|
|
51
38
|
.modifyEnd(sql `without rowid`)
|
|
52
39
|
.execute();
|
|
53
40
|
}
|
|
54
41
|
/**
|
|
55
|
-
*
|
|
42
|
+
* Creates the `country_bbox` table as a `WITHOUT ROWID` table keyed by country.
|
|
56
43
|
*/
|
|
57
44
|
export async function createCountryBBoxTable(db) {
|
|
58
45
|
await db.schema
|
|
@@ -68,8 +55,10 @@ export async function createCountryBBoxTable(db) {
|
|
|
68
55
|
.execute();
|
|
69
56
|
}
|
|
70
57
|
/**
|
|
71
|
-
*
|
|
72
|
-
*
|
|
58
|
+
* Creates both manifest tables in a candidate database under construction and inserts the facts.
|
|
59
|
+
*
|
|
60
|
+
* The gazetteer build calls it once.
|
|
61
|
+
* A shipped database is rebuilt instead of patched.
|
|
73
62
|
*/
|
|
74
63
|
export async function writeGazetteerCoverageManifest(db, facts) {
|
|
75
64
|
await createCountryCoverageTable(db);
|
|
@@ -102,10 +91,12 @@ export async function writeGazetteerCoverageManifest(db, facts) {
|
|
|
102
91
|
}
|
|
103
92
|
}
|
|
104
93
|
/**
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
94
|
+
* Reads the coverage manifest from an open candidate database.
|
|
95
|
+
*
|
|
96
|
+
* It returns `undefined` when neither table exists.
|
|
97
|
+
* Consumers then fall back to the code constants.
|
|
98
|
+
*
|
|
99
|
+
* The reads are synchronous because the candidate lookup calls this from its constructor.
|
|
109
100
|
*/
|
|
110
101
|
export function readGazetteerCoverageManifest(db) {
|
|
111
102
|
const hasCoverage = hasTable(db, COUNTRY_COVERAGE_TABLE);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage-manifest-schema.js","sourceRoot":"","sources":["../lib/coverage-manifest-schema.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"coverage-manifest-schema.js","sourceRoot":"","sources":["../lib/coverage-manifest-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,34 +3,17 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* source independently attests. Extracted from `build-candidate.ts` as a cohesive unit — the checks, their measured
|
|
8
|
-
* constants, and the GeoNames dump reader live together here; the build calls {@link resurrectCurrencyHoles} once,
|
|
9
|
-
* between the primaries pass and the alias pass.
|
|
6
|
+
* Restores deprecated WOF localities only when an independent source attests them.
|
|
10
7
|
*/
|
|
11
8
|
import type { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
12
|
-
import type
|
|
13
|
-
import type {
|
|
9
|
+
import { type PathBuilderLike } from "path-ts";
|
|
10
|
+
import type { loadImportanceIndex } from "#candidate/importance";
|
|
14
11
|
import type { PlaceAttrs, StageRow } from "#candidate/place-attrs";
|
|
12
|
+
import type { CandidateDatabase } from "#candidate/schema";
|
|
15
13
|
import type { WOFDatabase } from "#schema";
|
|
16
14
|
/**
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* WOF deprecations WITH a successor need nothing — the successor indexes. A deprecation with `is_superseded = 0` on a
|
|
20
|
-
* populated place is the shape of an upstream mistake (Rochester Kent, Aldershot, Telford; 120 GB localities alone),
|
|
21
|
-
* and it is indistinguishable from a correct pruning at this layer without outside evidence. So every resurrection
|
|
22
|
-
* requires all three conditions, positive evidence only:
|
|
23
|
-
*
|
|
24
|
-
* 1. NO live same-name spr row of any placetype within {@link CURRENCY_BACKFILL_RADIUS_KM} of the dead record — a live row
|
|
25
|
-
* means the place is alive (possibly under another placetype) and there is no hole. A DISTANT same-name row is a
|
|
26
|
-
* namesake and does not block.
|
|
27
|
-
* 2. A GeoNames feature-class-P attestation of the same folded name within the radius.
|
|
28
|
-
* 3. The attestor at or above {@link CURRENCY_BACKFILL_POP_FLOOR}.
|
|
29
|
-
*
|
|
30
|
-
* The staged row keeps the WOF identity — id, name, centroid, bbox, region ancestry — because the dead record's own
|
|
31
|
-
* data is not what is wrong with it. GeoNames contributes exactly two things: the attestation, and the population that
|
|
32
|
-
* lets the row stand in prominence races (the dead record's own population is absent). Each name is judged once per
|
|
33
|
-
* country; the resurrected place joins `attrs`, so the alias pass explodes its alt names like any primary's.
|
|
15
|
+
* Restore a deprecated locality only when no nearby live namesake exists and GeoNames
|
|
16
|
+
* attests the same folded name above {@link CURRENCY_BACKFILL_POP_FLOOR}.
|
|
34
17
|
*/
|
|
35
18
|
export interface CurrencyBackfillOutcomes {
|
|
36
19
|
judged: number;
|
|
@@ -40,8 +23,8 @@ export interface CurrencyBackfillOutcomes {
|
|
|
40
23
|
resurrected: number;
|
|
41
24
|
}
|
|
42
25
|
/**
|
|
43
|
-
* One country's read of the check — every dead name judged, by outcome and by the dead
|
|
44
|
-
* can say what a wider
|
|
26
|
+
* One country's read of the check — every dead name judged, by outcome and by the dead
|
|
27
|
+
* row's placetype — so a census can say what a wider query admits.
|
|
45
28
|
*/
|
|
46
29
|
export interface CurrencyBackfillCountryReport extends CurrencyBackfillOutcomes {
|
|
47
30
|
country: string;
|
|
@@ -49,23 +32,21 @@ export interface CurrencyBackfillCountryReport extends CurrencyBackfillOutcomes
|
|
|
49
32
|
dumpPresent: boolean;
|
|
50
33
|
byDeadPlacetype: Record<string, CurrencyBackfillOutcomes>;
|
|
51
34
|
/**
|
|
52
|
-
* The first resurrected names, `placetype:name`,
|
|
53
|
-
* report is a receipt and not the table.
|
|
35
|
+
* The first resurrected names, `placetype:name`, capped because the report is a receipt and not the table.
|
|
54
36
|
*/
|
|
55
37
|
sample: string[];
|
|
56
38
|
}
|
|
57
39
|
/**
|
|
58
|
-
* The placetypes a dead row may
|
|
59
|
-
* second cause #1746 named (one GB row of seventeen) and is admitted through this option once its census is read.
|
|
40
|
+
* The placetypes a dead row may have to be judged at all; `locality` is the shipped default.
|
|
60
41
|
*/
|
|
61
42
|
export declare const DEFAULT_DEAD_PLACETYPES: readonly string[];
|
|
62
43
|
export declare function resurrectCurrencyHoles(ctx: {
|
|
63
44
|
src: DatabaseClient<WOFDatabase>;
|
|
64
45
|
/**
|
|
65
|
-
* The candidate build's transaction
|
|
46
|
+
* The candidate build's transaction, required unless `dryRun`.
|
|
66
47
|
*/
|
|
67
48
|
tx?: DatabaseClient<CandidateDatabase>;
|
|
68
|
-
geonamesDir:
|
|
49
|
+
geonamesDir: PathBuilderLike;
|
|
69
50
|
countries: readonly string[];
|
|
70
51
|
attrs: Map<number, PlaceAttrs>;
|
|
71
52
|
ccID: (code: string | null) => number;
|
|
@@ -74,12 +55,9 @@ export declare function resurrectCurrencyHoles(ctx: {
|
|
|
74
55
|
importance: ReturnType<typeof loadImportanceIndex> | undefined;
|
|
75
56
|
stageRow: StageRow;
|
|
76
57
|
progress: (phase: string, message: string) => void;
|
|
77
|
-
/**
|
|
78
|
-
* Which dead placetypes are judged. Default {@link DEFAULT_DEAD_PLACETYPES}.
|
|
79
|
-
*/
|
|
80
58
|
deadPlacetypes?: readonly string[];
|
|
81
59
|
/**
|
|
82
|
-
* Judge and count
|
|
60
|
+
* Judge and count while staging no row and opening no transaction.
|
|
83
61
|
*/
|
|
84
62
|
dryRun?: boolean;
|
|
85
63
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currency-backfill.d.ts","sourceRoot":"","sources":["../lib/currency-backfill.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"currency-backfill.d.ts","sourceRoot":"","sources":["../lib/currency-backfill.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,SAAS,CAAA;AAG3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAO1C;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,6BAA8B,SAAQ,wBAAwB;IAC9E,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,WAAW,EAAE,OAAO,CAAA;IACpB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAA;IACzD;;OAEG;IACH,MAAM,EAAE,MAAM,EAAE,CAAA;CAChB;AAID;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAAiB,CAAA;AAMtE,wBAAsB,sBAAsB,CAAC,GAAG,EAAE;IACjD,GAAG,EAAE,cAAc,CAAC,WAAW,CAAC,CAAA;IAChC;;OAEG;IACH,EAAE,CAAC,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAA;IACtC,WAAW,EAAE,eAAe,CAAA;IAC5B,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC9B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAA;IACrC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAA;IACnC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,UAAU,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,GAAG,SAAS,CAAA;IAC9D,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IAElD,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAClC;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,6BAA6B,KAAK,IAAI,CAAA;CAC3D,GAAG,OAAO,CAAC,MAAM,CAAC,CAwMlB"}
|
package/out/currency-backfill.js
CHANGED
|
@@ -3,10 +3,7 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* source independently attests. Extracted from `build-candidate.ts` as a cohesive unit — the checks, their measured
|
|
8
|
-
* constants, and the GeoNames dump reader live together here; the build calls {@link resurrectCurrencyHoles} once,
|
|
9
|
-
* between the primaries pass and the alias pass.
|
|
6
|
+
* Restores deprecated WOF localities only when an independent source attests them.
|
|
10
7
|
*/
|
|
11
8
|
import { pathExists } from "@mailwoman/core/fs/readers";
|
|
12
9
|
import { isStrictlyFiner } from "@mailwoman/core/resources/whosonfirst";
|
|
@@ -14,24 +11,11 @@ import { haversineKm } from "@mailwoman/spatial";
|
|
|
14
11
|
import { resolvePath } from "path-ts";
|
|
15
12
|
import { TSVSpliterator } from "spliterator";
|
|
16
13
|
import { normalizeLocalityForKey } from "#street/normalize";
|
|
17
|
-
/**
|
|
18
|
-
* Corroboration radius for the currency backfill (#1737), km — both for the live-near blocker and the GeoNames
|
|
19
|
-
* attestation. Measured basis (2026-08-19 prototype, GB locality slice): at 10 km, 20 of 108 dead names resurrect —
|
|
20
|
-
* Rochester (Kent), Aldershot, Staines, Telford, Ebbw Vale among them — while the `Birmingham/Wolverhampton/…`
|
|
21
|
-
* conurbation blobs stay dead (no attestation) and Swansea/Wrexham stay out because a live same-name row already serves
|
|
22
|
-
* them within the radius.
|
|
23
|
-
*/
|
|
24
14
|
const CURRENCY_BACKFILL_RADIUS_KM = 10;
|
|
25
|
-
/**
|
|
26
|
-
* Minimum attestor population for a resurrection. The same prototype measured 44 of 108 dead GB names attested but
|
|
27
|
-
* under this floor — hamlet-scale ghosts whose absence from the index nobody has reported. A floor keeps the pass
|
|
28
|
-
* answering the measured defect (real settlements) rather than re-importing the tail WOF chose to prune.
|
|
29
|
-
*/
|
|
30
15
|
const CURRENCY_BACKFILL_POP_FLOOR = 1000;
|
|
31
16
|
const REPORT_SAMPLE_SIZE = 25;
|
|
32
17
|
/**
|
|
33
|
-
* The placetypes a dead row may
|
|
34
|
-
* second cause #1746 named (one GB row of seventeen) and is admitted through this option once its census is read.
|
|
18
|
+
* The placetypes a dead row may have to be judged at all; `locality` is the shipped default.
|
|
35
19
|
*/
|
|
36
20
|
export const DEFAULT_DEAD_PLACETYPES = ["locality"];
|
|
37
21
|
function emptyOutcomes() {
|
|
@@ -65,17 +49,17 @@ export async function resurrectCurrencyHoles(ctx) {
|
|
|
65
49
|
ctx.onCountry?.(report);
|
|
66
50
|
continue;
|
|
67
51
|
}
|
|
68
|
-
//
|
|
69
|
-
//
|
|
70
|
-
//
|
|
52
|
+
// Read dead rows first.
|
|
53
|
+
// A country with no dead names then avoids loading its national dump.
|
|
54
|
+
// That avoids heap pressure on a build near its limit.
|
|
71
55
|
const dead = deadStmt.all(cc, ...deadPlacetypes);
|
|
72
56
|
if (!dead.length) {
|
|
73
57
|
ctx.progress("currency-backfill", `${cc}: 0 dead names — dump not loaded`);
|
|
74
58
|
ctx.onCountry?.(report);
|
|
75
59
|
continue;
|
|
76
60
|
}
|
|
77
|
-
// Only the dead names' own folded keys can ever be probed, so
|
|
78
|
-
//
|
|
61
|
+
// Only the dead names' own folded keys can ever be probed, so the rest of the
|
|
62
|
+
// national dump streams through without residency.
|
|
79
63
|
const deadKeys = new Set();
|
|
80
64
|
for (const d of dead) {
|
|
81
65
|
const k = normalizeLocalityForKey(String(d.name ?? ""));
|
|
@@ -83,8 +67,7 @@ export async function resurrectCurrencyHoles(ctx) {
|
|
|
83
67
|
deadKeys.add(k);
|
|
84
68
|
}
|
|
85
69
|
}
|
|
86
|
-
//
|
|
87
|
-
// 6 feature_class, 14 population.
|
|
70
|
+
// GeoNames columns by index: 1 name, 2 ascii, 4 lat, 5 lon, 6 feature_class, 14 population.
|
|
88
71
|
const attestors = new Map();
|
|
89
72
|
for await (const f of TSVSpliterator.fromAsync(dumpPath, { header: false })) {
|
|
90
73
|
if (f[6] !== "P")
|
|
@@ -118,28 +101,18 @@ export async function resurrectCurrencyHoles(ctx) {
|
|
|
118
101
|
if (!pkey || seen.has(pkey))
|
|
119
102
|
continue;
|
|
120
103
|
seen.add(pkey);
|
|
121
|
-
//
|
|
122
|
-
//
|
|
104
|
+
// The query admits whatever `deadPlacetypes` names, so the rank comparison
|
|
105
|
+
// judges each candidate against its own dead rung.
|
|
123
106
|
const deadPlacetype = String(d.placetype ?? "locality");
|
|
124
107
|
count(deadPlacetype, "judged");
|
|
125
108
|
const dLat = Number(d.latitude);
|
|
126
109
|
const dLon = Number(d.longitude);
|
|
127
|
-
// A live row blocks
|
|
128
|
-
//
|
|
129
|
-
// placetype" — true for a place recorded twice, false for a placetype DEMOTION, which is the shape that
|
|
130
|
-
// actually occurs: WOF retired `Gillingham` the locality (pop 101,187) and kept `Gillingham` the
|
|
131
|
-
// neighbourhood 3.2 km away, and the check read the surviving CHILD as covering its own dead parent.
|
|
132
|
-
// Sixteen of seventeen GB refusals had exactly that shape (#1746).
|
|
133
|
-
//
|
|
134
|
-
// An UNRANKED placetype blocks, which is the conservative direction: this check's failure mode is inventing
|
|
135
|
-
// a place, so a row we cannot rank is treated as covering rather than waved through.
|
|
110
|
+
// A live row blocks unless it is strictly finer than the dead one.
|
|
111
|
+
// An unranked placetype also blocks because the failure mode is inventing a place.
|
|
136
112
|
const liveNear = liveStmt.all(cc, name).some((row) => {
|
|
137
113
|
if (haversineKm(dLat, dLon, Number(row.latitude), Number(row.longitude)) > CURRENCY_BACKFILL_RADIUS_KM) {
|
|
138
114
|
return false;
|
|
139
115
|
}
|
|
140
|
-
// Blocks UNLESS the live row is strictly finer. The equal rung must still block — a live `locality`
|
|
141
|
-
// covers a dead `locality` — and an unranked placetype blocks too, since this check's failure mode
|
|
142
|
-
// is inventing a place.
|
|
143
116
|
return isStrictlyFiner(String(row.placetype ?? ""), deadPlacetype) !== true;
|
|
144
117
|
});
|
|
145
118
|
if (liveNear) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currency-backfill.js","sourceRoot":"","sources":["../lib/currency-backfill.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"currency-backfill.js","sourceRoot":"","sources":["../lib/currency-backfill.ts"],"names":[],"mappings":"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"}
|
package/out/env.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* Environment variables
|
|
6
|
+
* Environment variables name the WOF SQLite artifacts this resolver opens and the development weights the overlay
|
|
7
7
|
* linker materializes. CLI flags (`--resolve-db`, …) override these at the call site.
|
|
8
8
|
*/
|
|
9
9
|
import { z } from "zod";
|
|
@@ -27,10 +27,10 @@ export declare const $public: Record<never, never> & {
|
|
|
27
27
|
MAILWOMAN_CONFIG_ROOT: string;
|
|
28
28
|
MAILWOMAN_CACHE_ROOT: string;
|
|
29
29
|
MAILWOMAN_TEMP_ROOT: string;
|
|
30
|
+
MAILWOMAN_COARSE_PLACER_DIR?: string | undefined;
|
|
30
31
|
MAILWOMAN_DOCS_URL?: string | undefined;
|
|
31
32
|
MAILWOMAN_LICENSE_KEY?: string | undefined;
|
|
32
33
|
MAILWOMAN_LICENSE_URL?: string | undefined;
|
|
33
|
-
MAILWOMAN_COARSE_PLACER_DIR?: string | undefined;
|
|
34
34
|
} & {
|
|
35
35
|
MAILWOMAN_WOF_DB?: string | undefined;
|
|
36
36
|
MAILWOMAN_WOF_ADMIN_DB?: string | undefined;
|
package/out/env.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* Environment variables
|
|
6
|
+
* Environment variables name the WOF SQLite artifacts this resolver opens and the development weights the overlay
|
|
7
7
|
* linker materializes. CLI flags (`--resolve-db`, …) override these at the call site.
|
|
8
8
|
*/
|
|
9
9
|
import { $public as corePublic, liveEnv } from "@mailwoman/core/env";
|
package/out/exact-match.d.ts
CHANGED
|
@@ -3,23 +3,32 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* The exact-match tier's name probes
|
|
6
|
+
* The exact-match tier's name probes, the two case-folded equality lookups that decide whether a
|
|
7
7
|
* candidate holds the query text as its own name, an alias, or an official name.
|
|
8
8
|
*/
|
|
9
9
|
import type { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
10
10
|
/**
|
|
11
|
-
* Among `ids`, return the subset whose name
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
11
|
+
* Among `ids`, return the subset whose name or any alias equals `text` case-insensitively,
|
|
12
|
+
* the exact-match tier for ranking.
|
|
13
|
+
*
|
|
14
|
+
* One indexed query over `<schema>.names`.
|
|
15
|
+
* When the extract has no `names` table (a slim database built with `dropNames`, or a postcode-only extract),
|
|
16
|
+
* fall back to the self-contained `place_search` FTS content.
|
|
17
|
+
*
|
|
18
|
+
* Its `alt_names` column is the same alias set joined on the boundary-preserving
|
|
19
|
+
* `ALIAS_SEPARATOR`, so `aliasBagExactMatch` recovers the exact alias tier
|
|
20
|
+
* ("New York City" → New York) that the dropped `names` table used to provide.
|
|
16
21
|
*/
|
|
17
22
|
export declare function exactMatchIDs<DB>(db: DatabaseClient<DB>, schemaName: string, ids: number[], text: string): Set<number>;
|
|
18
23
|
/**
|
|
19
|
-
* Among `ids` (already known exact matches), the subset holding `text` as an
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
24
|
+
* Among `ids` (already known exact matches), the subset holding `text` as an
|
|
25
|
+
* official name (`names.official = 1`, the ingest bit).
|
|
26
|
+
*
|
|
27
|
+
* Same collate nocase semantics as {@link WOFSQLitePlaceLookup.#exactMatchIDs},
|
|
28
|
+
* so the two probes agree on what "equals the query" means.
|
|
29
|
+
* Fails soft on gazetteers built before the `official` column existed.
|
|
30
|
+
*
|
|
31
|
+
* The sub-tier then behaves exactly as if `officialNameExact` were off.
|
|
23
32
|
*/
|
|
24
33
|
export declare function officialNameIDs<DB>(db: DatabaseClient<DB>, schemaName: string, ids: number[], text: string): Set<number>;
|
|
25
34
|
//# sourceMappingURL=exact-match.d.ts.map
|
package/out/exact-match.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exact-match.d.ts","sourceRoot":"","sources":["../lib/exact-match.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAI9D
|
|
1
|
+
{"version":3,"file":"exact-match.d.ts","sourceRoot":"","sources":["../lib/exact-match.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAI9D;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAC/B,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,EACtB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,EAAE,MAAM,GACV,GAAG,CAAC,MAAM,CAAC,CAsDb;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAAE,EACjC,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,EACtB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,EAAE,MAAM,GACV,GAAG,CAAC,MAAM,CAAC,CAsBb"}
|