@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
package/out/fts/query.js
CHANGED
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
* Both turn a caller's loose input into something SQLite's FTS5 parser accepts without throwing —
|
|
8
|
-
* an unescaped quote or a bare `*` is a syntax error, not an empty result.
|
|
6
|
+
* Query shaping for the FTS5 lookup: placetype normalization and the match-expression sanitizer.
|
|
9
7
|
*/
|
|
10
8
|
export function normalizePlacetypes(p) {
|
|
11
9
|
if (!p)
|
|
@@ -13,30 +11,7 @@ export function normalizePlacetypes(p) {
|
|
|
13
11
|
return Array.isArray(p) ? p : [p];
|
|
14
12
|
}
|
|
15
13
|
/**
|
|
16
|
-
* Make an arbitrary user-typed string safe for FTS5
|
|
17
|
-
*
|
|
18
|
-
* FTS5 has its own query syntax (`"phrase"`, `term1 OR term2`, `prefix*`, NEAR/N, etc.). Letting raw user input through
|
|
19
|
-
* means a user typing `Paris's` or `St. (Petersburg)` causes a syntax error.
|
|
20
|
-
*
|
|
21
|
-
* Per-token rules:
|
|
22
|
-
*
|
|
23
|
-
* - Strip all punctuation except trailing `*` from each whitespace-separated token.
|
|
24
|
-
* - **Trailing `*`** is preserved as FTS5 **prefix syntax** — `627*` becomes the literal `627*` (unquoted). The caller
|
|
25
|
-
* signaled they want a prefix; respect that.
|
|
26
|
-
* - All other tokens are wrapped in `"..."` as a single-word phrase. Conservative — handles apostrophes, parens, accented
|
|
27
|
-
* input, etc. safely.
|
|
28
|
-
* - Multiple tokens join with implicit AND.
|
|
29
|
-
*
|
|
30
|
-
* Examples:
|
|
31
|
-
*
|
|
32
|
-
* - `"Paris"` → `"Paris"` (phrase)
|
|
33
|
-
* - `"627*"` → `627*` (prefix)
|
|
34
|
-
* - `"St. (Petersburg)"` → `"St" "Petersburg"` (two phrases, AND-joined)
|
|
35
|
-
* - `"Thiron-Gardais"` → `"Thiron" "Gardais"` (intra-token punctuation SPLITS — #945; fusing to `ThironGardais` matched
|
|
36
|
-
* nothing because the FTS doc tokenizes the hyphenated name as two terms)
|
|
37
|
-
* - `"110 00"` with `fuseTokens` (postcode-typed) → `"110" "00"` per-token fused — the #920 name law
|
|
38
|
-
* - `"Pari* TX"` → `Pari* "TX"` (mixed prefix + phrase)
|
|
39
|
-
* - `"*"` alone → `""` (no body → drop)
|
|
14
|
+
* Make an arbitrary user-typed string safe for FTS5 match.
|
|
40
15
|
*/
|
|
41
16
|
export function sanitizeFTSQuery(text, opts) {
|
|
42
17
|
const out = [];
|
|
@@ -45,8 +20,7 @@ export function sanitizeFTSQuery(text, opts) {
|
|
|
45
20
|
if (!trimmed)
|
|
46
21
|
continue;
|
|
47
22
|
const hasPrefixStar = trimmed.endsWith("*");
|
|
48
|
-
//
|
|
49
|
-
// remainder — postal names are stored in this collapsed shape ("SW1A" stays one term).
|
|
23
|
+
// Fused mode deletes intra-token punctuation because postal names are stored in that collapsed shape.
|
|
50
24
|
if (opts?.fuseTokens) {
|
|
51
25
|
const body = trimmed.replaceAll(/[^\p{L}\p{N}]/gu, "");
|
|
52
26
|
if (!body)
|
|
@@ -54,19 +28,14 @@ export function sanitizeFTSQuery(text, opts) {
|
|
|
54
28
|
out.push(hasPrefixStar ? `${body}*` : `"${body.replaceAll('"', '""')}"`);
|
|
55
29
|
continue;
|
|
56
30
|
}
|
|
57
|
-
|
|
58
|
-
// promised ("St. (Petersburg)" → two phrases). The old code DELETED punctuation instead,
|
|
59
|
-
// fusing "Thiron-Gardais" into the unmatchable single term `ThironGardais` while the FTS
|
|
60
|
-
// doc holds two terms (#945 — the entire hyphenated-name class missed at the raw lookup;
|
|
61
|
-
// masked for years because pre-splice tokenizers never emitted hyphen-preserved values).
|
|
62
|
-
const parts = trimmed.split(/[^\p{L}\p{N}]+/u).filter((part) => part.length > 0);
|
|
31
|
+
const parts = trimmed.split(/[^\p{L}\p{N}]+/u).filter((part) => part.length);
|
|
63
32
|
if (!parts.length)
|
|
64
33
|
continue;
|
|
65
34
|
for (let i = 0; i < parts.length; i++) {
|
|
66
35
|
const body = parts[i].replaceAll("*", "");
|
|
67
36
|
if (!body)
|
|
68
37
|
continue;
|
|
69
|
-
// The caller's trailing `*` applies to the
|
|
38
|
+
// The caller's trailing `*` applies only to the final part.
|
|
70
39
|
out.push(hasPrefixStar && i === parts.length - 1 ? `${body}*` : `"${body.replaceAll('"', '""')}"`);
|
|
71
40
|
}
|
|
72
41
|
}
|
package/out/fts/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../lib/fts/query.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../lib/fts/query.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,UAAU,mBAAmB,CAAC,CAA8B;IACjE,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAEnB,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAA+B;IAC7E,MAAM,GAAG,GAAa,EAAE,CAAA;IAExB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAE/B,IAAI,CAAC,OAAO;YAAE,SAAQ;QACtB,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAE3C,sGAAsG;QACtG,IAAI,IAAI,EAAE,UAAU,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;YAEtD,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;YAExE,SAAQ;QACT,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAE5E,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,SAAQ;QAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;YAE1C,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,4DAA4D;YAC5D,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QACnG,CAAC;IACF,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACrB,CAAC"}
|
package/out/fts.d.ts
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*/
|
|
6
|
+
import type { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
7
|
+
/**
|
|
8
|
+
* The name of the FTS5 virtual table that indexes WOF place names for `match` queries.
|
|
9
|
+
*/
|
|
10
|
+
export declare const PLACE_SEARCH_TABLE = "place_search";
|
|
11
|
+
/**
|
|
12
|
+
* The separator between aliases in the `alt_names` bag.
|
|
13
|
+
* It stops a phrase query from matching across two aliases.
|
|
14
|
+
*
|
|
15
|
+
* FTS5 assigns positions only to tokens.
|
|
16
|
+
* Spaces and punctuation are not tokens and would leave the aliases adjacent,
|
|
17
|
+
* but unicode61 indexes the Private Use Area codepoint U+E000 as a token.
|
|
18
|
+
*
|
|
19
|
+
* Query sanitizers strip this character, so no user query can match the separator.
|
|
20
|
+
*/
|
|
21
|
+
export declare const ALIAS_SEPARATOR = "\uE000";
|
|
22
|
+
/**
|
|
23
|
+
* Folds a query or name for exact-tier comparison by lowercasing, trimming
|
|
24
|
+
* and collapsing internal whitespace.
|
|
25
|
+
*
|
|
26
|
+
* Every exact-tier consumer uses this function, so its output compares equal to
|
|
27
|
+
* the aliases that {@link aliasBagExactMatch} parses.
|
|
28
|
+
*/
|
|
29
|
+
export declare function foldQueryText(input: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Returns whether any alias in an `alt_names` bag exactly equals the folded query.
|
|
32
|
+
*
|
|
33
|
+
* A bag without {@link ALIAS_SEPARATOR} is a legacy space-joined bag without alias boundaries.
|
|
34
|
+
* For such a bag, the function checks word-bounded containment only when no candidate matched strictly.
|
|
35
|
+
*
|
|
36
|
+
* Containment by itself would promote fragments such as "York" inside "New York City".
|
|
37
|
+
*
|
|
38
|
+
* @param altNames The `alt_names` bag from `place_search`, or null when the row has no aliases.
|
|
39
|
+
* @param normalizedQuery The query folded by {@link foldQueryText}.
|
|
40
|
+
* @param anyStrictExact Whether any candidate already matched on its canonical name or region abbreviation.
|
|
41
|
+
* Only legacy bags use it.
|
|
42
|
+
*/
|
|
43
|
+
export declare function aliasBagExactMatch(altNames: string | null, normalizedQuery: string, anyStrictExact: boolean): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* The name of the R*Tree virtual table that indexes WOF place bounding boxes for bbox and proximity lookups.
|
|
46
|
+
*/
|
|
47
|
+
export declare const PLACE_BBOX_TABLE = "place_bbox";
|
|
48
|
+
/**
|
|
49
|
+
* The name of the sparse table that stores `wof:population` per place.
|
|
50
|
+
*
|
|
51
|
+
* The lookup uses this value to apply the population ranking boost.
|
|
52
|
+
*
|
|
53
|
+
* A place without a row gets no boost and no penalty.
|
|
54
|
+
*/
|
|
55
|
+
export declare const PLACE_POPULATION_TABLE = "place_population";
|
|
56
|
+
/**
|
|
57
|
+
* The name of the table of per-place `referential` and `encyclopedic` scores,
|
|
58
|
+
* built by `mailwoman gazetteer importance`.
|
|
59
|
+
*
|
|
60
|
+
* The lookup copies `encyclopedic` onto results without ranking by it.
|
|
61
|
+
* It refuses to read an older table with a single `importance` column.
|
|
62
|
+
*/
|
|
63
|
+
export declare const PLACE_IMPORTANCE_TABLE = "place_importance";
|
|
64
|
+
/**
|
|
65
|
+
* The indexes a {@link buildPlaceSearchFTS} run built and their row counts.
|
|
66
|
+
*/
|
|
67
|
+
export interface BuildPlaceSearchFTSResult {
|
|
68
|
+
/**
|
|
69
|
+
* Whether this call built the FTS5 index.
|
|
70
|
+
* It is false when an existing index was kept.
|
|
71
|
+
*/
|
|
72
|
+
created: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* The row count of the `place_search` table after the call.
|
|
75
|
+
*/
|
|
76
|
+
indexedRows: number;
|
|
77
|
+
/**
|
|
78
|
+
* Whether this call built the R*Tree bbox index.
|
|
79
|
+
* It is false when an existing index was kept.
|
|
80
|
+
*/
|
|
81
|
+
bboxCreated: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* The row count of the `place_bbox` R*Tree after the call.
|
|
84
|
+
*/
|
|
85
|
+
bboxIndexedRows: number;
|
|
86
|
+
/**
|
|
87
|
+
* The wall-clock duration of the whole build in milliseconds.
|
|
88
|
+
*/
|
|
89
|
+
durationMs: number;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Options for {@link buildPlaceSearchFTS}.
|
|
93
|
+
*/
|
|
94
|
+
export interface BuildPlaceSearchFTSOpts {
|
|
95
|
+
/**
|
|
96
|
+
* Whether to drop and rebuild existing `place_search` and `place_bbox` tables,
|
|
97
|
+
* such as after an `spr` or `names` update.
|
|
98
|
+
* By default an existing index is kept.
|
|
99
|
+
*/
|
|
100
|
+
drop?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Receives each build phase as it begins.
|
|
103
|
+
* A planet-scale build takes minutes to populate.
|
|
104
|
+
*/
|
|
105
|
+
onProgress?: (phase: "checking" | "dropping" | "creating" | "populating" | "creating-bbox" | "populating-bbox" | "done", detail?: string) => void;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Builds the `place_search` FTS5 table and the `place_bbox` R*Tree from a WOF
|
|
109
|
+
* database's `spr` and `names` tables.
|
|
110
|
+
*
|
|
111
|
+
* Without `drop: true`, an existing index is kept.
|
|
112
|
+
*/
|
|
113
|
+
export declare function buildPlaceSearchFTS<DB>(db: DatabaseClient<DB>, opts?: BuildPlaceSearchFTSOpts): BuildPlaceSearchFTSResult;
|
|
114
|
+
/**
|
|
115
|
+
* Returns whether the connected database has the `place_search` FTS table.
|
|
116
|
+
*/
|
|
117
|
+
export declare function placeSearchFTSExists<DB>(db: DatabaseClient<DB>): boolean;
|
|
118
|
+
/**
|
|
119
|
+
* Returns whether the connected database has the `place_bbox` R*Tree table.
|
|
120
|
+
*/
|
|
121
|
+
export declare function placeBboxExists<DB>(db: DatabaseClient<DB>): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Returns whether the connected database has the `place_population` table.
|
|
124
|
+
*/
|
|
125
|
+
export declare function placePopulationExists<DB>(db: DatabaseClient<DB>): boolean;
|
|
126
|
+
//# sourceMappingURL=fts.d.ts.map
|
package/out/fts.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../lib/fts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAG9D;;GAEG;AACH,eAAO,MAAM,kBAAkB,iBAAiB,CAAA;AAEhD;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,WAAW,CAAA;AAIvC;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,OAAO,CAUrH;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,eAAe,CAAA;AAE5C;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAA;AAExD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAA;AAExD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACzC;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAA;IAEhB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAA;IAEpB;;OAEG;IACH,eAAe,EAAE,MAAM,CAAA;IAEvB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;OAGG;IACH,UAAU,CAAC,EAAE,CACZ,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,eAAe,GAAG,iBAAiB,GAAG,MAAM,EACzG,MAAM,CAAC,EAAE,MAAM,KACX,IAAI,CAAA;CACT;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EACrC,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,EACtB,IAAI,GAAE,uBAA4B,GAChC,yBAAyB,CA6G3B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,OAAO,CAExE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,OAAO,CAEnE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,OAAO,CAEzE"}
|
package/out/fts.js
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*/
|
|
6
|
+
import { tableExists } from "@mailwoman/sqlite/introspection";
|
|
7
|
+
/**
|
|
8
|
+
* The name of the FTS5 virtual table that indexes WOF place names for `match` queries.
|
|
9
|
+
*/
|
|
10
|
+
export const PLACE_SEARCH_TABLE = "place_search";
|
|
11
|
+
/**
|
|
12
|
+
* The separator between aliases in the `alt_names` bag.
|
|
13
|
+
* It stops a phrase query from matching across two aliases.
|
|
14
|
+
*
|
|
15
|
+
* FTS5 assigns positions only to tokens.
|
|
16
|
+
* Spaces and punctuation are not tokens and would leave the aliases adjacent,
|
|
17
|
+
* but unicode61 indexes the Private Use Area codepoint U+E000 as a token.
|
|
18
|
+
*
|
|
19
|
+
* Query sanitizers strip this character, so no user query can match the separator.
|
|
20
|
+
*/
|
|
21
|
+
export const ALIAS_SEPARATOR = "\uE000";
|
|
22
|
+
const ALIAS_SEPARATOR_CODEPOINT = ALIAS_SEPARATOR.codePointAt(0);
|
|
23
|
+
/**
|
|
24
|
+
* Folds a query or name for exact-tier comparison by lowercasing, trimming
|
|
25
|
+
* and collapsing internal whitespace.
|
|
26
|
+
*
|
|
27
|
+
* Every exact-tier consumer uses this function, so its output compares equal to
|
|
28
|
+
* the aliases that {@link aliasBagExactMatch} parses.
|
|
29
|
+
*/
|
|
30
|
+
export function foldQueryText(input) {
|
|
31
|
+
return input.toLowerCase().trim().replaceAll(/\s+/g, " ");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Returns whether any alias in an `alt_names` bag exactly equals the folded query.
|
|
35
|
+
*
|
|
36
|
+
* A bag without {@link ALIAS_SEPARATOR} is a legacy space-joined bag without alias boundaries.
|
|
37
|
+
* For such a bag, the function checks word-bounded containment only when no candidate matched strictly.
|
|
38
|
+
*
|
|
39
|
+
* Containment by itself would promote fragments such as "York" inside "New York City".
|
|
40
|
+
*
|
|
41
|
+
* @param altNames The `alt_names` bag from `place_search`, or null when the row has no aliases.
|
|
42
|
+
* @param normalizedQuery The query folded by {@link foldQueryText}.
|
|
43
|
+
* @param anyStrictExact Whether any candidate already matched on its canonical name or region abbreviation.
|
|
44
|
+
* Only legacy bags use it.
|
|
45
|
+
*/
|
|
46
|
+
export function aliasBagExactMatch(altNames, normalizedQuery, anyStrictExact) {
|
|
47
|
+
if (altNames === null || altNames === "" || !normalizedQuery)
|
|
48
|
+
return false;
|
|
49
|
+
if (altNames.includes(ALIAS_SEPARATOR)) {
|
|
50
|
+
return altNames.split(ALIAS_SEPARATOR).some((alias) => foldQueryText(alias) === normalizedQuery);
|
|
51
|
+
}
|
|
52
|
+
if (anyStrictExact)
|
|
53
|
+
return false;
|
|
54
|
+
return ` ${foldQueryText(altNames)} `.includes(` ${normalizedQuery} `);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The name of the R*Tree virtual table that indexes WOF place bounding boxes for bbox and proximity lookups.
|
|
58
|
+
*/
|
|
59
|
+
export const PLACE_BBOX_TABLE = "place_bbox";
|
|
60
|
+
/**
|
|
61
|
+
* The name of the sparse table that stores `wof:population` per place.
|
|
62
|
+
*
|
|
63
|
+
* The lookup uses this value to apply the population ranking boost.
|
|
64
|
+
*
|
|
65
|
+
* A place without a row gets no boost and no penalty.
|
|
66
|
+
*/
|
|
67
|
+
export const PLACE_POPULATION_TABLE = "place_population";
|
|
68
|
+
/**
|
|
69
|
+
* The name of the table of per-place `referential` and `encyclopedic` scores,
|
|
70
|
+
* built by `mailwoman gazetteer importance`.
|
|
71
|
+
*
|
|
72
|
+
* The lookup copies `encyclopedic` onto results without ranking by it.
|
|
73
|
+
* It refuses to read an older table with a single `importance` column.
|
|
74
|
+
*/
|
|
75
|
+
export const PLACE_IMPORTANCE_TABLE = "place_importance";
|
|
76
|
+
/**
|
|
77
|
+
* Builds the `place_search` FTS5 table and the `place_bbox` R*Tree from a WOF
|
|
78
|
+
* database's `spr` and `names` tables.
|
|
79
|
+
*
|
|
80
|
+
* Without `drop: true`, an existing index is kept.
|
|
81
|
+
*/
|
|
82
|
+
export function buildPlaceSearchFTS(db, opts = {}) {
|
|
83
|
+
const start = Date.now();
|
|
84
|
+
const onProgress = opts.onProgress ?? (() => { });
|
|
85
|
+
onProgress("checking");
|
|
86
|
+
const ftsExisting = tableExists(db, PLACE_SEARCH_TABLE);
|
|
87
|
+
const bboxExisting = tableExists(db, PLACE_BBOX_TABLE);
|
|
88
|
+
let ftsCreated = false;
|
|
89
|
+
if (ftsExisting && opts.drop) {
|
|
90
|
+
onProgress("dropping", PLACE_SEARCH_TABLE);
|
|
91
|
+
db.exec(`DROP TABLE ${PLACE_SEARCH_TABLE}`);
|
|
92
|
+
}
|
|
93
|
+
if (!ftsExisting || opts.drop) {
|
|
94
|
+
onProgress("creating");
|
|
95
|
+
db.exec(`
|
|
96
|
+
CREATE VIRTUAL TABLE ${PLACE_SEARCH_TABLE} USING fts5(
|
|
97
|
+
wof_id UNINDEXED,
|
|
98
|
+
name,
|
|
99
|
+
alt_names,
|
|
100
|
+
tokenize = 'unicode61 remove_diacritics 2'
|
|
101
|
+
);
|
|
102
|
+
`);
|
|
103
|
+
onProgress("populating");
|
|
104
|
+
db.exec(`
|
|
105
|
+
INSERT INTO ${PLACE_SEARCH_TABLE} (wof_id, name, alt_names)
|
|
106
|
+
SELECT
|
|
107
|
+
spr.id,
|
|
108
|
+
spr.name,
|
|
109
|
+
COALESCE((
|
|
110
|
+
SELECT GROUP_CONCAT(
|
|
111
|
+
REPLACE(name, char(${ALIAS_SEPARATOR_CODEPOINT}), ' '),
|
|
112
|
+
' ' || char(${ALIAS_SEPARATOR_CODEPOINT}) || ' '
|
|
113
|
+
) || ' ' || char(${ALIAS_SEPARATOR_CODEPOINT})
|
|
114
|
+
FROM names WHERE names.id = spr.id
|
|
115
|
+
), '')
|
|
116
|
+
FROM spr
|
|
117
|
+
WHERE spr.is_current != 0
|
|
118
|
+
AND spr.is_deprecated = 0
|
|
119
|
+
AND spr.name IS NOT NULL;
|
|
120
|
+
`);
|
|
121
|
+
ftsCreated = true;
|
|
122
|
+
}
|
|
123
|
+
const ftsCountRow = db.prepare(`SELECT COUNT(*) AS n FROM ${PLACE_SEARCH_TABLE}`).get();
|
|
124
|
+
let bboxCreated = false;
|
|
125
|
+
if (bboxExisting && opts.drop) {
|
|
126
|
+
onProgress("dropping", PLACE_BBOX_TABLE);
|
|
127
|
+
db.exec(`DROP TABLE ${PLACE_BBOX_TABLE}`);
|
|
128
|
+
}
|
|
129
|
+
if (!bboxExisting || opts.drop) {
|
|
130
|
+
onProgress("creating-bbox");
|
|
131
|
+
db.exec(`
|
|
132
|
+
CREATE VIRTUAL TABLE ${PLACE_BBOX_TABLE} USING rtree(
|
|
133
|
+
id,
|
|
134
|
+
min_lat, max_lat,
|
|
135
|
+
min_lon, max_lon
|
|
136
|
+
);
|
|
137
|
+
`);
|
|
138
|
+
onProgress("populating-bbox");
|
|
139
|
+
db.exec(`
|
|
140
|
+
INSERT INTO ${PLACE_BBOX_TABLE} (id, min_lat, max_lat, min_lon, max_lon)
|
|
141
|
+
SELECT
|
|
142
|
+
spr.id,
|
|
143
|
+
spr.min_latitude,
|
|
144
|
+
spr.max_latitude,
|
|
145
|
+
spr.min_longitude,
|
|
146
|
+
spr.max_longitude
|
|
147
|
+
FROM spr
|
|
148
|
+
WHERE spr.is_current != 0
|
|
149
|
+
AND spr.is_deprecated = 0
|
|
150
|
+
AND spr.min_latitude IS NOT NULL
|
|
151
|
+
AND spr.max_latitude IS NOT NULL
|
|
152
|
+
AND spr.min_longitude IS NOT NULL
|
|
153
|
+
AND spr.max_longitude IS NOT NULL
|
|
154
|
+
AND NOT (spr.min_latitude = 0 AND spr.max_latitude = 0
|
|
155
|
+
AND spr.min_longitude = 0 AND spr.max_longitude = 0);
|
|
156
|
+
`);
|
|
157
|
+
bboxCreated = true;
|
|
158
|
+
}
|
|
159
|
+
const bboxCountRow = db.prepare(`SELECT COUNT(*) AS n FROM ${PLACE_BBOX_TABLE}`).get();
|
|
160
|
+
onProgress("done", `${ftsCountRow.n} FTS rows + ${bboxCountRow.n} bbox rows ` +
|
|
161
|
+
`(${ftsCreated ? "built" : "preexisting"} / ${bboxCreated ? "built" : "preexisting"})`);
|
|
162
|
+
return {
|
|
163
|
+
created: ftsCreated,
|
|
164
|
+
indexedRows: ftsCountRow.n,
|
|
165
|
+
bboxCreated,
|
|
166
|
+
bboxIndexedRows: bboxCountRow.n,
|
|
167
|
+
durationMs: Date.now() - start,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Returns whether the connected database has the `place_search` FTS table.
|
|
172
|
+
*/
|
|
173
|
+
export function placeSearchFTSExists(db) {
|
|
174
|
+
return tableExists(db, PLACE_SEARCH_TABLE);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Returns whether the connected database has the `place_bbox` R*Tree table.
|
|
178
|
+
*/
|
|
179
|
+
export function placeBboxExists(db) {
|
|
180
|
+
return tableExists(db, PLACE_BBOX_TABLE);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Returns whether the connected database has the `place_population` table.
|
|
184
|
+
*/
|
|
185
|
+
export function placePopulationExists(db) {
|
|
186
|
+
return tableExists(db, PLACE_POPULATION_TABLE);
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=fts.js.map
|
package/out/fts.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fts.js","sourceRoot":"","sources":["../lib/fts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAE7D;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,cAAc,CAAA;AAEhD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAA;AAEvC,MAAM,yBAAyB,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC,CAAW,CAAA;AAE1E;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IAC1C,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAC1D,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAuB,EAAE,eAAuB,EAAE,cAAuB;IAC3G,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,EAAE,IAAI,CAAC,eAAe;QAAE,OAAO,KAAK,CAAA;IAE1E,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACxC,OAAO,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,eAAe,CAAC,CAAA;IACjG,CAAC;IAED,IAAI,cAAc;QAAE,OAAO,KAAK,CAAA;IAEhC,OAAO,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,eAAe,GAAG,CAAC,CAAA;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAA;AAE5C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CAAA;AAExD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CAAA;AAuDxD;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAClC,EAAsB,EACtB,IAAI,GAA4B,EAAE;IAElC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACxB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAEhD,UAAU,CAAC,UAAU,CAAC,CAAA;IACtB,MAAM,WAAW,GAAG,WAAW,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAA;IACvD,MAAM,YAAY,GAAG,WAAW,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAA;IAEtD,IAAI,UAAU,GAAG,KAAK,CAAA;IAEtB,IAAI,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,UAAU,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;QAC1C,EAAE,CAAC,IAAI,CAAC,cAAc,kBAAkB,EAAE,CAAC,CAAA;IAC5C,CAAC;IAED,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,UAAU,CAAC,UAAU,CAAC,CAAA;QAEtB,EAAE,CAAC,IAAI,CAAC;0BACgB,kBAAkB;;;;;;GAMzC,CAAC,CAAA;QAEF,UAAU,CAAC,YAAY,CAAC,CAAA;QAExB,EAAE,CAAC,IAAI,CAAC;iBACO,kBAAkB;;;;;;2BAMR,yBAAyB;oBAChC,yBAAyB;wBACrB,yBAAyB;;;;;;;GAO9C,CAAC,CAAA;QAEF,UAAU,GAAG,IAAI,CAAA;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,6BAA6B,kBAAkB,EAAE,CAAC,CAAC,GAAG,EAAmB,CAAA;IAExG,IAAI,WAAW,GAAG,KAAK,CAAA;IAEvB,IAAI,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAA;QACxC,EAAE,CAAC,IAAI,CAAC,cAAc,gBAAgB,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,UAAU,CAAC,eAAe,CAAC,CAAA;QAE3B,EAAE,CAAC,IAAI,CAAC;0BACgB,gBAAgB;;;;;GAKvC,CAAC,CAAA;QAEF,UAAU,CAAC,iBAAiB,CAAC,CAAA;QAE7B,EAAE,CAAC,IAAI,CAAC;iBACO,gBAAgB;;;;;;;;;;;;;;;;GAgB9B,CAAC,CAAA;QAEF,WAAW,GAAG,IAAI,CAAA;IACnB,CAAC;IAED,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAAC,6BAA6B,gBAAgB,EAAE,CAAC,CAAC,GAAG,EAAmB,CAAA;IAEvG,UAAU,CACT,MAAM,EACN,GAAG,WAAW,CAAC,CAAC,eAAe,YAAY,CAAC,CAAC,aAAa;QACzD,IAAI,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,MAAM,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,GAAG,CACvF,CAAA;IAED,OAAO;QACN,OAAO,EAAE,UAAU;QACnB,WAAW,EAAE,WAAW,CAAC,CAAC;QAC1B,WAAW;QACX,eAAe,EAAE,YAAY,CAAC,CAAC;QAC/B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC9B,CAAA;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAK,EAAsB;IAC9D,OAAO,WAAW,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAA;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAK,EAAsB;IACzD,OAAO,WAAW,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAA;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAK,EAAsB;IAC/D,OAAO,WAAW,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAA;AAC/C,CAAC"}
|
|
@@ -2,99 +2,58 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
*
|
|
6
|
-
* #743/#193 — fold GeoNames bilingual / alt-language place-names into a WOF/unified admin DB as
|
|
7
|
-
* first-class places. The hard-filter recall gap on bilingual countries (the address says
|
|
8
|
-
* "Karjaa" but the table holds the Swedish "Karis") is missing alt-LANGUAGE names, not missing
|
|
9
|
-
* places: the WOF/Overture `names` carried only the primary, so the candidate build's Latin-alias
|
|
10
|
-
* explode (build-candidate pass 2) had nothing to widen. GeoNames' per-country dump carries the
|
|
11
|
-
* variants inline (the Karis row's `alternatenames` includes "Karjaa").
|
|
12
|
-
*
|
|
13
|
-
* For each POPULATED place (feature class `P`) this writes an `spr` row + `names` rows (primary +
|
|
14
|
-
* Latin alt-names) + population into the SAME tables the WOF/Overture paths use — synthetic ids
|
|
15
|
-
* based at {@link GEONAMES_ID_BASE} so the three sources never collide. The caller then rebuilds
|
|
16
|
-
* `place_search` ({@link buildPlaceSearchFTS} with `drop: true`) so the candidate build carries
|
|
17
|
-
* Karjaa↔Karis. Proven (FI hard-resolve 69.5 → 85.8 %, coverage 74.4 → 94.0 %); duplicating a
|
|
18
|
-
* place already held under another source is benign — the rows share name_key+coord and the
|
|
19
|
-
* candidate ranking dedupes by score.
|
|
20
|
-
*
|
|
21
|
-
* This is the package home so the canonical `build-unified-wof --geonames-countries`, the
|
|
22
|
-
* pipeline fold (`gazetteer-pipeline/admin/fold-geonames`), AND the `mailwoman gazetteer` commands all share
|
|
23
|
-
* ONE implementation. GeoNames dump = `download.geonames.org/export/dump/<CC>.zip` → `<CC>.txt`
|
|
24
|
-
* (TSV).
|
|
25
5
|
*/
|
|
26
6
|
import type { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
27
7
|
import { type PathBuilderLike } from "path-ts";
|
|
28
8
|
import type { WOFDatabase } from "#schema";
|
|
29
9
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*/
|
|
33
|
-
export declare const GEONAMES_ID_BASE = 9000000000000;
|
|
34
|
-
/**
|
|
35
|
-
* Clear everything the alias fold owns — `[GEONAMES_ID_BASE, GEONAMES_POSTAL_ID_BASE)` across {@link
|
|
36
|
-
* FOLD_OWNED_TABLES}
|
|
37
|
-
* — so a fold's output is a function of its country list and dumps ALONE, never of what the DB happened to hold first.
|
|
38
|
-
* Returns the rows removed per table.
|
|
39
|
-
*
|
|
40
|
-
* This exists because the synthetic id is a POSITION (`GEONAMES_ID_BASE + n`, counted across the country list in
|
|
41
|
-
* order), not a derivation from the geonameid: change the list, its order, or a dump's contents and every subsequent id
|
|
42
|
-
* shifts. Without the purge, a second fold overwrote the `spr` PREFIX it reached (`INSERT OR REPLACE`) while its
|
|
43
|
-
* `names`/`ancestors` rows merely appended (bare `INSERT`) and `place_population` skipped unpopulated places entirely —
|
|
44
|
-
* so the previous run's names, ancestry and populations stayed bound to ids now describing other places.
|
|
10
|
+
* Deletes every row the GeoNames alias fold owns, with ids in
|
|
11
|
+
* `[GEONAMES_ID_BASE, GEONAMES_POSTAL_ID_BASE)`, and returns the count removed per table.
|
|
45
12
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* population landed on a Lithuanian hamlet.
|
|
50
|
-
*
|
|
51
|
-
* The upper bound is NOT the end of the id space. Each later extract owns a range above this one — GeoNames-postal @
|
|
52
|
-
* 9.5e12, NL-PC6 @ 9.6e12, Code-Point @ 9.7e12, NI @ 9.8e12 — and a purge that ran past {@link GEONAMES_POSTAL_ID_BASE}
|
|
53
|
-
* would delete them.
|
|
13
|
+
* Fold ids are assigned sequentially, so a re-fold without this purge would attach
|
|
14
|
+
* stale names, ancestors and populations to other places.
|
|
15
|
+
* The upper bound leaves the postal and postcode id ranges above it untouched.
|
|
54
16
|
*/
|
|
55
17
|
export declare function purgeGeonamesAliasRange<DB>(db: DatabaseClient<DB>): Record<string, number>;
|
|
56
18
|
/**
|
|
57
|
-
*
|
|
19
|
+
* One progress event per country dump that the ingest processed or skipped.
|
|
58
20
|
*/
|
|
59
21
|
export interface GeonamesIngestProgress {
|
|
60
22
|
/**
|
|
61
|
-
* ISO 3166-1 alpha-2 code.
|
|
23
|
+
* The ISO 3166-1 alpha-2 country code.
|
|
62
24
|
*/
|
|
63
25
|
country: string;
|
|
64
26
|
/**
|
|
65
|
-
*
|
|
27
|
+
* The number of populated places ingested from this country's dump, or 0 when it was skipped.
|
|
66
28
|
*/
|
|
67
29
|
places: number;
|
|
68
30
|
/**
|
|
69
|
-
*
|
|
31
|
+
* Whether the country's `<CC>.txt` dump was missing.
|
|
32
|
+
*
|
|
33
|
+
* A missing dump skips the country without failing the ingest.
|
|
70
34
|
*/
|
|
71
35
|
skipped: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* The number of alternate names that the alias filter rejected.
|
|
38
|
+
*
|
|
39
|
+
* It distinguishes a sparse source from aliases that the fold discarded.
|
|
40
|
+
*/
|
|
41
|
+
aliasesRefused?: number;
|
|
72
42
|
}
|
|
73
43
|
/**
|
|
74
|
-
*
|
|
75
|
-
|
|
44
|
+
* Formats a GeoNames fold progress event as one log line.
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatGeonamesIngestProgress(event: GeonamesIngestProgress, missingFile?: PathBuilderLike): string;
|
|
47
|
+
/**
|
|
48
|
+
* Purges the fold's id range, then adds GeoNames `P`-class places and their
|
|
49
|
+
* alternate names for `countries` to `db`.
|
|
50
|
+
* It returns the number of places ingested.
|
|
76
51
|
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* the candidate build's alias pass.
|
|
52
|
+
* The caller must then rebuild `place_search` with `buildPlaceSearchFTS(db, { drop: true })`
|
|
53
|
+
* to make the new names searchable.
|
|
80
54
|
*/
|
|
81
55
|
export declare function ingestGeonamesAliases(db: DatabaseClient<WOFDatabase>, countries: string[], geonamesDir: PathBuilderLike, onProgress?: (event: GeonamesIngestProgress) => void, opts?: {
|
|
82
|
-
/**
|
|
83
|
-
* #267: the countries for which to ALSO fold the GeoNames A-class admin (PCLI country + ADM1 regions) and link each
|
|
84
|
-
* locality's `parent_id` + ancestry chain (locality → region → country). PER-COUNTRY because a country that already
|
|
85
|
-
* carries WOF admin would double up — pass only the ZERO-COVERAGE gap countries (the coverage-expansion targets),
|
|
86
|
-
* never the EU alias set. Without admin, a gap country's localities are orphans (`parent_id=-1`, no ancestors), so
|
|
87
|
-
* `parentID` scoping and adminCoherence can't reach them and "Tbilisi, GE" can't resolve.
|
|
88
|
-
*/
|
|
89
56
|
adminForCountries?: ReadonlySet<string>;
|
|
90
|
-
/**
|
|
91
|
-
* #936: directory of per-country alternateNamesV2 dumps
|
|
92
|
-
* (`download.geonames.org/export/dump/alternatenames/<CC>.zip` → `<CC>.txt`). When a country's file is present,
|
|
93
|
-
* alias rows gain their language tag, `privateuse` ("preferred" from `isPreferredName`), and the `official` bit
|
|
94
|
-
* (language is CLDR-official for the country, colloquial/historic excluded — the rule the #936 risk probe measured
|
|
95
|
-
* at 7 new name-exact collisions globally). The main dump's bare `alternatenames` list still decides WHICH rows
|
|
96
|
-
* exist; V2 only decorates them. Missing file = the pre-#936 untagged behavior, not an error.
|
|
97
|
-
*/
|
|
98
57
|
alternateDir?: PathBuilderLike;
|
|
99
58
|
}): Promise<number>;
|
|
100
59
|
//# sourceMappingURL=aliases.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../lib/geonames/aliases.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../lib/geonames/aliases.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,SAAS,CAAA;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAI1C;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY1F;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IAEd;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAA;IAEhB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,sBAAsB,EAAE,WAAW,CAAC,EAAE,eAAe,GAAG,MAAM,CAMjH;AAgED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAC1C,EAAE,EAAE,cAAc,CAAC,WAAW,CAAC,EAC/B,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,eAAe,EAC5B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,EACpD,IAAI,CAAC,EAAE;IACN,iBAAiB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAEvC,YAAY,CAAC,EAAE,eAAe,CAAA;CAC9B,GACC,OAAO,CAAC,MAAM,CAAC,CAyLjB"}
|