@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/poi/lookup.js
CHANGED
|
@@ -3,54 +3,41 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* Node reader for `poi.db` (spec §3.4)
|
|
7
|
-
* `
|
|
8
|
-
* artifact
|
|
6
|
+
* Node reader for `poi.db` (spec §3.4), the res-9 k-ring reader over the clustered `poi`
|
|
7
|
+
* `without rowid` B-tree `poi-schema.ts` builds. Category, brand and name searches share one
|
|
8
|
+
* artifact. Each path has a method that returns its details.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* haversine distance from `center` after every ring.
|
|
14
|
-
* - **Brand**: NOT a k-ring walk. Brand rows are globally sparse (~0.31% of poi.db; median nearest
|
|
15
|
-
* tagged instance ~110 km), so ring expansion could never reach them. Instead a single brand-wide
|
|
16
|
-
* indexed fetch on `brand_wikidata` (the partial `poi_brand_wikidata` index) pulls EVERY row for
|
|
17
|
-
* the QID — category unconstrained — then haversine-sorts from `center` and takes the nearest
|
|
18
|
-
* `limit`, bounded by a `BRAND_MAX_DISTANCE_KM` sanity radius.
|
|
19
|
-
* - **Name**: FTS5 `MATCH` against the `poi_search` virtual table, hydrated back to full rows by
|
|
20
|
-
* `name_key`. No center required; if one is given, hits are still distance-sorted.
|
|
21
|
-
*
|
|
22
|
-
* `latLngToCell`/`gridDisk` come from `h3-js`; the 48-bit short-cell packing that turns a raw H3
|
|
23
|
-
* cell into the integer `poi.h3_cell` stores is `@mailwoman/spatial`'s `shortCellToInt` — that math
|
|
24
|
-
* is NEVER reimplemented here (see AGENTS.md on `@mailwoman/spatial` being the one true home for
|
|
25
|
-
* it).
|
|
10
|
+
* `latLngToCell` and `gridDisk` come from `h3-js`. The 48-bit short-cell packing that turns a raw
|
|
11
|
+
* H3 cell into the integer `poi.h3_cell` stores is `@mailwoman/spatial`'s `shortCellToInt`, and
|
|
12
|
+
* that math is never reimplemented here.
|
|
26
13
|
*/
|
|
27
14
|
import { allRows } from "@mailwoman/core/utils";
|
|
28
15
|
import { haversineKm, shortCellToInt } from "@mailwoman/spatial";
|
|
29
|
-
import {
|
|
16
|
+
import { SQLiteLookup } from "@mailwoman/sqlite/lookup";
|
|
30
17
|
import { gridDisk, latLngToCell } from "h3-js";
|
|
31
18
|
/**
|
|
32
|
-
* Resolution the `poi` table's `h3_cell` column is keyed at
|
|
19
|
+
* Resolution the `poi` table's `h3_cell` column is keyed at, matching the builder (spec §3.4).
|
|
33
20
|
*/
|
|
34
21
|
export const POI_H3_RESOLUTION = 9;
|
|
35
22
|
/**
|
|
36
|
-
* Ring budget default: 16 res-9 k-rings
|
|
37
|
-
*
|
|
23
|
+
* Ring budget default: 16 res-9 k-rings, about 5.4 km at the corner and 4.3 km worst-case.
|
|
24
|
+
*
|
|
25
|
+
* Category path only, since the brand path ignores rings entirely.
|
|
26
|
+
* Dense categories never reach this ceiling, because the loop breaks once a ring accumulates `limit` rows.
|
|
38
27
|
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* unaffected: the loop breaks the ring it accumulates `limit` rows (cafe@Paris fills 20 by ring 2), so this ceiling
|
|
43
|
-
* never enters their probe budget. Only sparse-but-present categories that never reach `limit` scan the fuller budget —
|
|
44
|
-
* a cold, one-shot `mailwoman poi` path, not per-keystroke. 16 (not the bare threshold 14) leaves ~2 rings of margin so
|
|
45
|
-
* the radius is stable against small db rebuilds, while staying ~4x tighter than the board's 25 km "roughly right
|
|
46
|
-
* place" window (no wrong-city false positives). The browser reader passes its own smaller `maxRings` and is
|
|
47
|
-
* untouched.
|
|
28
|
+
* Sparse-but-present categories that never reach `limit` scan the fuller budget.
|
|
29
|
+
* The extra rings keep the radius stable across small DB rebuilds.
|
|
30
|
+
* The browser reader passes its own smaller `maxRings`.
|
|
48
31
|
*/
|
|
49
32
|
const DEFAULT_MAX_RINGS = 16;
|
|
50
33
|
/**
|
|
51
|
-
* Brand sanity radius (km)
|
|
52
|
-
*
|
|
53
|
-
*
|
|
34
|
+
* Brand sanity radius (km).
|
|
35
|
+
*
|
|
36
|
+
* The brand-wide fetch returns the global nearest at any distance, so this drops
|
|
37
|
+
* hits far enough away to be certainly on another continent.
|
|
38
|
+
* "Applebee's near Marseille" comes back empty instead of with a 5,700 km hit.
|
|
39
|
+
*
|
|
40
|
+
* This is a product bound, since the index already makes the fetch cheap regardless of distance.
|
|
54
41
|
*/
|
|
55
42
|
const BRAND_MAX_DISTANCE_KM = 500;
|
|
56
43
|
/**
|
|
@@ -60,13 +47,7 @@ const DEFAULT_LIMIT = 20;
|
|
|
60
47
|
/**
|
|
61
48
|
* Node reader over `poi.db`.
|
|
62
49
|
*/
|
|
63
|
-
export class POILookup {
|
|
64
|
-
#db;
|
|
65
|
-
/**
|
|
66
|
-
* Resources this instance opened. A connection handed in by a caller is NOT in here, so disposal cannot reach it —
|
|
67
|
-
* ownership is membership rather than a flag a later branch has to check.
|
|
68
|
-
*/
|
|
69
|
-
#resources = new DisposableStack();
|
|
50
|
+
export class POILookup extends SQLiteLookup {
|
|
70
51
|
#categoryToID = new Map();
|
|
71
52
|
#idToCategory = new Map();
|
|
72
53
|
/**
|
|
@@ -74,33 +55,26 @@ export class POILookup {
|
|
|
74
55
|
*/
|
|
75
56
|
#categoryCellProbe;
|
|
76
57
|
/**
|
|
77
|
-
* `brand_wikidata` →
|
|
58
|
+
* `brand_wikidata` → all of a brand's rows globally (partial-index range-scan).
|
|
59
|
+
* The sort happens in JS.
|
|
78
60
|
*/
|
|
79
61
|
#brandProbe;
|
|
80
62
|
/**
|
|
81
|
-
* FTS5 `
|
|
63
|
+
* FTS5 `match` over `poi_search`, returning candidate `name_key`s to hydrate.
|
|
82
64
|
*/
|
|
83
65
|
#nameFTSProbe;
|
|
84
66
|
constructor(opts) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
this.#db = this.#resources.use(new DatabaseClient(opts.databasePath, { readOnly: true }));
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
throw new Error("POILookup needs `databasePath` or `database`");
|
|
93
|
-
}
|
|
94
|
-
// The category dictionary is tiny (poi-taxonomy's category count) — load it once at
|
|
95
|
-
// construction so `search` never round-trips to it.
|
|
96
|
-
for (const r of allRows(this.#db.prepare("SELECT id, category FROM poi_category_codes"))) {
|
|
67
|
+
super(opts);
|
|
68
|
+
// The category dictionary is tiny (poi-taxonomy's category count), so load it once
|
|
69
|
+
// at construction and keep `search` from round-tripping to it.
|
|
70
|
+
for (const r of allRows(this.database.prepare("SELECT id, category FROM poi_category_codes"))) {
|
|
97
71
|
this.#categoryToID.set(String(r.category), Number(r.id));
|
|
98
72
|
this.#idToCategory.set(Number(r.id), String(r.category));
|
|
99
73
|
}
|
|
100
74
|
const columns = "name, category_id, brand_wikidata, latitude, longitude, country, confidence, name_key, gers_id";
|
|
101
|
-
this.#categoryCellProbe = this
|
|
102
|
-
this.#brandProbe = this
|
|
103
|
-
this.#nameFTSProbe = this
|
|
75
|
+
this.#categoryCellProbe = this.database.prepare(`SELECT ${columns} FROM poi WHERE h3_cell = ? AND category_id = ? ORDER BY neg_rank ASC LIMIT ?`);
|
|
76
|
+
this.#brandProbe = this.database.prepare(`SELECT ${columns} FROM poi WHERE brand_wikidata = ?`);
|
|
77
|
+
this.#nameFTSProbe = this.database.prepare("SELECT name_key FROM poi_search WHERE poi_search MATCH ? ORDER BY bm25(poi_search) LIMIT ?");
|
|
104
78
|
}
|
|
105
79
|
search(query) {
|
|
106
80
|
const limit = Math.max(1, query.limit ?? DEFAULT_LIMIT);
|
|
@@ -111,8 +85,6 @@ export class POILookup {
|
|
|
111
85
|
if (!query.center) {
|
|
112
86
|
throw new Error("POILookup.search: category/brand search requires a `center`");
|
|
113
87
|
}
|
|
114
|
-
// brandWikidata wins over categoryID(s) when both are set — see POISearchQuery.categoryID. The brand path is
|
|
115
|
-
// a brand-wide indexed fetch, NOT a k-ring walk (brand rows are too sparse for ring expansion to reach).
|
|
116
88
|
if (query.brandWikidata) {
|
|
117
89
|
return this.#searchBrand(query.brandWikidata, query.center, limit);
|
|
118
90
|
}
|
|
@@ -121,10 +93,14 @@ export class POILookup {
|
|
|
121
93
|
return [];
|
|
122
94
|
}
|
|
123
95
|
/**
|
|
124
|
-
* Brand path: a single brand-wide indexed fetch
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
96
|
+
* Brand path: a single brand-wide indexed fetch and no k-ring.
|
|
97
|
+
*
|
|
98
|
+
* The partial `poi_brand_wikidata` index turns the QID fetch into a range-scan
|
|
99
|
+
* instead of a 13.68M full scan.
|
|
100
|
+
* Rows are sorted by haversine distance from `center`.
|
|
101
|
+
*
|
|
102
|
+
* The lookup drops rows past {@link BRAND_MAX_DISTANCE_KM}.
|
|
103
|
+
* It returns the nearest `limit` rows.
|
|
128
104
|
*/
|
|
129
105
|
#searchBrand(brandWikidata, center, limit) {
|
|
130
106
|
const rows = allRows(this.#brandProbe, brandWikidata);
|
|
@@ -140,8 +116,9 @@ export class POILookup {
|
|
|
140
116
|
const center = query.center;
|
|
141
117
|
const maxRings = query.maxRings ?? DEFAULT_MAX_RINGS;
|
|
142
118
|
const categoryIDs = [];
|
|
143
|
-
// `categoryIDs` (the fan-out list) supersedes the single `categoryID
|
|
144
|
-
//
|
|
119
|
+
// `categoryIDs` (the fan-out list) supersedes the single `categoryID`.
|
|
120
|
+
// Each id resolves through the dictionary.
|
|
121
|
+
// Unresolved ids are dropped to cover Overture taxonomy drift and identity ids with no rows.
|
|
145
122
|
const seedIDs = query.categoryIDs?.length ? query.categoryIDs : query.categoryID ? [query.categoryID] : [];
|
|
146
123
|
for (const id of seedIDs) {
|
|
147
124
|
const resolved = this.#categoryToID.get(id);
|
|
@@ -149,7 +126,8 @@ export class POILookup {
|
|
|
149
126
|
categoryIDs.push(resolved);
|
|
150
127
|
}
|
|
151
128
|
}
|
|
152
|
-
// No resolvable leaf
|
|
129
|
+
// No resolvable leaf can have rows, since every id is unknown to the dictionary.
|
|
130
|
+
// This is a clean miss instead of a throw.
|
|
153
131
|
if (!categoryIDs.length)
|
|
154
132
|
return [];
|
|
155
133
|
const origin = latLngToCell(center.latitude, center.longitude, POI_H3_RESOLUTION);
|
|
@@ -157,15 +135,13 @@ export class POILookup {
|
|
|
157
135
|
let rows = [];
|
|
158
136
|
// `ring` starts at 0 (the origin cell itself), so this loop's k reaches `maxRings - 1`.
|
|
159
137
|
for (let ring = 0; ring < maxRings; ring++) {
|
|
160
|
-
// gridDisk(origin, ring) returns the
|
|
161
|
-
// already
|
|
138
|
+
// gridDisk(origin, ring) returns the whole disk out to `ring`, so diffing against
|
|
139
|
+
// the already-probed set derives just this ring's new cells.
|
|
162
140
|
const diskCells = gridDisk(origin, ring);
|
|
163
141
|
const newCells = diskCells.filter((cell) => !seenCells.has(cell));
|
|
164
142
|
for (const cell of newCells) {
|
|
165
143
|
seenCells.add(cell);
|
|
166
144
|
const shortCell = shortCellToInt(cell);
|
|
167
|
-
// Fan-out: probe every resolved Overture leaf for this canonical category, unioning the rows. The
|
|
168
|
-
// post-ring distance sort + `slice(0, limit)` below dedupes the pool down to the nearest `limit`.
|
|
169
145
|
for (const categoryID of categoryIDs) {
|
|
170
146
|
rows.push(...allRows(this.#categoryCellProbe, shortCell, categoryID, limit));
|
|
171
147
|
}
|
|
@@ -177,11 +153,13 @@ export class POILookup {
|
|
|
177
153
|
return rows.slice(0, limit).map((row) => toHit(row, this.#idToCategory, center));
|
|
178
154
|
}
|
|
179
155
|
/**
|
|
180
|
-
* Name path: FTS5
|
|
156
|
+
* Name path: FTS5 match → hydrate by name_key.
|
|
181
157
|
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
158
|
+
* No center is required.
|
|
159
|
+
* Hits are distance-sorted when one is given.
|
|
160
|
+
*
|
|
161
|
+
* Hydration is one batched `where name_key IN (...)` query over the unique `name_key`s
|
|
162
|
+
* of the FTS hits, since a per-hit probe would be up to `limit` full table scans.
|
|
185
163
|
*/
|
|
186
164
|
#searchByName(name, limit, center) {
|
|
187
165
|
const matchQuery = sanitizePOINameQuery(name);
|
|
@@ -221,19 +199,18 @@ export class POILookup {
|
|
|
221
199
|
return rows.slice(0, limit).map((row) => toHit(row, this.#idToCategory, center));
|
|
222
200
|
}
|
|
223
201
|
/**
|
|
224
|
-
* Batched hydration for the FTS name path: `
|
|
225
|
-
* one
|
|
226
|
-
*
|
|
202
|
+
* Batched hydration for the FTS name path: `where name_key IN (?, ?, …)`,
|
|
203
|
+
* one query for the whole batch instead of one probe per FTS hit.
|
|
204
|
+
*
|
|
205
|
+
* This is a cold path (name search only) with variable arity per call,
|
|
206
|
+
* so the statement is prepared fresh each time rather than cached.
|
|
227
207
|
*/
|
|
228
208
|
#hydrateByNameKeys(nameKeys) {
|
|
229
209
|
const columns = "name, category_id, brand_wikidata, latitude, longitude, country, confidence, name_key, gers_id";
|
|
230
210
|
const placeholders = nameKeys.map(() => "?").join(", ");
|
|
231
|
-
const stmt = this
|
|
211
|
+
const stmt = this.database.prepare(`SELECT ${columns} FROM poi WHERE name_key IN (${placeholders})`);
|
|
232
212
|
return allRows(stmt, ...nameKeys);
|
|
233
213
|
}
|
|
234
|
-
[Symbol.dispose]() {
|
|
235
|
-
this.#resources[Symbol.dispose]();
|
|
236
|
-
}
|
|
237
214
|
}
|
|
238
215
|
function sortByDistance(rows, center) {
|
|
239
216
|
return [...rows].toSorted((a, b) => haversineKm(center.latitude, center.longitude, a.latitude, a.longitude) -
|
|
@@ -255,20 +232,20 @@ function toHit(row, idToCategory, center) {
|
|
|
255
232
|
};
|
|
256
233
|
}
|
|
257
234
|
/**
|
|
258
|
-
* Sanitize free text into an FTS5-safe
|
|
259
|
-
* phrase delimiters, `*` prefix wildcards, `:` column-filter separators),
|
|
260
|
-
* token (
|
|
235
|
+
* Sanitize free text into an FTS5-safe `match` query: strip the characters FTS5 would otherwise
|
|
236
|
+
* read as syntax (`"` phrase delimiters, `*` prefix wildcards, `:` column-filter separators),
|
|
237
|
+
* then phrase-quote each whitespace-separated token (and-joined).
|
|
261
238
|
*
|
|
262
|
-
* `
|
|
263
|
-
* module-private there
|
|
264
|
-
* discipline locally rather than
|
|
239
|
+
* `lookup.ts` already has this discipline in `sanitizeFTSQuery`, but that function is
|
|
240
|
+
* module-private there and is not re-exported from `fts.ts` or the package's `index.ts`.
|
|
241
|
+
* This replicates the discipline locally rather than reach across the module boundary for a private helper.
|
|
265
242
|
*/
|
|
266
243
|
function sanitizePOINameQuery(text) {
|
|
267
244
|
return text
|
|
268
245
|
.replaceAll(/["*:]/g, "")
|
|
269
246
|
.trim()
|
|
270
247
|
.split(/\s+/u)
|
|
271
|
-
.filter((token) => token.length
|
|
248
|
+
.filter((token) => token.length)
|
|
272
249
|
.map((token) => `"${token.replaceAll('"', '""')}"`)
|
|
273
250
|
.join(" ");
|
|
274
251
|
}
|
package/out/poi/lookup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../lib/poi/lookup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../lib/poi/lookup.ts"],"names":[],"mappings":"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"}
|
package/out/poi/schema.d.ts
CHANGED
|
@@ -3,20 +3,22 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* Typed schema for poi.db
|
|
7
|
-
*
|
|
8
|
-
* contiguous key range
|
|
9
|
-
* gazetteer
|
|
10
|
-
* `poi_category_codes` dictionary
|
|
11
|
-
* embeds the layer-
|
|
12
|
-
* manifest
|
|
6
|
+
* Typed schema for poi.db, the first spatial layer (spec §3.4). One clustered `without rowid`
|
|
7
|
+
* B-tree uses `(h3_cell, category_id, neg_rank, rowid_key)` as its key. All rows near a res-9 cell
|
|
8
|
+
* occupy a contiguous key range. This matches byte-range and httpvfs access and follows the
|
|
9
|
+
* candidate gazetteer's layout. Rows include denormalized name, brand and coordinates.
|
|
10
|
+
* The `poi_category_codes` dictionary stores category ids as small integers. POI-taxonomy category
|
|
11
|
+
* ids remain strings. The database embeds the layer-interface tables from `@mailwoman/core/layers`.
|
|
12
|
+
* The builder writes a manifest with tier `shipped` and spine `h3` res 9. It also writes per-res-6-cell coverage.
|
|
13
13
|
*/
|
|
14
|
-
import type {
|
|
14
|
+
import type { layerschemadatabase } from "@mailwoman/core/layers";
|
|
15
15
|
import type { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
16
16
|
import { type Kysely } from "kysely";
|
|
17
17
|
import type { NameKey } from "#street/normalize";
|
|
18
18
|
/**
|
|
19
|
-
* One POI row.
|
|
19
|
+
* One POI row.
|
|
20
|
+
*
|
|
21
|
+
* Clustered PK: h3_cell → category_id → neg_rank → rowid_key.
|
|
20
22
|
*/
|
|
21
23
|
export interface POITable {
|
|
22
24
|
/**
|
|
@@ -37,10 +39,12 @@ export interface POITable {
|
|
|
37
39
|
rowid_key: number;
|
|
38
40
|
name: string | null;
|
|
39
41
|
/**
|
|
40
|
-
* Probe key for exact name lookups, minted by {@link normalizeLocalityForKey} at build
|
|
42
|
+
* Probe key for exact name lookups, minted by {@link normalizeLocalityForKey} at build and at query.
|
|
43
|
+
*
|
|
44
|
+
* Branded because a `toLowerCase()` approximation of the fold is still a `string`.
|
|
45
|
+
* That approximation binds to the parameter and returns fewer rows.
|
|
41
46
|
*
|
|
42
|
-
*
|
|
43
|
-
* fewer rows, and the shortfall reads as a coverage gap in the data rather than a defect in the probe.
|
|
47
|
+
* The shortfall looks like a data coverage gap instead of a probe defect.
|
|
44
48
|
*/
|
|
45
49
|
name_key: NameKey | null;
|
|
46
50
|
brand_wikidata: string | null;
|
|
@@ -55,13 +59,17 @@ export interface POITable {
|
|
|
55
59
|
*/
|
|
56
60
|
confidence: number;
|
|
57
61
|
/**
|
|
58
|
-
*
|
|
62
|
+
* Gers id.
|
|
63
|
+
* Nullable metadata, never a key.
|
|
59
64
|
*/
|
|
60
65
|
gers_id: string | null;
|
|
61
66
|
}
|
|
62
67
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
68
|
+
* The staging mirror.
|
|
69
|
+
* Every column is nullable except the coords.
|
|
70
|
+
*
|
|
71
|
+
* The loader fills this table positionally.
|
|
72
|
+
* The materialize select enforces completeness.
|
|
65
73
|
*/
|
|
66
74
|
export interface POIStageTable {
|
|
67
75
|
h3_cell: number | null;
|
|
@@ -84,28 +92,34 @@ export interface POICategoryCodeTable {
|
|
|
84
92
|
id: number;
|
|
85
93
|
category: string;
|
|
86
94
|
}
|
|
87
|
-
export interface POIDatabase extends
|
|
95
|
+
export interface POIDatabase extends layerschemadatabase {
|
|
88
96
|
poi: POITable;
|
|
89
97
|
poi_stage: POIStageTable;
|
|
90
98
|
poi_category_codes: POICategoryCodeTable;
|
|
91
99
|
}
|
|
92
100
|
/**
|
|
93
|
-
* Clustered-key-order column list shared by builder + `
|
|
101
|
+
* Clustered-key-order column list shared by builder + `insert into poi select … from poi_stage`.
|
|
94
102
|
*/
|
|
95
103
|
export declare const POI_COLUMNS: readonly ["h3_cell", "category_id", "neg_rank", "rowid_key", "name", "name_key", "brand_wikidata", "latitude", "longitude", "country", "confidence", "gers_id"];
|
|
96
104
|
export declare function createPOIStagingTables(db: Kysely<POIDatabase>): Promise<void>;
|
|
97
105
|
export declare function createPOITable(db: Kysely<POIDatabase>): Promise<void>;
|
|
98
106
|
/**
|
|
99
|
-
* Secondary index for the FTS-hydration path.
|
|
107
|
+
* Secondary index for the FTS-hydration path.
|
|
108
|
+
*
|
|
109
|
+
* Builders call this after the bulk materialize (index-after-load).
|
|
100
110
|
*/
|
|
101
111
|
export declare function createPOINameKeyIndex(db: Kysely<POIDatabase>): Promise<void>;
|
|
102
112
|
/**
|
|
103
|
-
* Secondary index for the
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
113
|
+
* Secondary index for the brand path, a brand-wide fetch by `brand_wikidata` with no `h3_cell` prefix.
|
|
114
|
+
*
|
|
115
|
+
* Brand rows are globally sparse, so the k-ring walk can never reach them and the reader
|
|
116
|
+
* instead fetches all of a brand's rows and distance-sorts.
|
|
117
|
+
* Without this index that fetch is a full-table scan, while with it the fetch is a range-scan.
|
|
118
|
+
*
|
|
119
|
+
* The partial index (`where brand_wikidata is not NULL`) keeps the mostly unbranded rows out of the B-tree.
|
|
120
|
+
*
|
|
121
|
+
* Builders call this after the bulk materialize (index-after-load),
|
|
122
|
+
* same phase as {@link createPOINameKeyIndex}.
|
|
109
123
|
*/
|
|
110
124
|
export declare function createPOIBrandIndex(db: Kysely<POIDatabase>): Promise<void>;
|
|
111
125
|
/**
|
|
@@ -113,7 +127,9 @@ export declare function createPOIBrandIndex(db: Kysely<POIDatabase>): Promise<vo
|
|
|
113
127
|
*/
|
|
114
128
|
export declare const POI_FTS_TABLE = "poi_search";
|
|
115
129
|
/**
|
|
116
|
-
* FTS5 stays raw SQL by project rule (Kysely can't express virtual tables).
|
|
130
|
+
* FTS5 stays raw SQL by project rule (Kysely can't express virtual tables).
|
|
131
|
+
*
|
|
132
|
+
* Content-keyed by name_key.
|
|
117
133
|
*/
|
|
118
134
|
export declare function createPOISearchFTS<DB>(db: DatabaseClient<DB>): void;
|
|
119
135
|
//# sourceMappingURL=schema.d.ts.map
|
package/out/poi/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../lib/poi/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../lib/poi/schema.ts"],"names":[],"mappings":"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"}
|
package/out/poi/schema.js
CHANGED
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* Typed schema for poi.db
|
|
7
|
-
*
|
|
8
|
-
* contiguous key range
|
|
9
|
-
* gazetteer
|
|
10
|
-
* `poi_category_codes` dictionary
|
|
11
|
-
* embeds the layer-
|
|
12
|
-
* manifest
|
|
6
|
+
* Typed schema for poi.db, the first spatial layer (spec §3.4). One clustered `without rowid`
|
|
7
|
+
* B-tree uses `(h3_cell, category_id, neg_rank, rowid_key)` as its key. All rows near a res-9 cell
|
|
8
|
+
* occupy a contiguous key range. This matches byte-range and httpvfs access and follows the
|
|
9
|
+
* candidate gazetteer's layout. Rows include denormalized name, brand and coordinates.
|
|
10
|
+
* The `poi_category_codes` dictionary stores category ids as small integers. POI-taxonomy category
|
|
11
|
+
* ids remain strings. The database embeds the layer-interface tables from `@mailwoman/core/layers`.
|
|
12
|
+
* The builder writes a manifest with tier `shipped` and spine `h3` res 9. It also writes per-res-6-cell coverage.
|
|
13
13
|
*/
|
|
14
14
|
import { sql } from "kysely";
|
|
15
15
|
/**
|
|
16
|
-
* Clustered-key-order column list shared by builder + `
|
|
16
|
+
* Clustered-key-order column list shared by builder + `insert into poi select … from poi_stage`.
|
|
17
17
|
*/
|
|
18
18
|
export const POI_COLUMNS = [
|
|
19
19
|
"h3_cell",
|
|
@@ -67,23 +67,29 @@ export async function createPOITable(db) {
|
|
|
67
67
|
.addColumn("confidence", "real", (c) => c.notNull())
|
|
68
68
|
.addColumn("gers_id", "text")
|
|
69
69
|
.addPrimaryKeyConstraint("poi_pk", ["h3_cell", "category_id", "neg_rank", "rowid_key"])
|
|
70
|
-
// `
|
|
70
|
+
// `without rowid` has no first-class builder. The raw modifier is the idiomatic fallback.
|
|
71
71
|
.modifyEnd(sql `without rowid`)
|
|
72
72
|
.execute();
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
|
-
* Secondary index for the FTS-hydration path.
|
|
75
|
+
* Secondary index for the FTS-hydration path.
|
|
76
|
+
*
|
|
77
|
+
* Builders call this after the bulk materialize (index-after-load).
|
|
76
78
|
*/
|
|
77
79
|
export async function createPOINameKeyIndex(db) {
|
|
78
80
|
await db.schema.createIndex("poi_name_key").on("poi").column("name_key").execute();
|
|
79
81
|
}
|
|
80
82
|
/**
|
|
81
|
-
* Secondary index for the
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
83
|
+
* Secondary index for the brand path, a brand-wide fetch by `brand_wikidata` with no `h3_cell` prefix.
|
|
84
|
+
*
|
|
85
|
+
* Brand rows are globally sparse, so the k-ring walk can never reach them and the reader
|
|
86
|
+
* instead fetches all of a brand's rows and distance-sorts.
|
|
87
|
+
* Without this index that fetch is a full-table scan, while with it the fetch is a range-scan.
|
|
88
|
+
*
|
|
89
|
+
* The partial index (`where brand_wikidata is not NULL`) keeps the mostly unbranded rows out of the B-tree.
|
|
90
|
+
*
|
|
91
|
+
* Builders call this after the bulk materialize (index-after-load),
|
|
92
|
+
* same phase as {@link createPOINameKeyIndex}.
|
|
87
93
|
*/
|
|
88
94
|
export async function createPOIBrandIndex(db) {
|
|
89
95
|
await db.schema
|
|
@@ -98,7 +104,9 @@ export async function createPOIBrandIndex(db) {
|
|
|
98
104
|
*/
|
|
99
105
|
export const POI_FTS_TABLE = "poi_search";
|
|
100
106
|
/**
|
|
101
|
-
* FTS5 stays raw SQL by project rule (Kysely can't express virtual tables).
|
|
107
|
+
* FTS5 stays raw SQL by project rule (Kysely can't express virtual tables).
|
|
108
|
+
*
|
|
109
|
+
* Content-keyed by name_key.
|
|
102
110
|
*/
|
|
103
111
|
export function createPOISearchFTS(db) {
|
|
104
112
|
db.exec(`CREATE VIRTUAL TABLE ${POI_FTS_TABLE} USING fts5(name, name_key UNINDEXED, h3_cell UNINDEXED, tokenize = 'unicode61')`);
|
package/out/poi/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../lib/poi/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,GAAG,EAAe,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../lib/poi/schema.ts"],"names":[],"mappings":"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"}
|
package/out/poi.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poi.d.ts","sourceRoot":"","sources":["../lib/poi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA"}
|
package/out/poi.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poi.js","sourceRoot":"","sources":["../lib/poi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA"}
|
package/out/polygon-schema.d.ts
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
6
|
* Typed schema for the polygon sidecar (`wof-polygons.db`) — the one table `WOFReverseGeocoder` probes for a
|
|
7
|
-
* place's geometry. The interface is the read/write
|
|
7
|
+
* place's geometry. The interface is the read/write interface and {@link createPolygonsTable} creates the table, so a
|
|
8
8
|
* column added to one is a compile error against the other.
|
|
9
9
|
*
|
|
10
|
-
* The sidecar is
|
|
10
|
+
* The sidecar is optional to the reverse geocoder: without it every result falls back to a centroid, so the reader
|
|
11
11
|
* checks for the table's presence rather than assuming it.
|
|
12
12
|
*/
|
|
13
13
|
import type { Kysely } from "kysely";
|
|
@@ -17,8 +17,10 @@ import type { Kysely } from "kysely";
|
|
|
17
17
|
export interface PolygonsTable {
|
|
18
18
|
id: number;
|
|
19
19
|
/**
|
|
20
|
-
* The GeoJSON geometry, JSON-encoded.
|
|
21
|
-
*
|
|
20
|
+
* The GeoJSON geometry, JSON-encoded.
|
|
21
|
+
*
|
|
22
|
+
* A row that fails to parse reads as no-polygon, never as an error.
|
|
23
|
+
* A malformed geometry must not fail the whole reverse query.
|
|
22
24
|
*/
|
|
23
25
|
geom: string;
|
|
24
26
|
}
|
|
@@ -26,8 +28,10 @@ export interface PolygonDatabase {
|
|
|
26
28
|
polygons: PolygonsTable;
|
|
27
29
|
}
|
|
28
30
|
/**
|
|
29
|
-
* The
|
|
30
|
-
*
|
|
31
|
+
* The subset of a Kysely handle the polygon DDL touches.
|
|
32
|
+
*
|
|
33
|
+
* Kysely is invariant in its schema parameter, so naming only `schema` lets a
|
|
34
|
+
* builder holding a wider handle pass it without a cast.
|
|
31
35
|
*/
|
|
32
36
|
export type PolygonSchemaHandle = Pick<Kysely<PolygonDatabase>, "schema">;
|
|
33
37
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"polygon-schema.d.ts","sourceRoot":"","sources":["../lib/polygon-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV
|
|
1
|
+
{"version":3,"file":"polygon-schema.d.ts","sourceRoot":"","sources":["../lib/polygon-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV;;;;;OAKG;IACH,IAAI,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,EAAE,aAAa,CAAA;CACvB;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEzE;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAMhF"}
|