@mailwoman/resolver-wof-sqlite 10.0.0 → 10.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -8
- package/lib/address/point/interpolation.ts +45 -39
- package/lib/address/point/schema.ts +17 -40
- package/lib/address/point.ts +316 -0
- package/lib/{address/index.ts → address.ts} +1 -1
- package/lib/ancestry/backfill.ts +20 -86
- package/lib/{ancestry/index.ts → ancestry.ts} +19 -15
- package/lib/build/candidate.ts +122 -174
- package/lib/build/population-corrections.ts +64 -0
- package/lib/build/slim.ts +44 -114
- package/lib/candidate/alias-bags.ts +16 -17
- package/lib/candidate/ancestors/schema.ts +77 -61
- package/lib/candidate/ancestors/sidecar.ts +15 -22
- package/lib/candidate/country-display-names.ts +6 -20
- package/lib/candidate/extract-fold.ts +10 -55
- package/lib/candidate/fts.ts +5 -23
- package/lib/candidate/importance.ts +65 -68
- package/lib/candidate/lookup.ts +124 -415
- package/lib/candidate/name-roles.ts +15 -33
- package/lib/candidate/own-name.ts +35 -32
- package/lib/candidate/place-attrs.ts +20 -13
- package/lib/candidate/schema.ts +29 -65
- package/lib/candidate/scoring.ts +54 -93
- package/lib/capital-schema.ts +21 -17
- package/lib/capitals.ts +29 -27
- package/lib/coincident-roles.ts +85 -55
- package/lib/convention/schema.ts +15 -16
- package/lib/convention.ts +144 -0
- package/lib/coverage-manifest-schema.ts +40 -45
- package/lib/currency-backfill.ts +34 -79
- package/lib/env.ts +1 -1
- package/lib/exact-match.ts +32 -21
- package/lib/extracts.ts +97 -74
- package/lib/fst/autocomplete.ts +54 -37
- package/lib/fst/builder.ts +37 -41
- package/lib/fst/deserialize-web.ts +16 -17
- package/lib/fst/format.ts +41 -23
- package/lib/fst/freshness.ts +43 -120
- package/lib/fst/matcher.ts +7 -5
- package/lib/fst/serialize.ts +54 -74
- package/lib/fst/types.ts +78 -75
- package/lib/{fst/index.ts → fst.ts} +1 -0
- package/lib/fts/query.ts +5 -36
- package/lib/fts.ts +280 -0
- package/lib/geonames/aliases.ts +73 -144
- package/lib/geonames/postal.ts +162 -71
- package/lib/index.ts +9 -8
- package/lib/interpolation.ts +48 -100
- package/lib/lookup.ts +155 -270
- package/lib/name-score.ts +9 -7
- package/lib/nsul/lookup.ts +37 -54
- package/lib/nsul/schema.ts +16 -43
- package/lib/paths.ts +159 -0
- package/lib/place-importance-schema.ts +62 -169
- package/lib/poi/lookup.ts +104 -121
- package/lib/poi/schema.ts +42 -26
- package/lib/polygon-schema.ts +10 -6
- package/lib/postal/city/alias/lookup.ts +22 -40
- package/lib/postal/city/alias/schema.ts +14 -10
- package/lib/postal/city/candidate-schema.ts +26 -20
- package/lib/postcode-point-lookup.ts +8 -27
- package/lib/primary-preference.ts +46 -126
- package/lib/proximity-rerank.ts +44 -33
- package/lib/ranking-weights.ts +105 -78
- package/lib/region-keys.ts +70 -42
- package/lib/reverse.ts +149 -86
- package/lib/schema.ts +73 -50
- package/lib/search-fetch.ts +90 -68
- package/lib/sqlite/convention-source.ts +15 -23
- package/lib/sqlite/utils.ts +19 -22
- package/lib/street/centroid/schema.ts +37 -42
- package/lib/street/{centroid/index.ts → centroid.ts} +16 -25
- package/lib/street/morphology/fst/builder.ts +60 -42
- package/lib/street/morphology/fst/loader.ts +40 -32
- package/lib/street/name-lookup.ts +45 -41
- package/lib/street/normalize.ts +88 -219
- package/lib/street/segment-schema.ts +116 -43
- package/lib/{street/index.ts → street.ts} +1 -1
- package/lib/types.ts +109 -150
- package/lib/unified-schema.ts +29 -29
- package/lib/uprn/existence.ts +30 -19
- package/lib/uprn/lookup.ts +29 -68
- package/lib/uprn/schema.ts +18 -40
- package/lib/weights-overlay-linker.ts +236 -252
- package/out/address/point/interpolation.d.ts +20 -23
- package/out/address/point/interpolation.d.ts.map +1 -1
- package/out/address/point/interpolation.js +42 -39
- package/out/address/point/interpolation.js.map +1 -1
- package/out/address/point/schema.d.ts +12 -35
- package/out/address/point/schema.d.ts.map +1 -1
- package/out/address/point/schema.js +3 -19
- package/out/address/point/schema.js.map +1 -1
- package/out/address/point.d.ts +57 -0
- package/out/address/point.d.ts.map +1 -0
- package/out/address/point.js +206 -0
- package/out/address/point.js.map +1 -0
- package/out/{address/index.js → address.d.ts} +2 -2
- package/out/address.d.ts.map +1 -0
- package/out/{address/index.d.ts → address.js} +2 -2
- package/out/address.js.map +1 -0
- package/out/ancestry/backfill.d.ts +11 -64
- package/out/ancestry/backfill.d.ts.map +1 -1
- package/out/ancestry/backfill.js +14 -74
- package/out/ancestry/backfill.js.map +1 -1
- package/out/ancestry.d.ts +49 -0
- package/out/ancestry.d.ts.map +1 -0
- package/out/ancestry.js +59 -0
- package/out/ancestry.js.map +1 -0
- package/out/build/candidate.d.ts +82 -112
- package/out/build/candidate.d.ts.map +1 -1
- package/out/build/candidate.js +17 -100
- package/out/build/candidate.js.map +1 -1
- package/out/build/population-corrections.d.ts +52 -0
- package/out/build/population-corrections.d.ts.map +1 -0
- package/out/build/population-corrections.js +40 -0
- package/out/build/population-corrections.js.map +1 -0
- package/out/build/slim.d.ts +8 -44
- package/out/build/slim.d.ts.map +1 -1
- package/out/build/slim.js +33 -94
- package/out/build/slim.js.map +1 -1
- package/out/candidate/alias-bags.d.ts +6 -6
- package/out/candidate/alias-bags.d.ts.map +1 -1
- package/out/candidate/alias-bags.js +16 -17
- package/out/candidate/alias-bags.js.map +1 -1
- package/out/candidate/ancestors/schema.d.ts +73 -57
- package/out/candidate/ancestors/schema.d.ts.map +1 -1
- package/out/candidate/ancestors/schema.js +56 -48
- package/out/candidate/ancestors/schema.js.map +1 -1
- package/out/candidate/ancestors/sidecar.d.ts +3 -8
- package/out/candidate/ancestors/sidecar.d.ts.map +1 -1
- package/out/candidate/ancestors/sidecar.js +15 -22
- package/out/candidate/ancestors/sidecar.js.map +1 -1
- package/out/candidate/country-display-names.d.ts +5 -15
- package/out/candidate/country-display-names.d.ts.map +1 -1
- package/out/candidate/country-display-names.js +6 -20
- package/out/candidate/country-display-names.js.map +1 -1
- package/out/candidate/extract-fold.d.ts +7 -15
- package/out/candidate/extract-fold.d.ts.map +1 -1
- package/out/candidate/extract-fold.js +5 -47
- package/out/candidate/extract-fold.js.map +1 -1
- package/out/candidate/fts.d.ts +5 -23
- package/out/candidate/fts.d.ts.map +1 -1
- package/out/candidate/fts.js +5 -23
- package/out/candidate/fts.js.map +1 -1
- package/out/candidate/importance.d.ts +60 -65
- package/out/candidate/importance.d.ts.map +1 -1
- package/out/candidate/importance.js +56 -63
- package/out/candidate/importance.js.map +1 -1
- package/out/candidate/lookup.d.ts +18 -55
- package/out/candidate/lookup.d.ts.map +1 -1
- package/out/candidate/lookup.js +82 -385
- package/out/candidate/lookup.js.map +1 -1
- package/out/candidate/name-roles.d.ts +9 -21
- package/out/candidate/name-roles.d.ts.map +1 -1
- package/out/candidate/name-roles.js +15 -33
- package/out/candidate/name-roles.js.map +1 -1
- package/out/candidate/own-name.d.ts +23 -25
- package/out/candidate/own-name.d.ts.map +1 -1
- package/out/candidate/own-name.js +35 -32
- package/out/candidate/own-name.js.map +1 -1
- package/out/candidate/place-attrs.d.ts +20 -13
- package/out/candidate/place-attrs.d.ts.map +1 -1
- package/out/candidate/place-attrs.js +4 -5
- package/out/candidate/place-attrs.js.map +1 -1
- package/out/candidate/schema.d.ts +27 -62
- package/out/candidate/schema.d.ts.map +1 -1
- package/out/candidate/schema.js +10 -22
- package/out/candidate/schema.js.map +1 -1
- package/out/candidate/scoring.d.ts +7 -8
- package/out/candidate/scoring.d.ts.map +1 -1
- package/out/candidate/scoring.js +52 -89
- package/out/candidate/scoring.js.map +1 -1
- package/out/capital-schema.d.ts +21 -17
- package/out/capital-schema.d.ts.map +1 -1
- package/out/capital-schema.js +17 -15
- package/out/capital-schema.js.map +1 -1
- package/out/capitals.d.ts +27 -25
- package/out/capitals.d.ts.map +1 -1
- package/out/capitals.js +23 -21
- package/out/capitals.js.map +1 -1
- package/out/coincident-roles.d.ts +60 -43
- package/out/coincident-roles.d.ts.map +1 -1
- package/out/coincident-roles.js +72 -50
- package/out/coincident-roles.js.map +1 -1
- package/out/convention/schema.d.ts +14 -14
- package/out/convention/schema.d.ts.map +1 -1
- package/out/convention/schema.js +6 -4
- package/out/convention/schema.js.map +1 -1
- package/out/convention.d.ts +97 -0
- package/out/convention.d.ts.map +1 -0
- package/out/convention.js +81 -0
- package/out/convention.js.map +1 -0
- package/out/coverage-manifest-schema.d.ts +34 -39
- package/out/coverage-manifest-schema.d.ts.map +1 -1
- package/out/coverage-manifest-schema.js +25 -34
- package/out/coverage-manifest-schema.js.map +1 -1
- package/out/currency-backfill.d.ts +16 -38
- package/out/currency-backfill.d.ts.map +1 -1
- package/out/currency-backfill.js +19 -46
- package/out/currency-backfill.js.map +1 -1
- package/out/env.d.ts +1 -1
- package/out/env.js +1 -1
- package/out/exact-match.d.ts +19 -10
- package/out/exact-match.d.ts.map +1 -1
- package/out/exact-match.js +32 -21
- package/out/exact-match.js.map +1 -1
- package/out/extracts.d.ts +66 -55
- package/out/extracts.d.ts.map +1 -1
- package/out/extracts.js +63 -55
- package/out/extracts.js.map +1 -1
- package/out/fst/autocomplete.d.ts +29 -21
- package/out/fst/autocomplete.d.ts.map +1 -1
- package/out/fst/autocomplete.js +39 -28
- package/out/fst/autocomplete.js.map +1 -1
- package/out/fst/builder.d.ts.map +1 -1
- package/out/fst/builder.js +37 -41
- package/out/fst/builder.js.map +1 -1
- package/out/fst/deserialize-web.d.ts +4 -4
- package/out/fst/deserialize-web.d.ts.map +1 -1
- package/out/fst/deserialize-web.js +15 -16
- package/out/fst/deserialize-web.js.map +1 -1
- package/out/fst/format.d.ts +41 -23
- package/out/fst/format.d.ts.map +1 -1
- package/out/fst/format.js +41 -23
- package/out/fst/format.js.map +1 -1
- package/out/fst/freshness.d.ts +19 -81
- package/out/fst/freshness.d.ts.map +1 -1
- package/out/fst/freshness.js +31 -94
- package/out/fst/freshness.js.map +1 -1
- package/out/fst/matcher.d.ts +5 -4
- package/out/fst/matcher.d.ts.map +1 -1
- package/out/fst/matcher.js +2 -2
- package/out/fst/matcher.js.map +1 -1
- package/out/fst/serialize.d.ts +28 -28
- package/out/fst/serialize.d.ts.map +1 -1
- package/out/fst/serialize.js +53 -71
- package/out/fst/serialize.js.map +1 -1
- package/out/fst/types.d.ts +78 -74
- package/out/fst/types.d.ts.map +1 -1
- package/out/fst/types.js +1 -4
- package/out/fst/types.js.map +1 -1
- package/out/{fst/index.js → fst.d.ts} +2 -1
- package/out/fst.d.ts.map +1 -0
- package/out/{fst/index.d.ts → fst.js} +2 -1
- package/out/fst.js.map +1 -0
- package/out/fts/query.d.ts +2 -27
- package/out/fts/query.d.ts.map +1 -1
- package/out/fts/query.js +5 -36
- package/out/fts/query.js.map +1 -1
- package/out/fts.d.ts +126 -0
- package/out/fts.d.ts.map +1 -0
- package/out/fts.js +188 -0
- package/out/fts.js.map +1 -0
- package/out/geonames/aliases.d.ts +26 -62
- package/out/geonames/aliases.d.ts.map +1 -1
- package/out/geonames/aliases.js +45 -117
- package/out/geonames/aliases.js.map +1 -1
- package/out/geonames/postal.d.ts +84 -44
- package/out/geonames/postal.d.ts.map +1 -1
- package/out/geonames/postal.js +115 -73
- package/out/geonames/postal.js.map +1 -1
- package/out/{geonames/index.js → geonames.d.ts} +1 -1
- package/out/geonames.d.ts.map +1 -0
- package/out/{geonames/index.d.ts → geonames.js} +1 -1
- package/out/geonames.js.map +1 -0
- package/out/index.d.ts +9 -8
- package/out/index.d.ts.map +1 -1
- package/out/index.js +6 -5
- package/out/index.js.map +1 -1
- package/out/interpolation.d.ts +18 -55
- package/out/interpolation.d.ts.map +1 -1
- package/out/interpolation.js +27 -69
- package/out/interpolation.js.map +1 -1
- package/out/lookup.d.ts +23 -51
- package/out/lookup.d.ts.map +1 -1
- package/out/lookup.js +136 -234
- package/out/lookup.js.map +1 -1
- package/out/name-score.d.ts +2 -2
- package/out/name-score.d.ts.map +1 -1
- package/out/name-score.js +9 -7
- package/out/name-score.js.map +1 -1
- package/out/nsul/lookup.d.ts +33 -34
- package/out/nsul/lookup.d.ts.map +1 -1
- package/out/nsul/lookup.js +26 -40
- package/out/nsul/lookup.js.map +1 -1
- package/out/nsul/schema.d.ts +16 -43
- package/out/nsul/schema.d.ts.map +1 -1
- package/out/nsul/schema.js +9 -35
- package/out/nsul/schema.js.map +1 -1
- package/out/{nsul/index.d.ts → nsul.d.ts} +1 -1
- package/out/nsul.d.ts.map +1 -0
- package/out/{nsul/index.js → nsul.js} +1 -1
- package/out/nsul.js.map +1 -0
- package/out/paths.d.ts +124 -0
- package/out/paths.d.ts.map +1 -0
- package/out/paths.js +104 -0
- package/out/paths.js.map +1 -0
- package/out/place-importance-schema.d.ts +51 -143
- package/out/place-importance-schema.d.ts.map +1 -1
- package/out/place-importance-schema.js +28 -143
- package/out/place-importance-schema.js.map +1 -1
- package/out/poi/lookup.d.ts +40 -47
- package/out/poi/lookup.d.ts.map +1 -1
- package/out/poi/lookup.js +69 -96
- package/out/poi/lookup.js.map +1 -1
- package/out/poi/schema.d.ts +41 -25
- package/out/poi/schema.d.ts.map +1 -1
- package/out/poi/schema.js +25 -17
- package/out/poi/schema.js.map +1 -1
- package/out/{poi/index.js → poi.d.ts} +1 -1
- package/out/poi.d.ts.map +1 -0
- package/out/{poi/index.d.ts → poi.js} +1 -1
- package/out/poi.js.map +1 -0
- package/out/polygon-schema.d.ts +10 -6
- package/out/polygon-schema.d.ts.map +1 -1
- package/out/polygon-schema.js +2 -2
- package/out/polygon-schema.js.map +1 -1
- package/out/postal/city/alias/lookup.d.ts +20 -23
- package/out/postal/city/alias/lookup.d.ts.map +1 -1
- package/out/postal/city/alias/lookup.js +17 -30
- package/out/postal/city/alias/lookup.js.map +1 -1
- package/out/postal/city/alias/schema.d.ts +14 -10
- package/out/postal/city/alias/schema.d.ts.map +1 -1
- package/out/postal/city/alias/schema.js +10 -8
- package/out/postal/city/alias/schema.js.map +1 -1
- package/out/postal/city/candidate-schema.d.ts +25 -19
- package/out/postal/city/candidate-schema.d.ts.map +1 -1
- package/out/postal/city/candidate-schema.js +21 -17
- package/out/postal/city/candidate-schema.js.map +1 -1
- package/out/{postal/index.d.ts → postal.d.ts} +1 -1
- package/out/postal.d.ts.map +1 -0
- package/out/{postal/index.js → postal.js} +1 -1
- package/out/postal.js.map +1 -0
- package/out/postcode-point-lookup.d.ts +6 -24
- package/out/postcode-point-lookup.d.ts.map +1 -1
- package/out/postcode-point-lookup.js +5 -17
- package/out/postcode-point-lookup.js.map +1 -1
- package/out/primary-preference.d.ts +38 -92
- package/out/primary-preference.d.ts.map +1 -1
- package/out/primary-preference.js +15 -99
- package/out/primary-preference.js.map +1 -1
- package/out/proximity-rerank.d.ts +41 -30
- package/out/proximity-rerank.d.ts.map +1 -1
- package/out/proximity-rerank.js +38 -29
- package/out/proximity-rerank.js.map +1 -1
- package/out/ranking-weights.d.ts +98 -64
- package/out/ranking-weights.d.ts.map +1 -1
- package/out/ranking-weights.js +26 -25
- package/out/ranking-weights.js.map +1 -1
- package/out/region-keys.d.ts +50 -31
- package/out/region-keys.d.ts.map +1 -1
- package/out/region-keys.js +68 -40
- package/out/region-keys.js.map +1 -1
- package/out/reverse.d.ts +78 -50
- package/out/reverse.d.ts.map +1 -1
- package/out/reverse.js +98 -61
- package/out/reverse.js.map +1 -1
- package/out/schema.d.ts +72 -49
- package/out/schema.d.ts.map +1 -1
- package/out/schema.js +4 -5
- package/out/schema.js.map +1 -1
- package/out/search-fetch.d.ts +16 -12
- package/out/search-fetch.d.ts.map +1 -1
- package/out/search-fetch.js +83 -63
- package/out/search-fetch.js.map +1 -1
- package/out/sqlite/convention-source.d.ts +12 -16
- package/out/sqlite/convention-source.d.ts.map +1 -1
- package/out/sqlite/convention-source.js +13 -22
- package/out/sqlite/convention-source.js.map +1 -1
- package/out/sqlite/utils.d.ts +19 -19
- package/out/sqlite/utils.d.ts.map +1 -1
- package/out/sqlite/utils.js +14 -15
- package/out/sqlite/utils.js.map +1 -1
- package/out/street/centroid/schema.d.ts +37 -42
- package/out/street/centroid/schema.d.ts.map +1 -1
- package/out/street/centroid/schema.js +9 -21
- package/out/street/centroid/schema.js.map +1 -1
- package/out/street/centroid.d.ts +30 -0
- package/out/street/centroid.d.ts.map +1 -0
- package/out/street/{centroid/index.js → centroid.js} +13 -24
- package/out/street/centroid.js.map +1 -0
- package/out/street/morphology/fst/builder.d.ts +20 -10
- package/out/street/morphology/fst/builder.d.ts.map +1 -1
- package/out/street/morphology/fst/builder.js +44 -34
- package/out/street/morphology/fst/builder.js.map +1 -1
- package/out/street/morphology/fst/loader.d.ts +33 -26
- package/out/street/morphology/fst/loader.d.ts.map +1 -1
- package/out/street/morphology/fst/loader.js +23 -22
- package/out/street/morphology/fst/loader.js.map +1 -1
- package/out/street/name-lookup.d.ts +24 -18
- package/out/street/name-lookup.d.ts.map +1 -1
- package/out/street/name-lookup.js +34 -35
- package/out/street/name-lookup.js.map +1 -1
- package/out/street/normalize.d.ts +35 -136
- package/out/street/normalize.d.ts.map +1 -1
- package/out/street/normalize.js +77 -194
- package/out/street/normalize.js.map +1 -1
- package/out/street/segment-schema.d.ts +79 -39
- package/out/street/segment-schema.d.ts.map +1 -1
- package/out/street/segment-schema.js +71 -21
- package/out/street/segment-schema.js.map +1 -1
- package/out/{street/index.js → street.d.ts} +2 -2
- package/out/street.d.ts.map +1 -0
- package/out/{street/index.d.ts → street.js} +2 -2
- package/out/street.js.map +1 -0
- package/out/types.d.ts +84 -149
- package/out/types.d.ts.map +1 -1
- package/out/types.js +0 -6
- package/out/types.js.map +1 -1
- package/out/unified-schema.d.ts +8 -12
- package/out/unified-schema.d.ts.map +1 -1
- package/out/unified-schema.js +29 -29
- package/out/unified-schema.js.map +1 -1
- package/out/uprn/existence.d.ts +28 -17
- package/out/uprn/existence.d.ts.map +1 -1
- package/out/uprn/existence.js +26 -16
- package/out/uprn/existence.js.map +1 -1
- package/out/uprn/lookup.d.ts +14 -44
- package/out/uprn/lookup.d.ts.map +1 -1
- package/out/uprn/lookup.js +21 -57
- package/out/uprn/lookup.js.map +1 -1
- package/out/uprn/schema.d.ts +18 -40
- package/out/uprn/schema.d.ts.map +1 -1
- package/out/uprn/schema.js +10 -32
- package/out/uprn/schema.js.map +1 -1
- package/out/{uprn/index.d.ts → uprn.d.ts} +1 -1
- package/out/uprn.d.ts.map +1 -0
- package/out/{uprn/index.js → uprn.js} +1 -1
- package/out/uprn.js.map +1 -0
- package/out/weights-overlay-linker.d.ts +138 -144
- package/out/weights-overlay-linker.d.ts.map +1 -1
- package/out/weights-overlay-linker.js +105 -159
- package/out/weights-overlay-linker.js.map +1 -1
- package/package.json +91 -596
- package/lib/address/point/index.ts +0 -328
- package/lib/convention/index.ts +0 -154
- package/lib/fts/index.ts +0 -361
- package/out/address/index.d.ts.map +0 -1
- package/out/address/index.js.map +0 -1
- package/out/address/point/index.d.ts +0 -53
- package/out/address/point/index.d.ts.map +0 -1
- package/out/address/point/index.js +0 -222
- package/out/address/point/index.js.map +0 -1
- package/out/ancestry/index.d.ts +0 -45
- package/out/ancestry/index.d.ts.map +0 -1
- package/out/ancestry/index.js +0 -55
- package/out/ancestry/index.js.map +0 -1
- package/out/convention/index.d.ts +0 -106
- package/out/convention/index.d.ts.map +0 -1
- package/out/convention/index.js +0 -93
- package/out/convention/index.js.map +0 -1
- package/out/fst/index.d.ts.map +0 -1
- package/out/fst/index.js.map +0 -1
- package/out/fts/index.d.ts +0 -184
- package/out/fts/index.d.ts.map +0 -1
- package/out/fts/index.js +0 -277
- package/out/fts/index.js.map +0 -1
- package/out/geonames/index.d.ts.map +0 -1
- package/out/geonames/index.js.map +0 -1
- package/out/nsul/index.d.ts.map +0 -1
- package/out/nsul/index.js.map +0 -1
- package/out/poi/index.d.ts.map +0 -1
- package/out/poi/index.js.map +0 -1
- package/out/postal/index.d.ts.map +0 -1
- package/out/postal/index.js.map +0 -1
- package/out/street/centroid/index.d.ts +0 -40
- package/out/street/centroid/index.d.ts.map +0 -1
- package/out/street/centroid/index.js.map +0 -1
- package/out/street/index.d.ts.map +0 -1
- package/out/street/index.js.map +0 -1
- package/out/uprn/index.d.ts.map +0 -1
- package/out/uprn/index.js.map +0 -1
- /package/lib/{geonames/index.ts → geonames.ts} +0 -0
- /package/lib/{nsul/index.ts → nsul.ts} +0 -0
- /package/lib/{poi/index.ts → poi.ts} +0 -0
- /package/lib/{postal/index.ts → postal.ts} +0 -0
- /package/lib/{uprn/index.ts → uprn.ts} +0 -0
|
@@ -16,17 +16,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,15 +124,18 @@ 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)
|
|
134
137
|
|
|
135
|
-
if (primary
|
|
138
|
+
if (!primary || !alias || !primary || !alias) return null
|
|
136
139
|
|
|
137
140
|
return levenshteinSimilarity(expandNameAbbreviations(primary), expandNameAbbreviations(alias))
|
|
138
141
|
}
|
|
@@ -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
|
package/lib/candidate/schema.ts
CHANGED
|
@@ -2,17 +2,6 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* Typed schema for the byte-range CANDIDATE gazetteer (`candidate.db`) — the single source of truth
|
|
7
|
-
* for the columns shared by the BUILDER ({@link buildCandidateTable}) and the READERS (the Node
|
|
8
|
-
* {@link WOFCandidateTableLookup} + the browser `@mailwoman/resolver-wof-wasm/httpvfs/resolver`). Before this module each
|
|
9
|
-
* side hand-wrote the column list; a rename in one place broke the other at runtime. Now the
|
|
10
|
-
* contract is a Kysely `Database` interface (`new DatabaseClient<CandidateDatabase>(...)` for
|
|
11
|
-
* typed inserts) plus the table DDL as strings — so a column change is a compile error on every
|
|
12
|
-
* consumer.
|
|
13
|
-
*
|
|
14
|
-
* `cand_stage` is the transient staging table the builder bulk-loads; `candidate` is the clustered
|
|
15
|
-
* `WITHOUT ROWID` B-tree it's materialized into (same columns). The reader queries `candidate`.
|
|
16
5
|
*/
|
|
17
6
|
|
|
18
7
|
import { sql, type Kysely } from "kysely"
|
|
@@ -22,9 +11,10 @@ import type { CapitalTable } from "#capital-schema"
|
|
|
22
11
|
import type { NameKey } from "#street/normalize"
|
|
23
12
|
|
|
24
13
|
/**
|
|
25
|
-
* One candidate row.
|
|
26
|
-
*
|
|
27
|
-
*
|
|
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.
|
|
28
18
|
*/
|
|
29
19
|
export interface CandidateTable {
|
|
30
20
|
/**
|
|
@@ -36,7 +26,7 @@ export interface CandidateTable {
|
|
|
36
26
|
*/
|
|
37
27
|
country_id: number
|
|
38
28
|
/**
|
|
39
|
-
* The place's region-tier ancestor id, or 0
|
|
29
|
+
* The place's region-tier ancestor id, or 0.
|
|
40
30
|
*/
|
|
41
31
|
region_id: number
|
|
42
32
|
/**
|
|
@@ -44,7 +34,10 @@ export interface CandidateTable {
|
|
|
44
34
|
*/
|
|
45
35
|
placetype_id: number
|
|
46
36
|
/**
|
|
47
|
-
* `-log10(population + 1)
|
|
37
|
+
* `-log10(population + 1)`.
|
|
38
|
+
*
|
|
39
|
+
* The sort uses ascending order to put the highest population first.
|
|
40
|
+
* Postcodes use `0`.
|
|
48
41
|
*/
|
|
49
42
|
neg_rank: number
|
|
50
43
|
/**
|
|
@@ -64,42 +57,14 @@ export interface CandidateTable {
|
|
|
64
57
|
*/
|
|
65
58
|
is_primary: number | null
|
|
66
59
|
/**
|
|
67
|
-
* Blended place importance in [0, 1]
|
|
68
|
-
*
|
|
69
|
-
* Constant across every row of one place — primary, alias and abbrev alike — because it is a property of the PLACE,
|
|
70
|
-
* not of the name that reached it, which is what lets a bare `Moscow` inherit Москва's score through the alias row.
|
|
71
|
-
*
|
|
72
|
-
* **THIS IS THE PRE-SPLIT CONFLATION, AND THE NAME SAYS SO.** It is `place_importance.importance` copied verbatim
|
|
73
|
-
* from the score source — the bounded blend `place-importance-schema.ts`'s `blendImportance` writes (the
|
|
74
|
-
* concordance's encyclopedia-derived channel clamped around a population-derived base); that module calls the column
|
|
75
|
-
* DEPRECATED. It is NOT the split `encyclopedic` channel, and the two must not be conflated in a future build:
|
|
76
|
-
* writing the split value here instead was measured on 2026-08-10 and makes the ranking key INERT on three of the
|
|
77
|
-
* four rows it exists to fix. The reason is coverage, not principle — the encyclopedia-concordance join in
|
|
78
|
-
* `admin-global-priority-importance.db` reaches 133,888 of 702,709 scored places and only eleven countries
|
|
79
|
-
* (US/FR/GB/DE/IT/ES/NL/JP/CN/KR/TW). CA, AU and RU have ZERO concordance rows, so Whitby CA, Windsor CA and Epping
|
|
80
|
-
* AU carry the population fallback and nothing else. Under the strict split those three become unmeasured, the
|
|
81
|
-
* consumer's positive-evidence-only rule leaves them exactly where population put them (first), and the famous GB
|
|
82
|
-
* bearer can never overtake them. The conflated column is the only one on which every bearer of a name is scored on a
|
|
83
|
-
* single comparable scale, which is the precondition for comparing them at all.
|
|
84
|
-
*
|
|
85
|
-
* So a consumer reads this as "fame, with population standing in where fame was never measured" — the legacy blended
|
|
86
|
-
* semantics — and NOT as "this place has an encyclopedia entry of this importance". When the score source grows a
|
|
87
|
-
* real `encyclopedic` column for every country, add a SECOND column rather than redefining this one.
|
|
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.
|
|
88
62
|
*/
|
|
89
63
|
importance: number | null
|
|
90
64
|
/**
|
|
91
|
-
* The
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* (or English) — the #936 signal, measured at a 13× key-collision rate vs preferred names.
|
|
95
|
-
* - `'gloss'` — anomaly-based: the row belongs to a place whose key count crosses the gloss threshold with a non-admin
|
|
96
|
-
* placetype and NO measured prominence (population absent AND importance unmeasured) — the translation-gloss
|
|
97
|
-
* fingerprint (#1730's sweep; `Poisson` → a US fish-name place). Provenance CANNOT separate a gloss from an exonym
|
|
98
|
-
* (WOF imported both as `x_preferred`), which is why this detector is an anomaly test and stamps only the certain
|
|
99
|
-
* core.
|
|
100
|
-
*
|
|
101
|
-
* NULL = no role detected. The column is WRITE-ONLY in this build generation: no ranking consumer reads it — a rank
|
|
102
|
-
* penalty is its own future, D-rule-conditional step with the `gloss_key` board as regression check.
|
|
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.
|
|
103
68
|
*/
|
|
104
69
|
name_role: string | null
|
|
105
70
|
}
|
|
@@ -121,13 +86,12 @@ export interface PlacetypeCodeTable {
|
|
|
121
86
|
}
|
|
122
87
|
|
|
123
88
|
/**
|
|
124
|
-
* The candidate database schema
|
|
125
|
-
*
|
|
126
|
-
* builder's one typed client covers every table in the artifact.
|
|
89
|
+
* The candidate database schema, extending the ancestors sidecar so one typed
|
|
90
|
+
* client covers every table in the artifact.
|
|
127
91
|
*/
|
|
128
92
|
export interface CandidateDatabase extends CandidateAncestorsDatabase {
|
|
129
93
|
/**
|
|
130
|
-
* The clustered `
|
|
94
|
+
* The clustered `without rowid` lookup table the reader probes.
|
|
131
95
|
*/
|
|
132
96
|
candidate: CandidateTable
|
|
133
97
|
/**
|
|
@@ -137,15 +101,16 @@ export interface CandidateDatabase extends CandidateAncestorsDatabase {
|
|
|
137
101
|
country_codes: CountryCodeTable
|
|
138
102
|
placetype_codes: PlacetypeCodeTable
|
|
139
103
|
/**
|
|
140
|
-
* The capital-status reference
|
|
104
|
+
* The capital-status reference stored in the artifact.
|
|
105
|
+
* See capital-schema.ts.
|
|
141
106
|
*/
|
|
142
107
|
capital: CapitalTable
|
|
143
108
|
}
|
|
144
109
|
|
|
145
110
|
/**
|
|
146
|
-
* The `candidate`/`cand_stage` columns in clustered-key order
|
|
147
|
-
*
|
|
148
|
-
* {@link CandidateTable}.
|
|
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}.
|
|
149
114
|
*/
|
|
150
115
|
export const CANDIDATE_COLUMNS = [
|
|
151
116
|
"name_key",
|
|
@@ -163,16 +128,14 @@ export const CANDIDATE_COLUMNS = [
|
|
|
163
128
|
"max_lon",
|
|
164
129
|
"population",
|
|
165
130
|
"is_primary",
|
|
166
|
-
// Appended, never inserted mid-list: the
|
|
167
|
-
// positional `INSERT INTO cand_stage VALUES (…)` in the builder binds by position.
|
|
131
|
+
// Appended, never inserted mid-list: the positional `insert into cand_stage values (…)` binds by position.
|
|
168
132
|
"importance",
|
|
169
133
|
"name_role",
|
|
170
134
|
] as const
|
|
171
135
|
|
|
172
136
|
/**
|
|
173
|
-
* Create the code dictionaries
|
|
174
|
-
*
|
|
175
|
-
* {@link DatabaseClient} (or any `Kysely`) over the candidate DB.
|
|
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.
|
|
176
139
|
*/
|
|
177
140
|
export async function createCandidateStagingTables(db: Kysely<CandidateDatabase>): Promise<void> {
|
|
178
141
|
await db.schema
|
|
@@ -210,8 +173,9 @@ export async function createCandidateStagingTables(db: Kysely<CandidateDatabase>
|
|
|
210
173
|
}
|
|
211
174
|
|
|
212
175
|
/**
|
|
213
|
-
* Create the clustered `
|
|
214
|
-
*
|
|
176
|
+
* Create the clustered `without rowid` lookup table.
|
|
177
|
+
*
|
|
178
|
+
* Its first six columns form the primary key, ranked by population through `neg_rank`.
|
|
215
179
|
*/
|
|
216
180
|
export async function createCandidateTable(db: Kysely<CandidateDatabase>): Promise<void> {
|
|
217
181
|
await db.schema
|
|
@@ -241,7 +205,7 @@ export async function createCandidateTable(db: Kysely<CandidateDatabase>): Promi
|
|
|
241
205
|
"neg_rank",
|
|
242
206
|
"spr_id",
|
|
243
207
|
])
|
|
244
|
-
// `
|
|
208
|
+
// `without rowid` has no first-class builder. The raw modifier is the idiomatic fallback.
|
|
245
209
|
.modifyEnd(sql`without rowid`)
|
|
246
210
|
.execute()
|
|
247
211
|
}
|