@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
package/out/extracts.d.ts
CHANGED
|
@@ -1,33 +1,29 @@
|
|
|
1
|
+
import { type PathBuilderLike } from "path-ts";
|
|
1
2
|
/**
|
|
2
3
|
* @copyright Sister Software
|
|
3
4
|
* @license AGPL-3.0
|
|
4
5
|
* @author Teffen Ellis, et al.
|
|
5
6
|
*
|
|
6
|
-
* Multi-extract support for `WOFSQLitePlaceLookup
|
|
7
|
-
* connection
|
|
7
|
+
* Multi-extract support for `WOFSQLitePlaceLookup`. It opens multiple WOF SQLite distributions
|
|
8
|
+
* on one connection with `attach database`. It routes queries by placetype.
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* The naive `SELECT … FROM pc.place_search WHERE pc.place_search MATCH ?` fails — SQLite parses the
|
|
12
|
-
* schema-qualified table on the left of MATCH as "column place_search of table pc". Discovered in
|
|
13
|
-
* the spike at PR review time; documented as `_EXTRACT_RULE.md` should it ever bite again.
|
|
14
|
-
*
|
|
15
|
-
* The working form: schema-qualified in FROM, bare table name in MATCH:
|
|
10
|
+
* SQLite parses a schema-qualified table on the left of `match` as "column place_search of table
|
|
11
|
+
* pc", so the working form is schema-qualified in `from` and a bare table name in `match`:
|
|
16
12
|
*
|
|
17
13
|
* ```sql
|
|
18
|
-
*
|
|
14
|
+
* select … from pc.place_search where place_search match ?
|
|
19
15
|
* ```
|
|
20
16
|
*
|
|
21
|
-
* Identical table names across attached extracts
|
|
22
|
-
*
|
|
23
|
-
* scope.
|
|
17
|
+
* Identical table names across attached extracts are fine, because the bare-name `match` resolves
|
|
18
|
+
* against `from` scope. Every extract ships its own `place_search` and `place_bbox`.
|
|
24
19
|
*/
|
|
25
20
|
/**
|
|
26
|
-
* Derive a SQL-safe schema name from a WOF distribution filename.
|
|
27
|
-
* gets a stable, predictable handle.
|
|
21
|
+
* Derive a SQL-safe schema name from a WOF distribution filename.
|
|
28
22
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
23
|
+
* Used by `attach database … AS <name>` so each extract gets a stable, predictable handle.
|
|
24
|
+
*
|
|
25
|
+
* Convention strips the `whosonfirst-data-` prefix and the `-latest.db` (or just `.db`)
|
|
26
|
+
* suffix, then replaces `-` with `_` for SQL identifier safety.
|
|
31
27
|
*
|
|
32
28
|
* Examples:
|
|
33
29
|
*
|
|
@@ -36,32 +32,42 @@
|
|
|
36
32
|
* - `whosonfirst-data-admin-latest.db` → `admin`
|
|
37
33
|
* - `my-custom.db` → `my_custom`
|
|
38
34
|
*
|
|
39
|
-
* Callers can override the derived name explicitly via `ExtractConfig.schemaName`
|
|
40
|
-
* convention.
|
|
35
|
+
* Callers can override the derived name explicitly via `ExtractConfig.schemaName`
|
|
36
|
+
* when the filename doesn't follow WOF convention.
|
|
41
37
|
*/
|
|
42
|
-
export declare function deriveSchemaName(path:
|
|
38
|
+
export declare function deriveSchemaName(path: PathBuilderLike): string;
|
|
43
39
|
/**
|
|
44
|
-
* Per-extract configuration.
|
|
45
|
-
*
|
|
46
|
-
*
|
|
40
|
+
* Per-extract configuration.
|
|
41
|
+
*
|
|
42
|
+
* The simple form is just a path string.
|
|
43
|
+
* The schema name is derived from it.
|
|
44
|
+
*
|
|
45
|
+
* The object form lets callers override the derived schema name (useful when a filename
|
|
46
|
+
* doesn't follow WOF convention) or attach an extra hint about which placetypes route here.
|
|
47
47
|
*/
|
|
48
48
|
export interface ExtractConfig {
|
|
49
|
-
path:
|
|
49
|
+
path: PathBuilderLike;
|
|
50
50
|
/**
|
|
51
|
-
* Override the auto-derived schema name.
|
|
52
|
-
*
|
|
51
|
+
* Override the auto-derived schema name.
|
|
52
|
+
*
|
|
53
|
+
* Useful when the filename does not match WOF convention or when you want a memorable handle.
|
|
54
|
+
* Must be a valid SQLite identifier matching `[a-zA-Z_][a-zA-Z0-9_]*`.
|
|
53
55
|
*/
|
|
54
56
|
schemaName?: string;
|
|
55
57
|
/**
|
|
56
|
-
* Optional explicit list of placetypes this extract serves.
|
|
57
|
-
*
|
|
58
|
-
*
|
|
58
|
+
* Optional explicit list of placetypes this extract serves.
|
|
59
|
+
*
|
|
60
|
+
* When set, queries against any listed placetype are routed to this extract.
|
|
61
|
+
* When omitted, routing falls back to a name-match heuristic: an extract whose `schemaName`
|
|
62
|
+
* contains the placetype as a substring (e.g. `postalcode_us` for `postalcode` queries)
|
|
63
|
+
* is preferred for that placetype.
|
|
59
64
|
*/
|
|
60
65
|
placetypes?: readonly string[];
|
|
61
66
|
}
|
|
62
67
|
/**
|
|
63
|
-
* Resolved post-derivation: paired path + chosen schema name + (possibly empty) placetypes hint.
|
|
64
|
-
*
|
|
68
|
+
* Resolved post-derivation: paired path + chosen schema name + (possibly empty) placetypes hint.
|
|
69
|
+
*
|
|
70
|
+
* Used internally by `WOFSQLitePlaceLookup` so the routing logic operates on uniform structures.
|
|
65
71
|
*/
|
|
66
72
|
export interface ResolvedExtract {
|
|
67
73
|
path: string;
|
|
@@ -69,41 +75,46 @@ export interface ResolvedExtract {
|
|
|
69
75
|
placetypes: readonly string[];
|
|
70
76
|
}
|
|
71
77
|
/**
|
|
72
|
-
* Normalize the user-provided `databasePath` opt (which may be a single string, an array
|
|
73
|
-
* `ExtractConfig` objects) into a uniform `ResolvedExtract[]`.
|
|
78
|
+
* Normalize the user-provided `databasePath` opt (which may be a single string, an array
|
|
79
|
+
* of strings, or an array of `ExtractConfig` objects) into a uniform `ResolvedExtract[]`.
|
|
74
80
|
*
|
|
75
|
-
* The first extract becomes `main` regardless of its derived schema name
|
|
76
|
-
* extracts keep their derived
|
|
81
|
+
* The first extract becomes `main` regardless of its derived schema name, following SQLite convention.
|
|
82
|
+
* Subsequent extracts keep their derived or overridden schema name.
|
|
77
83
|
*/
|
|
78
|
-
export declare function resolveExtracts(input:
|
|
84
|
+
export declare function resolveExtracts(input: PathBuilderLike | ReadonlyArray<PathBuilderLike | ExtractConfig>): ResolvedExtract[];
|
|
85
|
+
/**
|
|
86
|
+
* All placetype-matching extracts, in routing order (the country-aware pick chooses among these).
|
|
87
|
+
*
|
|
88
|
+
* Used by the bias path: a country-less postcode query with proximity hints fans out across
|
|
89
|
+
* every matching extract and merges, because single-extract routing would hide the cross-country
|
|
90
|
+
* ambiguity the hints exist to resolve ("48026" lives in postalcode-us and postalcode-intl).
|
|
91
|
+
*/
|
|
92
|
+
export declare function pickExtractsForPlacetype(extracts: ResolvedExtract[], placetype: string | undefined): ResolvedExtract[];
|
|
79
93
|
/**
|
|
80
94
|
* Pick the extract to route a query to given the requested placetype(s).
|
|
81
95
|
*
|
|
82
|
-
*
|
|
96
|
+
* The resolver applies these routing rules in order:
|
|
83
97
|
*
|
|
84
98
|
* 1. If any extract has explicit `placetypes` that includes the requested placetype, use it.
|
|
85
|
-
* 2. Otherwise, if a non-main extract's `schemaName` matches the placetype
|
|
86
|
-
* use it.
|
|
99
|
+
* 2. Otherwise, if a non-main extract's `schemaName` matches the placetype
|
|
100
|
+
* (e.g. `postalcode_us` matches `postalcode`), use it.
|
|
87
101
|
* 3. Otherwise, fall back to `main`.
|
|
88
102
|
*
|
|
89
|
-
* This deliberately
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
* All placetype-matching extracts, in routing order (the country-aware pick chooses among these). Used by the bias
|
|
95
|
-
* path: a country-less postcode query with proximity hints fans out across every matching extract and merges, because
|
|
96
|
-
* single-extract routing would hide the cross-country ambiguity the hints exist to resolve ("48026" lives in
|
|
97
|
-
* postalcode-us AND postalcode-intl).
|
|
103
|
+
* This deliberately does not union across extracts.
|
|
104
|
+
* BM25 scores are not comparable across separately indexed corpora.
|
|
105
|
+
* A typical mailwoman query has one placetype.
|
|
106
|
+
*
|
|
107
|
+
* Callers that need cross-extract results can issue two `findPlace` calls.
|
|
98
108
|
*/
|
|
99
|
-
export declare function
|
|
100
|
-
export declare function pickExtractForPlacetype(extracts: ResolvedExtract[], placetype: string | undefined, opts?: {
|
|
109
|
+
export declare function pickExtractForPlacetype(extracts: ResolvedExtract[], placetype: string | null, opts?: {
|
|
101
110
|
/**
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
111
|
+
* The query's country constraint, when the caller has one.
|
|
112
|
+
*
|
|
113
|
+
* When `country` is given and a matching extract's probed country set contains it, that extract wins.
|
|
114
|
+
* Extracts without the country are skipped.
|
|
115
|
+
*
|
|
116
|
+
* The placetype-match order remains the tiebreak when no extract claims
|
|
117
|
+
* the country (or none was probed).
|
|
107
118
|
*/
|
|
108
119
|
country?: string;
|
|
109
120
|
/**
|
package/out/extracts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extracts.d.ts","sourceRoot":"","sources":["../lib/extracts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extracts.d.ts","sourceRoot":"","sources":["../lib/extracts.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,SAAS,CAAA;AAErE;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAY9D;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,eAAe,CAAA;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B;AAgBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,eAAe,GAAG,aAAa,CAAC,eAAe,GAAG,aAAa,CAAC,GACrE,eAAe,EAAE,CA2CnB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,eAAe,EAAE,EAC3B,SAAS,EAAE,MAAM,GAAG,SAAS,GAC3B,eAAe,EAAE,CAuBnB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,eAAe,EAAE,EAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,CAAC,EAAE;IACN;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,iBAAiB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA;CAC5D,GACC,eAAe,CAmCjB"}
|
package/out/extracts.js
CHANGED
|
@@ -1,34 +1,30 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { stringifyJSON } from "@mailwoman/core/json";
|
|
2
|
+
import { basename, PathBuilder } from "path-ts";
|
|
2
3
|
/**
|
|
3
4
|
* @copyright Sister Software
|
|
4
5
|
* @license AGPL-3.0
|
|
5
6
|
* @author Teffen Ellis, et al.
|
|
6
7
|
*
|
|
7
|
-
* Multi-extract support for `WOFSQLitePlaceLookup
|
|
8
|
-
* connection
|
|
8
|
+
* Multi-extract support for `WOFSQLitePlaceLookup`. It opens multiple WOF SQLite distributions
|
|
9
|
+
* on one connection with `attach database`. It routes queries by placetype.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* The naive `SELECT … FROM pc.place_search WHERE pc.place_search MATCH ?` fails — SQLite parses the
|
|
13
|
-
* schema-qualified table on the left of MATCH as "column place_search of table pc". Discovered in
|
|
14
|
-
* the spike at PR review time; documented as `_EXTRACT_RULE.md` should it ever bite again.
|
|
15
|
-
*
|
|
16
|
-
* The working form: schema-qualified in FROM, bare table name in MATCH:
|
|
11
|
+
* SQLite parses a schema-qualified table on the left of `match` as "column place_search of table
|
|
12
|
+
* pc", so the working form is schema-qualified in `from` and a bare table name in `match`:
|
|
17
13
|
*
|
|
18
14
|
* ```sql
|
|
19
|
-
*
|
|
15
|
+
* select … from pc.place_search where place_search match ?
|
|
20
16
|
* ```
|
|
21
17
|
*
|
|
22
|
-
* Identical table names across attached extracts
|
|
23
|
-
*
|
|
24
|
-
* scope.
|
|
18
|
+
* Identical table names across attached extracts are fine, because the bare-name `match` resolves
|
|
19
|
+
* against `from` scope. Every extract ships its own `place_search` and `place_bbox`.
|
|
25
20
|
*/
|
|
26
21
|
/**
|
|
27
|
-
* Derive a SQL-safe schema name from a WOF distribution filename.
|
|
28
|
-
*
|
|
22
|
+
* Derive a SQL-safe schema name from a WOF distribution filename.
|
|
23
|
+
*
|
|
24
|
+
* Used by `attach database … AS <name>` so each extract gets a stable, predictable handle.
|
|
29
25
|
*
|
|
30
|
-
* Convention strips the `whosonfirst-data-` prefix and the `-latest.db` (or just `.db`)
|
|
31
|
-
* `_` for SQL identifier safety.
|
|
26
|
+
* Convention strips the `whosonfirst-data-` prefix and the `-latest.db` (or just `.db`)
|
|
27
|
+
* suffix, then replaces `-` with `_` for SQL identifier safety.
|
|
32
28
|
*
|
|
33
29
|
* Examples:
|
|
34
30
|
*
|
|
@@ -37,56 +33,65 @@ import { basename } from "path-ts";
|
|
|
37
33
|
* - `whosonfirst-data-admin-latest.db` → `admin`
|
|
38
34
|
* - `my-custom.db` → `my_custom`
|
|
39
35
|
*
|
|
40
|
-
* Callers can override the derived name explicitly via `ExtractConfig.schemaName`
|
|
41
|
-
* convention.
|
|
36
|
+
* Callers can override the derived name explicitly via `ExtractConfig.schemaName`
|
|
37
|
+
* when the filename doesn't follow WOF convention.
|
|
42
38
|
*/
|
|
43
39
|
export function deriveSchemaName(path) {
|
|
44
|
-
const stem = basename(path)
|
|
40
|
+
const stem = basename(path.toString())
|
|
45
41
|
.replace(/^whosonfirst-data-/u, "")
|
|
46
42
|
.replace(/-latest\.db$/u, "")
|
|
47
43
|
.replace(/\.db$/u, "")
|
|
48
44
|
.replaceAll(/[^a-zA-Z0-9_]/g, "_");
|
|
49
45
|
if (!stem) {
|
|
50
|
-
throw new Error(`deriveSchemaName: could not derive a SQL schema name from path ${
|
|
46
|
+
throw new Error(`deriveSchemaName: could not derive a SQL schema name from path ${stringifyJSON(path)}`);
|
|
51
47
|
}
|
|
52
48
|
return stem;
|
|
53
49
|
}
|
|
54
50
|
/**
|
|
55
|
-
* SQLite identifier regex
|
|
51
|
+
* SQLite identifier regex matching `[A-Za-z_][A-Za-z0-9_]*`.
|
|
56
52
|
*/
|
|
57
53
|
const SQLITE_IDENT_RE = /^[A-Za-z_][A-Za-z0-9_]*$/u;
|
|
58
54
|
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
55
|
+
* Whether a `databasePath` entry is a path or an {@link ExtractConfig}.
|
|
56
|
+
*
|
|
57
|
+
* A builder is a `String` object, so `typeof` by itself reads it as an object.
|
|
58
|
+
*/
|
|
59
|
+
function isPathBuilderLike(value) {
|
|
60
|
+
return typeof value === "string" || value instanceof PathBuilder;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Normalize the user-provided `databasePath` opt (which may be a single string, an array
|
|
64
|
+
* of strings, or an array of `ExtractConfig` objects) into a uniform `ResolvedExtract[]`.
|
|
61
65
|
*
|
|
62
|
-
* The first extract becomes `main` regardless of its derived schema name
|
|
63
|
-
* extracts keep their derived
|
|
66
|
+
* The first extract becomes `main` regardless of its derived schema name, following SQLite convention.
|
|
67
|
+
* Subsequent extracts keep their derived or overridden schema name.
|
|
64
68
|
*/
|
|
65
69
|
export function resolveExtracts(input) {
|
|
66
|
-
const list =
|
|
70
|
+
const list = isPathBuilderLike(input) ? [input] : input;
|
|
67
71
|
if (!list.length)
|
|
68
72
|
throw new Error("resolveExtracts: at least one extract is required");
|
|
69
73
|
const seen = new Set();
|
|
70
74
|
const out = [];
|
|
71
75
|
for (let i = 0; i < list.length; i++) {
|
|
72
76
|
const entry = list[i];
|
|
73
|
-
const cfg =
|
|
77
|
+
const cfg = isPathBuilderLike(entry) ? { path: entry } : entry;
|
|
74
78
|
const derived = cfg.schemaName ?? deriveSchemaName(cfg.path);
|
|
75
79
|
if (!SQLITE_IDENT_RE.test(derived)) {
|
|
76
|
-
throw new Error(`resolveExtracts: schema name ${
|
|
77
|
-
`(derived from path ${
|
|
80
|
+
throw new Error(`resolveExtracts: schema name ${stringifyJSON(derived)} is not a valid SQLite identifier ` +
|
|
81
|
+
`(derived from path ${stringifyJSON(cfg.path)}). Pass an explicit ` +
|
|
78
82
|
`{ path, schemaName } to override.`);
|
|
79
83
|
}
|
|
80
|
-
//
|
|
81
|
-
//
|
|
84
|
+
// SQLite always treats the first extract as main.
|
|
85
|
+
// Its derived name is informational only.
|
|
86
|
+
// Subsequent extracts must have unique non-main names.
|
|
82
87
|
const schemaName = i === 0 ? "main" : derived;
|
|
83
88
|
if (i > 0 && (schemaName === "main" || seen.has(schemaName))) {
|
|
84
|
-
throw new Error(`resolveExtracts: schema name ${
|
|
89
|
+
throw new Error(`resolveExtracts: schema name ${stringifyJSON(schemaName)} collides ` +
|
|
85
90
|
`(either with "main" or another extract). Pass an explicit { path, schemaName }.`);
|
|
86
91
|
}
|
|
87
92
|
seen.add(schemaName);
|
|
88
93
|
out.push({
|
|
89
|
-
path: cfg.path,
|
|
94
|
+
path: cfg.path.toString(),
|
|
90
95
|
schemaName,
|
|
91
96
|
placetypes: cfg.placetypes ?? [],
|
|
92
97
|
});
|
|
@@ -94,24 +99,11 @@ export function resolveExtracts(input) {
|
|
|
94
99
|
return out;
|
|
95
100
|
}
|
|
96
101
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
* Routing rules, in order:
|
|
100
|
-
*
|
|
101
|
-
* 1. If any extract has explicit `placetypes` that includes the requested placetype, use it.
|
|
102
|
-
* 2. Otherwise, if a non-main extract's `schemaName` matches the placetype (e.g. `postalcode_us` matches `postalcode`),
|
|
103
|
-
* use it.
|
|
104
|
-
* 3. Otherwise, fall back to `main`.
|
|
102
|
+
* All placetype-matching extracts, in routing order (the country-aware pick chooses among these).
|
|
105
103
|
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*/
|
|
110
|
-
/**
|
|
111
|
-
* All placetype-matching extracts, in routing order (the country-aware pick chooses among these). Used by the bias
|
|
112
|
-
* path: a country-less postcode query with proximity hints fans out across every matching extract and merges, because
|
|
113
|
-
* single-extract routing would hide the cross-country ambiguity the hints exist to resolve ("48026" lives in
|
|
114
|
-
* postalcode-us AND postalcode-intl).
|
|
104
|
+
* Used by the bias path: a country-less postcode query with proximity hints fans out across
|
|
105
|
+
* every matching extract and merges, because single-extract routing would hide the cross-country
|
|
106
|
+
* ambiguity the hints exist to resolve ("48026" lives in postalcode-us and postalcode-intl).
|
|
115
107
|
*/
|
|
116
108
|
export function pickExtractsForPlacetype(extracts, placetype) {
|
|
117
109
|
if (!placetype)
|
|
@@ -133,6 +125,22 @@ export function pickExtractsForPlacetype(extracts, placetype) {
|
|
|
133
125
|
}
|
|
134
126
|
return matches.length ? matches : [extracts[0]];
|
|
135
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Pick the extract to route a query to given the requested placetype(s).
|
|
130
|
+
*
|
|
131
|
+
* The resolver applies these routing rules in order:
|
|
132
|
+
*
|
|
133
|
+
* 1. If any extract has explicit `placetypes` that includes the requested placetype, use it.
|
|
134
|
+
* 2. Otherwise, if a non-main extract's `schemaName` matches the placetype
|
|
135
|
+
* (e.g. `postalcode_us` matches `postalcode`), use it.
|
|
136
|
+
* 3. Otherwise, fall back to `main`.
|
|
137
|
+
*
|
|
138
|
+
* This deliberately does not union across extracts.
|
|
139
|
+
* BM25 scores are not comparable across separately indexed corpora.
|
|
140
|
+
* A typical mailwoman query has one placetype.
|
|
141
|
+
*
|
|
142
|
+
* Callers that need cross-extract results can issue two `findPlace` calls.
|
|
143
|
+
*/
|
|
136
144
|
export function pickExtractForPlacetype(extracts, placetype, opts) {
|
|
137
145
|
if (!placetype)
|
|
138
146
|
return extracts[0];
|
|
@@ -145,9 +153,9 @@ export function pickExtractForPlacetype(extracts, placetype, opts) {
|
|
|
145
153
|
for (const s of extracts) {
|
|
146
154
|
if (s.schemaName === "main" || matches.includes(s))
|
|
147
155
|
continue;
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
// `region` matching `arboregion`.
|
|
156
|
+
// A substring match lets `postalcode_us` match `postalcode`.
|
|
157
|
+
// Conservative, requiring the placetype at a word boundary in the schema name
|
|
158
|
+
// to avoid false hits like `region` matching `arboregion`.
|
|
151
159
|
if (s.schemaName === placetype ||
|
|
152
160
|
s.schemaName.startsWith(`${placetype}_`) ||
|
|
153
161
|
s.schemaName.endsWith(`_${placetype}`)) {
|
package/out/extracts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extracts.js","sourceRoot":"","sources":["../lib/extracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"extracts.js","sourceRoot":"","sources":["../lib/extracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* FST-based autocomplete
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* FST-based autocomplete, mailwoman vocabulary over `@mailwoman/ancestrie`'s generic algorithm.
|
|
7
|
+
* The prefix walk, BFS expansion, partial-last-token completion, per-branch capping and dedupe
|
|
8
|
+
* live in ancestrie's `autocomplete`. This module contributes only the storage adapter
|
|
9
|
+
* ({@link FSTMatcher} → `AncestrieReaderLike`) and the mapping back to mailwoman's suggestion
|
|
10
|
+
* shape (name, placetype, referential and encyclopedic scores, WOF ids).
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
* ancestrie's
|
|
14
|
-
*
|
|
15
|
-
* legitimately
|
|
16
|
-
* The matcher, both deserializers
|
|
17
|
-
*
|
|
12
|
+
* The bytes do not migrate. The shipped artifacts are `FST\0` v1 to v5 (`fst-serialize.ts`), and
|
|
13
|
+
* ancestrie's entries are id-keyed with one record per id. An FST place row is per-(surface,
|
|
14
|
+
* place), because `crossCountryBranches` is a property of the surface, so the same wofID
|
|
15
|
+
* legitimately has different values under different aliases, so it cannot use IDs as keys.
|
|
16
|
+
* The matcher, both deserializers and serializer stay here. The algorithm is the
|
|
17
|
+
* half that migrated.
|
|
18
18
|
*/
|
|
19
19
|
import type { FSTMatcher } from "#fst/matcher";
|
|
20
20
|
export interface AutocompleteResult {
|
|
@@ -27,16 +27,20 @@ export interface AutocompleteSuggestion {
|
|
|
27
27
|
name: string;
|
|
28
28
|
placetype: string;
|
|
29
29
|
/**
|
|
30
|
-
* The
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* The referential likelihood the suggestion is ranked by (ROAD_TO_V9 §2).
|
|
31
|
+
*
|
|
32
|
+
* Autocomplete answers "which place does the user mean", so it ranks referentially like everything else.
|
|
33
|
+
* Encyclopedic importance appears in {@link AutocompleteSuggestion.encyclopedic}
|
|
34
|
+
* for display and never enters the order.
|
|
33
35
|
*/
|
|
34
36
|
referential: number;
|
|
35
37
|
/**
|
|
36
|
-
* Encyclopedic (Wikipedia) importance, when the FST artifact
|
|
37
|
-
*
|
|
38
|
+
* Encyclopedic (Wikipedia) importance, when the FST artifact stores one for this place.
|
|
39
|
+
*
|
|
40
|
+
* `undefined` means no article, or a pre-v5 binary.
|
|
41
|
+
* It is never 0.
|
|
38
42
|
*/
|
|
39
|
-
encyclopedic
|
|
43
|
+
encyclopedic: number | null;
|
|
40
44
|
wofID: number;
|
|
41
45
|
parentChain: number[];
|
|
42
46
|
matchDepth: number;
|
|
@@ -46,14 +50,18 @@ export interface AutocompleteOpts {
|
|
|
46
50
|
maxSuggestions?: number;
|
|
47
51
|
maxExpansionDepth?: number;
|
|
48
52
|
/**
|
|
49
|
-
* Collapse same-name suggestions to the single highest-referential one.
|
|
50
|
-
*
|
|
51
|
-
*
|
|
53
|
+
* Collapse same-name suggestions to the single highest-referential one.
|
|
54
|
+
*
|
|
55
|
+
* Off by default, because the CLI surfaces distinct same-name places such as
|
|
56
|
+
* New York the city and New York the county.
|
|
57
|
+
* A typeahead wants it on so the dropdown does not show four "New London"s.
|
|
52
58
|
*/
|
|
53
59
|
dedupeByName?: boolean;
|
|
54
60
|
}
|
|
55
61
|
/**
|
|
56
|
-
* Autocomplete from the current prefix.
|
|
62
|
+
* Autocomplete from the current prefix.
|
|
63
|
+
*
|
|
64
|
+
* @returns Suggestions ranked referential-descending.
|
|
57
65
|
*/
|
|
58
66
|
export declare function autocomplete(fst: FSTMatcher, query: string, opts?: AutocompleteOpts): AutocompleteResult;
|
|
59
67
|
//# sourceMappingURL=autocomplete.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../lib/fst/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAWH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAI9C,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,sBAAsB,EAAE,CAAA;CACrC;AAED,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB
|
|
1
|
+
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../lib/fst/autocomplete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAWH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAI9C,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,sBAAsB,EAAE,CAAA;CACrC;AAED,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAChC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACtB;AAkFD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,kBAAkB,CA+B5G"}
|
package/out/fst/autocomplete.js
CHANGED
|
@@ -3,29 +3,33 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* FST-based autocomplete
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
6
|
+
* FST-based autocomplete, mailwoman vocabulary over `@mailwoman/ancestrie`'s generic algorithm.
|
|
7
|
+
* The prefix walk, BFS expansion, partial-last-token completion, per-branch capping and dedupe
|
|
8
|
+
* live in ancestrie's `autocomplete`. This module contributes only the storage adapter
|
|
9
|
+
* ({@link FSTMatcher} → `AncestrieReaderLike`) and the mapping back to mailwoman's suggestion
|
|
10
|
+
* shape (name, placetype, referential and encyclopedic scores, WOF ids).
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
* ancestrie's
|
|
14
|
-
*
|
|
15
|
-
* legitimately
|
|
16
|
-
* The matcher, both deserializers
|
|
17
|
-
*
|
|
12
|
+
* The bytes do not migrate. The shipped artifacts are `FST\0` v1 to v5 (`fst-serialize.ts`), and
|
|
13
|
+
* ancestrie's entries are id-keyed with one record per id. An FST place row is per-(surface,
|
|
14
|
+
* place), because `crossCountryBranches` is a property of the surface, so the same wofID
|
|
15
|
+
* legitimately has different values under different aliases, so it cannot use IDs as keys.
|
|
16
|
+
* The matcher, both deserializers and serializer stay here. The algorithm is the
|
|
17
|
+
* half that migrated.
|
|
18
18
|
*/
|
|
19
19
|
import { autocomplete as ancestrieAutocomplete } from "@mailwoman/ancestrie";
|
|
20
20
|
import { normalizeTokens } from "#fst/matcher";
|
|
21
21
|
/**
|
|
22
|
-
* Max accepting entries collected per BFS branch
|
|
22
|
+
* Max accepting entries collected per BFS branch, keeping one dense branch from starving the search.
|
|
23
23
|
*/
|
|
24
24
|
const PER_BRANCH = 4;
|
|
25
25
|
/**
|
|
26
|
-
* The top-`k` entries by
|
|
27
|
-
*
|
|
28
|
-
*
|
|
26
|
+
* The top-`k` entries by referential likelihood (descending).
|
|
27
|
+
*
|
|
28
|
+
* Avoids sorting or allocating when `entries` is small.
|
|
29
|
+
* That shortcut is part of the observable interface.
|
|
30
|
+
*
|
|
31
|
+
* At or under `k`, suggestions retain insertion order.
|
|
32
|
+
* That order decides suggestions among referential ties.
|
|
29
33
|
*/
|
|
30
34
|
function topByReferential(entries, k) {
|
|
31
35
|
if (entries.length <= k)
|
|
@@ -33,18 +37,22 @@ function topByReferential(entries, k) {
|
|
|
33
37
|
return [...entries].toSorted((a, b) => b.referential - a.referential).slice(0, k);
|
|
34
38
|
}
|
|
35
39
|
/**
|
|
36
|
-
* {@link FSTMatcher} presented through ancestrie's storage interface.
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
+
* {@link FSTMatcher} presented through ancestrie's storage interface.
|
|
41
|
+
*
|
|
42
|
+
* Records store the {@link PlaceEntry} itself as the payload, so the entry that wins the
|
|
43
|
+
* algorithm's shallowest-depth rule is the entry whose fields the suggestion reports.
|
|
44
|
+
* A side lookup keyed on id could pick a different surface's row
|
|
45
|
+
* (`crossCountryBranches` differs per surface).
|
|
40
46
|
*/
|
|
41
47
|
class FSTReader {
|
|
42
48
|
#fst;
|
|
43
49
|
/**
|
|
44
|
-
* Parent chains of the entries this reader has served, id-keyed.
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
50
|
+
* Parent chains of the entries this reader has served, id-keyed.
|
|
51
|
+
*
|
|
52
|
+
* A place's chain is identical across its surfaces (it is place-row data), so last-write-wins is safe.
|
|
53
|
+
* The algorithm asks {@link FSTReader.ancestorsOf} only for ids it just received
|
|
54
|
+
* from {@link FSTReader.entriesAt}, so serving from this memo answers every
|
|
55
|
+
* real call without an artifact-wide id index.
|
|
48
56
|
*/
|
|
49
57
|
#chains = new Map();
|
|
50
58
|
constructor(fst) {
|
|
@@ -54,7 +62,8 @@ class FSTReader {
|
|
|
54
62
|
return this.#fst.walk([...tokens]);
|
|
55
63
|
}
|
|
56
64
|
continuations(stateID) {
|
|
57
|
-
// Insertion order, verbatim
|
|
65
|
+
// Insertion order, verbatim.
|
|
66
|
+
// BFS visit order under the suggestion budget depends on it.
|
|
58
67
|
return this.#fst.continuations(stateID).map((c) => ({
|
|
59
68
|
token: c.token,
|
|
60
69
|
targetState: c.targetState,
|
|
@@ -79,7 +88,9 @@ class FSTReader {
|
|
|
79
88
|
}
|
|
80
89
|
}
|
|
81
90
|
/**
|
|
82
|
-
* Autocomplete from the current prefix.
|
|
91
|
+
* Autocomplete from the current prefix.
|
|
92
|
+
*
|
|
93
|
+
* @returns Suggestions ranked referential-descending.
|
|
83
94
|
*/
|
|
84
95
|
export function autocomplete(fst, query, opts = {}) {
|
|
85
96
|
const normalizedTokens = normalizeTokens(query);
|
|
@@ -87,7 +98,7 @@ export function autocomplete(fst, query, opts = {}) {
|
|
|
87
98
|
...(opts.maxSuggestions === undefined ? {} : { maxSuggestions: opts.maxSuggestions }),
|
|
88
99
|
...(opts.maxExpansionDepth === undefined ? {} : { maxExpansionDepth: opts.maxExpansionDepth }),
|
|
89
100
|
perBranchLimit: PER_BRANCH,
|
|
90
|
-
// The dedupe key is the
|
|
101
|
+
// The dedupe key is the display name, so two surfaces of one name still collapse.
|
|
91
102
|
...(opts.dedupeByName ? { dedupe: (s) => s.payload.name.toLowerCase() } : {}),
|
|
92
103
|
});
|
|
93
104
|
return {
|
|
@@ -95,13 +106,13 @@ export function autocomplete(fst, query, opts = {}) {
|
|
|
95
106
|
normalizedTokens,
|
|
96
107
|
depth: result.depth,
|
|
97
108
|
suggestions: result.suggestions.map((s) => {
|
|
98
|
-
// Every record this adapter serves
|
|
109
|
+
// Every record this adapter serves includes its entry, so the non-null assertion holds.
|
|
99
110
|
const entry = s.payload;
|
|
100
111
|
return {
|
|
101
112
|
name: entry.name,
|
|
102
113
|
placetype: entry.placetype,
|
|
103
114
|
referential: entry.referential,
|
|
104
|
-
|
|
115
|
+
encyclopedic: entry.encyclopedic,
|
|
105
116
|
wofID: s.id,
|
|
106
117
|
parentChain: s.parentIDs,
|
|
107
118
|
matchDepth: s.matchDepth,
|