@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
|
@@ -9,24 +9,22 @@ import { isOfficialLanguage } from "@mailwoman/codex/country"
|
|
|
9
9
|
import type { DatabaseClient } from "@mailwoman/sqlite/client"
|
|
10
10
|
import { tableExists } from "@mailwoman/sqlite/introspection"
|
|
11
11
|
|
|
12
|
-
import type { CandidateDatabase } from "#candidate-schema"
|
|
13
12
|
import { isOwnNameVariant } from "#candidate/own-name"
|
|
14
13
|
import type { PlaceAttrs } from "#candidate/place-attrs"
|
|
14
|
+
import type { CandidateDatabase } from "#candidate/schema"
|
|
15
15
|
import type { WOFDatabase } from "#schema"
|
|
16
16
|
import { normalizeLocalityForKey } from "#street/normalize"
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
|
-
* Key-count threshold for the gloss anomaly detector
|
|
20
|
-
*
|
|
21
|
-
* this number
|
|
19
|
+
* Key-count threshold for the gloss anomaly detector.
|
|
20
|
+
*
|
|
21
|
+
* A legitimate famous place is separated by the prominence check rather than this number by itself.
|
|
22
22
|
*/
|
|
23
23
|
export const GLOSS_KEY_THRESHOLD = 50
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
* Placetypes the gloss detector never flags
|
|
27
|
-
*
|
|
28
|
-
* tail, where a place named by a common noun ("Poisson", "Sunday") accumulating 200+ translations is a
|
|
29
|
-
* machine-translated gloss set, not fame.
|
|
26
|
+
* Placetypes the gloss detector never flags: a country or region legitimately has a
|
|
27
|
+
* name in every language, so key volume provides no signal there.
|
|
30
28
|
*/
|
|
31
29
|
export const GLOSS_EXCLUDED_PLACETYPES: ReadonlySet<string> = new Set([
|
|
32
30
|
"country",
|
|
@@ -40,21 +38,11 @@ export const GLOSS_EXCLUDED_PLACETYPES: ReadonlySet<string> = new Set([
|
|
|
40
38
|
])
|
|
41
39
|
|
|
42
40
|
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* regression check). Both stamp `is_primary = 0` rows only — a place's canonical name and the `place_abbr` region
|
|
46
|
-
* abbreviations are never a gloss or a variant.
|
|
47
|
-
*
|
|
48
|
-
* - `gloss` is ANOMALY-based, and stamps only the certain core: key volume at/over the threshold + a non-admin placetype
|
|
49
|
-
*
|
|
50
|
-
* - NO measured prominence (population absent AND importance unmeasured). Provenance cannot separate a gloss from an
|
|
51
|
-
* exonym — WOF imported both as `x_preferred` — and prominence is what rescues New York/Paris.
|
|
52
|
-
* - `abbr` is PROVENANCE-based — the #936 signal: a WOF `variant` name in one of the country's official languages (or
|
|
53
|
-
* English), measured there at a 13× key-collision rate. A source without a `names` table (fixture-scale admin DBs)
|
|
54
|
-
* skips this detector loudly.
|
|
41
|
+
* Stamp `name_role` on non-primary rows: `abbr` by provenance, `variant` by
|
|
42
|
+
* own-name verdict, then `gloss` by key-volume anomaly.
|
|
55
43
|
*
|
|
56
|
-
*
|
|
57
|
-
* any role.
|
|
44
|
+
* @returns The stamp counts plus the census the prototype exists to report:
|
|
45
|
+
* how much of the ≥-threshold key tail has any role.
|
|
58
46
|
*/
|
|
59
47
|
export function stampNameRoles(ctx: {
|
|
60
48
|
src: DatabaseClient<WOFDatabase>
|
|
@@ -85,7 +73,7 @@ export function stampNameRoles(ctx: {
|
|
|
85
73
|
|
|
86
74
|
if (GLOSS_EXCLUDED_PLACETYPES.has(ptNameByID.get(a.ptid) ?? "")) continue
|
|
87
75
|
|
|
88
|
-
if (a.pop > 0 || a.imp != null) continue
|
|
76
|
+
if ((a.pop ?? 0) > 0 || a.imp != null) continue
|
|
89
77
|
glossSids.push(sid)
|
|
90
78
|
}
|
|
91
79
|
|
|
@@ -101,9 +89,8 @@ export function stampNameRoles(ctx: {
|
|
|
101
89
|
if (hasSourceNames) {
|
|
102
90
|
out.exec("BEGIN")
|
|
103
91
|
|
|
104
|
-
//
|
|
105
|
-
//
|
|
106
|
-
// qualify by kind alone; everything else qualifies as a variant in an official language.
|
|
92
|
+
// WOF's abbreviation/short name kinds qualify by kind only.
|
|
93
|
+
// Everything else qualifies as a variant in an official language.
|
|
107
94
|
for (const r of src
|
|
108
95
|
.prepare("SELECT id, name, language FROM names WHERE privateuse = 'variant' OR language IN ('abbr', 'short')")
|
|
109
96
|
.iterate()) {
|
|
@@ -129,8 +116,7 @@ export function stampNameRoles(ctx: {
|
|
|
129
116
|
progress("roles", "source carries no `names` table — abbr detector skipped (gloss still runs)")
|
|
130
117
|
}
|
|
131
118
|
|
|
132
|
-
// Stamp order is precedence:
|
|
133
|
-
// then gloss fills what neither claimed.
|
|
119
|
+
// Stamp order is precedence: abbr first, then the own-name variant verdict, then gloss fills what neither claimed.
|
|
134
120
|
const roleAbbr = Number(
|
|
135
121
|
out
|
|
136
122
|
.prepare(
|
|
@@ -141,12 +127,8 @@ export function stampNameRoles(ctx: {
|
|
|
141
127
|
.run().changes
|
|
142
128
|
)
|
|
143
129
|
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
// is per (alias key, primary key) pair, so it runs in JS over the still-unstamped alias rows;
|
|
147
|
-
// an uncovered script answers no-verdict and stamps nothing (own-name.ts owns the predicate and
|
|
148
|
-
// its measured threshold). Runs BEFORE gloss on purpose: a surface that IS the place's own name
|
|
149
|
-
// is not a translation, whatever the key volume says.
|
|
130
|
+
// Runs before gloss so the place's own name remains its source name.
|
|
131
|
+
// An uncovered script answers no-verdict.
|
|
150
132
|
out.exec(
|
|
151
133
|
"CREATE TEMP TABLE variant_key (spr_id INTEGER NOT NULL, name_key TEXT NOT NULL, PRIMARY KEY (spr_id, name_key)) WITHOUT ROWID"
|
|
152
134
|
)
|
|
@@ -3,40 +3,36 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* The
|
|
7
|
-
*
|
|
8
|
-
* (`George Town` → `georgetown`), an abbreviation expansion (`St. George's` → `Saint George's`)
|
|
9
|
-
*
|
|
6
|
+
* The own-name variant predicate: is an alias surface the holder's own primary name in another
|
|
7
|
+
* orthography, whether a romanization (`Брэст` → `brest`), a spacing or diacritic variant
|
|
8
|
+
* (`George Town` → `georgetown`), or an abbreviation expansion (`St. George's` → `Saint George's`)?
|
|
9
|
+
* The alternative is a different name that merely shares the folded key.
|
|
10
10
|
*
|
|
11
|
-
* The comparator is `levenshteinSimilarity
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
11
|
+
* The comparator is `levenshteinSimilarity`. Jaro-Winkler's common-prefix bonus scores the required
|
|
12
|
+
* negative case (`chanchun` against `cancun`, 0.925) above real positives (`saint george s` against
|
|
13
|
+
* `st georges` expanded, 0.914), so no JW threshold separates them. Edit similarity separates every
|
|
14
|
+
* measured case with margin.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* - OUT: `lievin`/`levin` 0.833 (Liévin FR vs Levin NZ — different places with near-identical
|
|
19
|
-
* names; the panel's `41 Weraroa Road, Levin` row needs this side) · `chanchun`/`cancun` 0.75 ·
|
|
20
|
-
* `augsburg`/`augusta` 0.375 · `west bay`/`west end` 0.625 · `derry`/`londonderry` 0.455
|
|
21
|
-
* (Derry/Londonderry is a DUAL NAME, not a variant — its own follow-up on #1882)
|
|
22
|
-
*
|
|
23
|
-
* An unhandled script (Arabic, Hebrew, CJK — the romanizer covers Cyrillic only) answers NULL,
|
|
24
|
-
* never "different name": absence of a verdict must not stamp anything (the meaning-of-zero rule).
|
|
25
|
-
* The #1882 census counted 396 demoted Arabic/Hebrew-primary aliases left unclassified by this.
|
|
16
|
+
* An unhandled script (Arabic, Hebrew, CJK, since the romanizer covers Cyrillic only) answers NULL,
|
|
17
|
+
* never "different name". Absence of a verdict must not stamp anything.
|
|
26
18
|
*/
|
|
27
19
|
|
|
28
20
|
import { levenshteinSimilarity } from "@mailwoman/match/comparators"
|
|
29
21
|
|
|
30
22
|
/**
|
|
31
|
-
* Edit-similarity floor for the variant verdict.
|
|
32
|
-
*
|
|
23
|
+
* Edit-similarity floor for the variant verdict.
|
|
24
|
+
*
|
|
25
|
+
* The measured band: nearest admitted pair 0.875 (`adamovka`/`adamowka`),
|
|
26
|
+
* nearest refused pair 0.833 (`lievin`/`levin`).
|
|
33
27
|
*/
|
|
34
28
|
export const VARIANT_SIMILARITY_MIN = 0.85
|
|
35
29
|
|
|
36
30
|
/**
|
|
37
|
-
* BGN/
|
|
38
|
-
*
|
|
39
|
-
*
|
|
31
|
+
* BGN/pcgn-flavored Cyrillic romanization, folded to the name-key alphabet.
|
|
32
|
+
*
|
|
33
|
+
* Digraph outputs (zh, kh, ts, ch, sh, shch, yu, ya) match the dominant transliteration
|
|
34
|
+
* conventions the gazetteer's Latin aliases actually use.
|
|
35
|
+
* The `w`/`v` and `kh`/`h` style variance between systems is what the edit-similarity threshold absorbs.
|
|
40
36
|
*/
|
|
41
37
|
const CYRILLIC_TO_LATIN: Record<string, string> = {
|
|
42
38
|
а: "a",
|
|
@@ -80,8 +76,10 @@ const CYRILLIC_TO_LATIN: Record<string, string> = {
|
|
|
80
76
|
}
|
|
81
77
|
|
|
82
78
|
/**
|
|
83
|
-
* Leading-word abbreviations expanded
|
|
84
|
-
*
|
|
79
|
+
* Leading-word abbreviations expanded before comparison, so `st georges` meets
|
|
80
|
+
* `saint george s` inside the edit threshold.
|
|
81
|
+
*
|
|
82
|
+
* Whole-word only, so `st` inside `stanley` never expands.
|
|
85
83
|
*/
|
|
86
84
|
const NAME_ABBREVIATIONS: ReadonlyArray<[RegExp, string]> = [
|
|
87
85
|
[/\bst\b/g, "saint"],
|
|
@@ -91,7 +89,7 @@ const NAME_ABBREVIATIONS: ReadonlyArray<[RegExp, string]> = [
|
|
|
91
89
|
]
|
|
92
90
|
|
|
93
91
|
/**
|
|
94
|
-
* Expand the whole-word abbreviations above.
|
|
92
|
+
* Expand the whole-word abbreviations above in a name key.
|
|
95
93
|
*/
|
|
96
94
|
export function expandNameAbbreviations(key: string): string {
|
|
97
95
|
let out = key
|
|
@@ -104,8 +102,10 @@ export function expandNameAbbreviations(key: string): string {
|
|
|
104
102
|
}
|
|
105
103
|
|
|
106
104
|
/**
|
|
107
|
-
* Romanize a folded name key to the a–z0–9/space alphabet.
|
|
108
|
-
*
|
|
105
|
+
* Romanize a folded name key to the a–z0–9/space alphabet.
|
|
106
|
+
*
|
|
107
|
+
* `null` when characters outside the covered scripts remain.
|
|
108
|
+
* An unhandled script is no verdict.
|
|
109
109
|
*/
|
|
110
110
|
export function romanizeNameKey(key: string): string | null {
|
|
111
111
|
let out = ""
|
|
@@ -124,10 +124,13 @@ export function romanizeNameKey(key: string): string | null {
|
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
/**
|
|
127
|
-
* Edit similarity between a holder's primary name key and one of its alias keys,
|
|
128
|
-
* abbreviation-expanded.
|
|
127
|
+
* Edit similarity between a holder's primary name key and one of its alias keys,
|
|
128
|
+
* both romanized and abbreviation-expanded.
|
|
129
|
+
*
|
|
130
|
+
* `null` when either side's script is uncovered.
|
|
129
131
|
*/
|
|
130
|
-
// repo-health-ignore export-name-affix -- romanizes and expands abbreviations first;
|
|
132
|
+
// repo-health-ignore export-name-affix -- romanizes and expands abbreviations first;
|
|
133
|
+
// `nameSimilarity` compares as given.
|
|
131
134
|
export function ownNameSimilarity(primaryKey: string, aliasKey: string): number | null {
|
|
132
135
|
const primary = romanizeNameKey(primaryKey)
|
|
133
136
|
const alias = romanizeNameKey(aliasKey)
|
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
* @file The per-place record every candidate-staging pass writes its rows from.
|
|
6
6
|
*
|
|
7
|
-
* Pass 1 reduces each current `spr` row to one {@link PlaceAttrs}
|
|
7
|
+
* Pass 1 reduces each current `spr` row to one {@link PlaceAttrs}. Every later pass (alias bags,
|
|
8
8
|
* region abbreviations, country display names, the currency backfill, the extract folds) discovers
|
|
9
|
-
*
|
|
10
|
-
* That
|
|
11
|
-
*
|
|
12
|
-
* and whether the key is the place's canonical name.
|
|
9
|
+
* additional name keys for a place already in that map and stages a row against the same record.
|
|
10
|
+
* That keeps each candidate row denormalized without re-reading the source. A pass therefore needs
|
|
11
|
+
* exactly four values: the key, place, row ID, plus a flag for the place's canonical name.
|
|
13
12
|
*/
|
|
14
13
|
|
|
15
14
|
export interface PlaceAttrs {
|
|
@@ -23,22 +22,30 @@ export interface PlaceAttrs {
|
|
|
23
22
|
mnLon: number
|
|
24
23
|
mxLat: number
|
|
25
24
|
mxLon: number
|
|
26
|
-
|
|
25
|
+
/**
|
|
26
|
+
* The place's recorded population, or null when the gazetteer never measured one.
|
|
27
|
+
*
|
|
28
|
+
* NULL rather than zero.
|
|
29
|
+
* `place_population` holds no zero, so an absent row is the only way a place has no number.
|
|
30
|
+
* A zero written for those would be an unmeasured count.
|
|
31
|
+
*/
|
|
32
|
+
pop: number | null
|
|
27
33
|
neg: number
|
|
28
34
|
pkey: string
|
|
29
35
|
/**
|
|
30
|
-
* The place's toponym-fame score, or null when the score source has no measurement for it
|
|
31
|
-
*
|
|
32
|
-
*
|
|
36
|
+
* The place's toponym-fame score, or null when the score source has no measurement for it.
|
|
37
|
+
*
|
|
38
|
+
* A property of the place, so it appears on {@link StageRow} and on alias and abbrev rows too.
|
|
39
|
+
* That is how a bare `Moscow` reaches Москва's score through the alias row that includes the key.
|
|
33
40
|
*/
|
|
34
41
|
imp: number | null
|
|
35
42
|
}
|
|
36
43
|
|
|
37
44
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
45
|
+
* Stages one candidate row with a normalized name key, place, source ID,
|
|
46
|
+
* plus a canonical-name flag (`is_primary`).
|
|
40
47
|
*
|
|
41
|
-
* `sid` is passed separately rather than read off the place because
|
|
42
|
-
* ids the admin `attrs` map never held.
|
|
48
|
+
* `sid` is passed separately rather than read off the place because an extract fold
|
|
49
|
+
* and the alias pass stage rows for ids the admin `attrs` map never held.
|
|
43
50
|
*/
|
|
44
51
|
export type StageRow = (k: string, a: PlaceAttrs, sid: number, isPrimary: number) => void
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { sql, type Kysely } from "kysely"
|
|
8
|
+
|
|
9
|
+
import type { CandidateAncestorsDatabase } from "#candidate/ancestors/schema"
|
|
10
|
+
import type { CapitalTable } from "#capital-schema"
|
|
11
|
+
import type { NameKey } from "#street/normalize"
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* One candidate row.
|
|
15
|
+
*
|
|
16
|
+
* `name_key`, four small integer keys, `neg_rank`, and `spr_id` form the clustered primary key.
|
|
17
|
+
* The remaining fields are denormalized so a resolve needs one probe.
|
|
18
|
+
*/
|
|
19
|
+
export interface CandidateTable {
|
|
20
|
+
/**
|
|
21
|
+
* The shared {@link normalizeLocalityForKey} of the name/alias — the probe key.
|
|
22
|
+
*/
|
|
23
|
+
name_key: NameKey
|
|
24
|
+
/**
|
|
25
|
+
* Small int from {@link CountryCodeTable} (shrinks the clustered key).
|
|
26
|
+
*/
|
|
27
|
+
country_id: number
|
|
28
|
+
/**
|
|
29
|
+
* The place's region-tier ancestor id, or 0.
|
|
30
|
+
*/
|
|
31
|
+
region_id: number
|
|
32
|
+
/**
|
|
33
|
+
* Small int from {@link PlacetypeCodeTable}.
|
|
34
|
+
*/
|
|
35
|
+
placetype_id: number
|
|
36
|
+
/**
|
|
37
|
+
* `-log10(population + 1)`.
|
|
38
|
+
*
|
|
39
|
+
* The sort uses ascending order to put the highest population first.
|
|
40
|
+
* Postcodes use `0`.
|
|
41
|
+
*/
|
|
42
|
+
neg_rank: number
|
|
43
|
+
/**
|
|
44
|
+
* WOF id of the place this row resolves to.
|
|
45
|
+
*/
|
|
46
|
+
spr_id: number
|
|
47
|
+
name: string | null
|
|
48
|
+
latitude: number | null
|
|
49
|
+
longitude: number | null
|
|
50
|
+
min_lat: number | null
|
|
51
|
+
min_lon: number | null
|
|
52
|
+
max_lat: number | null
|
|
53
|
+
max_lon: number | null
|
|
54
|
+
population: number | null
|
|
55
|
+
/**
|
|
56
|
+
* 1 when the row is the place's canonical name (vs an alias/abbrev).
|
|
57
|
+
*/
|
|
58
|
+
is_primary: number | null
|
|
59
|
+
/**
|
|
60
|
+
* Blended place importance in [0, 1], NULL when unmeasured (never zero) and copied
|
|
61
|
+
* verbatim from the pre-split score source rather than the split `encyclopedic` channel.
|
|
62
|
+
*/
|
|
63
|
+
importance: number | null
|
|
64
|
+
/**
|
|
65
|
+
* The name's detected role on this row (`'abbr'`, `'gloss'` or `'variant'`),
|
|
66
|
+
* or NULL when no role was detected.
|
|
67
|
+
* The column is write-only in this build generation.
|
|
68
|
+
*/
|
|
69
|
+
name_role: string | null
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* `(id → ISO country code)` dictionary.
|
|
74
|
+
*/
|
|
75
|
+
export interface CountryCodeTable {
|
|
76
|
+
id: number
|
|
77
|
+
code: string
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* `(id → placetype)` dictionary.
|
|
82
|
+
*/
|
|
83
|
+
export interface PlacetypeCodeTable {
|
|
84
|
+
id: number
|
|
85
|
+
placetype: string
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The candidate database schema, extending the ancestors sidecar so one typed
|
|
90
|
+
* client covers every table in the artifact.
|
|
91
|
+
*/
|
|
92
|
+
export interface CandidateDatabase extends CandidateAncestorsDatabase {
|
|
93
|
+
/**
|
|
94
|
+
* The clustered `without rowid` lookup table the reader probes.
|
|
95
|
+
*/
|
|
96
|
+
candidate: CandidateTable
|
|
97
|
+
/**
|
|
98
|
+
* Transient staging table (same columns); dropped once `candidate` is materialized.
|
|
99
|
+
*/
|
|
100
|
+
cand_stage: CandidateTable
|
|
101
|
+
country_codes: CountryCodeTable
|
|
102
|
+
placetype_codes: PlacetypeCodeTable
|
|
103
|
+
/**
|
|
104
|
+
* The capital-status reference stored in the artifact.
|
|
105
|
+
* See capital-schema.ts.
|
|
106
|
+
*/
|
|
107
|
+
capital: CapitalTable
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The `candidate`/`cand_stage` columns in clustered-key order, from which the
|
|
112
|
+
* materialization derives its column list.
|
|
113
|
+
* Keep in sync with {@link CandidateTable}.
|
|
114
|
+
*/
|
|
115
|
+
export const CANDIDATE_COLUMNS = [
|
|
116
|
+
"name_key",
|
|
117
|
+
"country_id",
|
|
118
|
+
"region_id",
|
|
119
|
+
"placetype_id",
|
|
120
|
+
"neg_rank",
|
|
121
|
+
"spr_id",
|
|
122
|
+
"name",
|
|
123
|
+
"latitude",
|
|
124
|
+
"longitude",
|
|
125
|
+
"min_lat",
|
|
126
|
+
"min_lon",
|
|
127
|
+
"max_lat",
|
|
128
|
+
"max_lon",
|
|
129
|
+
"population",
|
|
130
|
+
"is_primary",
|
|
131
|
+
// Appended, never inserted mid-list: the positional `insert into cand_stage values (…)` binds by position.
|
|
132
|
+
"importance",
|
|
133
|
+
"name_role",
|
|
134
|
+
] as const
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Create the code dictionaries and the transient staging table; `cand_stage` mirrors
|
|
138
|
+
* {@link CandidateTable} with every column nullable because the loader fills them positionally.
|
|
139
|
+
*/
|
|
140
|
+
export async function createCandidateStagingTables(db: Kysely<CandidateDatabase>): Promise<void> {
|
|
141
|
+
await db.schema
|
|
142
|
+
.createTable("country_codes")
|
|
143
|
+
.addColumn("id", "integer", (c) => c.primaryKey())
|
|
144
|
+
.addColumn("code", "text", (c) => c.unique())
|
|
145
|
+
.execute()
|
|
146
|
+
|
|
147
|
+
await db.schema
|
|
148
|
+
.createTable("placetype_codes")
|
|
149
|
+
.addColumn("id", "integer", (c) => c.primaryKey())
|
|
150
|
+
.addColumn("placetype", "text", (c) => c.unique())
|
|
151
|
+
.execute()
|
|
152
|
+
|
|
153
|
+
await db.schema
|
|
154
|
+
.createTable("cand_stage")
|
|
155
|
+
.addColumn("name_key", "text")
|
|
156
|
+
.addColumn("country_id", "integer")
|
|
157
|
+
.addColumn("region_id", "integer")
|
|
158
|
+
.addColumn("placetype_id", "integer")
|
|
159
|
+
.addColumn("neg_rank", "real")
|
|
160
|
+
.addColumn("spr_id", "integer")
|
|
161
|
+
.addColumn("name", "text")
|
|
162
|
+
.addColumn("latitude", "real")
|
|
163
|
+
.addColumn("longitude", "real")
|
|
164
|
+
.addColumn("min_lat", "real")
|
|
165
|
+
.addColumn("min_lon", "real")
|
|
166
|
+
.addColumn("max_lat", "real")
|
|
167
|
+
.addColumn("max_lon", "real")
|
|
168
|
+
.addColumn("population", "integer")
|
|
169
|
+
.addColumn("is_primary", "integer")
|
|
170
|
+
.addColumn("importance", "real")
|
|
171
|
+
.addColumn("name_role", "text")
|
|
172
|
+
.execute()
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Create the clustered `without rowid` lookup table.
|
|
177
|
+
*
|
|
178
|
+
* Its first six columns form the primary key, ranked by population through `neg_rank`.
|
|
179
|
+
*/
|
|
180
|
+
export async function createCandidateTable(db: Kysely<CandidateDatabase>): Promise<void> {
|
|
181
|
+
await db.schema
|
|
182
|
+
.createTable("candidate")
|
|
183
|
+
.addColumn("name_key", "text", (c) => c.notNull())
|
|
184
|
+
.addColumn("country_id", "integer", (c) => c.notNull())
|
|
185
|
+
.addColumn("region_id", "integer", (c) => c.notNull())
|
|
186
|
+
.addColumn("placetype_id", "integer", (c) => c.notNull())
|
|
187
|
+
.addColumn("neg_rank", "real", (c) => c.notNull())
|
|
188
|
+
.addColumn("spr_id", "integer", (c) => c.notNull())
|
|
189
|
+
.addColumn("name", "text")
|
|
190
|
+
.addColumn("latitude", "real")
|
|
191
|
+
.addColumn("longitude", "real")
|
|
192
|
+
.addColumn("min_lat", "real")
|
|
193
|
+
.addColumn("min_lon", "real")
|
|
194
|
+
.addColumn("max_lat", "real")
|
|
195
|
+
.addColumn("max_lon", "real")
|
|
196
|
+
.addColumn("population", "integer")
|
|
197
|
+
.addColumn("is_primary", "integer")
|
|
198
|
+
.addColumn("importance", "real")
|
|
199
|
+
.addColumn("name_role", "text")
|
|
200
|
+
.addPrimaryKeyConstraint("candidate_pk", [
|
|
201
|
+
"name_key",
|
|
202
|
+
"country_id",
|
|
203
|
+
"region_id",
|
|
204
|
+
"placetype_id",
|
|
205
|
+
"neg_rank",
|
|
206
|
+
"spr_id",
|
|
207
|
+
])
|
|
208
|
+
// `without rowid` has no first-class builder. The raw modifier is the idiomatic fallback.
|
|
209
|
+
.modifyEnd(sql`without rowid`)
|
|
210
|
+
.execute()
|
|
211
|
+
}
|