@mailwoman/resolver-wof-sqlite 9.2.0 → 9.3.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 +16 -19
- package/lib/address/index.ts +9 -0
- package/{address-point-interpolation.ts → lib/address/point-interpolation.ts} +24 -22
- package/{address-point-schema.ts → lib/address/point-schema.ts} +18 -4
- package/{address-point.ts → lib/address/point.ts} +89 -27
- package/{ancestry-backfill.ts → lib/ancestry/backfill.ts} +14 -19
- package/{ancestry.ts → lib/ancestry/index.ts} +5 -3
- package/{build-candidate.ts → lib/build-candidate.ts} +84 -77
- package/{build-slim.ts → lib/build-slim.ts} +150 -165
- package/{candidate → lib/candidate}/alias-bags.ts +8 -6
- package/{candidate → lib/candidate}/ancestors-sidecar.ts +13 -15
- package/{candidate → lib/candidate}/country-display-names.ts +2 -2
- package/{candidate/shard-fold.ts → lib/candidate/extract-fold.ts} +26 -25
- package/{candidate → lib/candidate}/name-roles.ts +17 -16
- package/{candidate → lib/candidate}/own-name.ts +1 -1
- package/{candidate → lib/candidate}/place-attrs.ts +3 -3
- package/{candidate-ancestors-schema.ts → lib/candidate-ancestors-schema.ts} +4 -4
- package/{candidate-fts.ts → lib/candidate-fts.ts} +3 -3
- package/{candidate-importance.ts → lib/candidate-importance.ts} +53 -57
- package/{candidate-lookup.ts → lib/candidate-lookup.ts} +76 -73
- package/{candidate-schema.ts → lib/candidate-schema.ts} +5 -5
- package/{candidate-scoring.ts → lib/candidate-scoring.ts} +15 -22
- package/{capital-schema.ts → lib/capital-schema.ts} +5 -6
- package/{capitals.ts → lib/capitals.ts} +2 -2
- package/{coincident-roles.ts → lib/coincident-roles.ts} +8 -11
- package/{convention.ts → lib/convention/index.ts} +3 -3
- package/{convention-schema.ts → lib/convention/schema.ts} +2 -2
- package/{coverage-manifest-schema.ts → lib/coverage-manifest-schema.ts} +9 -10
- package/{currency-backfill.ts → lib/currency-backfill.ts} +126 -41
- package/lib/env.ts +50 -0
- package/{exact-match.ts → lib/exact-match.ts} +23 -14
- package/{sharding.ts → lib/extracts.ts} +61 -58
- package/{fst-autocomplete.ts → lib/fst/autocomplete.ts} +4 -4
- package/{fst-builder.ts → lib/fst/builder.ts} +17 -16
- package/{fst-deserialize-web.ts → lib/fst/deserialize-web.ts} +27 -87
- package/lib/fst/format.ts +106 -0
- package/{fst-freshness.ts → lib/fst/freshness.ts} +41 -74
- package/lib/fst/index.ts +14 -0
- package/{fst-matcher.ts → lib/fst/matcher.ts} +1 -1
- package/{fst-serialize.ts → lib/fst/serialize.ts} +37 -115
- package/{fst-types.ts → lib/fst/types.ts} +4 -2
- package/{fts.ts → lib/fts/index.ts} +24 -19
- package/{fts-query.ts → lib/fts/query.ts} +1 -1
- package/{geonames-aliases.ts → lib/geonames/aliases.ts} +13 -13
- package/lib/geonames/index.ts +8 -0
- package/{geonames-postal.ts → lib/geonames/postal.ts} +14 -13
- package/{index.ts → lib/index.ts} +37 -37
- package/{interpolation.ts → lib/interpolation.ts} +27 -25
- package/{lookup.ts → lib/lookup.ts} +129 -141
- package/lib/nsul/index.ts +8 -0
- package/lib/nsul/lookup.ts +144 -0
- package/lib/nsul/schema.ts +130 -0
- package/{place-importance-schema.ts → lib/place-importance-schema.ts} +7 -8
- package/lib/poi/index.ts +8 -0
- package/{poi-lookup.ts → lib/poi/lookup.ts} +22 -28
- package/{poi-schema.ts → lib/poi/schema.ts} +3 -4
- package/{postal-city-alias-lookup.ts → lib/postal/city-alias-lookup.ts} +14 -20
- package/{postal-city-candidate-schema.ts → lib/postal/city-candidate-schema.ts} +2 -2
- package/lib/postal/index.ts +9 -0
- package/{postcode-point-lookup.ts → lib/postcode-point-lookup.ts} +17 -15
- package/{primary-preference.ts → lib/primary-preference.ts} +29 -10
- package/{proximity-rerank.ts → lib/proximity-rerank.ts} +2 -2
- package/{ranking-weights.ts → lib/ranking-weights.ts} +30 -4
- package/{region-keys.ts → lib/region-keys.ts} +9 -9
- package/{reverse.ts → lib/reverse.ts} +34 -46
- package/{schema.ts → lib/schema.ts} +10 -0
- package/{search-fetch.ts → lib/search-fetch.ts} +29 -28
- package/{sqlite-convention-source.ts → lib/sqlite-convention-source.ts} +9 -10
- package/{sqlite-utils.ts → lib/sqlite-utils.ts} +14 -18
- package/{street-centroid-schema.ts → lib/street/centroid-schema.ts} +5 -5
- package/{street-centroid.ts → lib/street/centroid.ts} +14 -21
- package/lib/street/index.ts +13 -0
- package/{street-morphology-fst-builder.ts → lib/street/morphology-fst-builder.ts} +24 -14
- package/{street-morphology-fst-loader.ts → lib/street/morphology-fst-loader.ts} +14 -12
- package/{street-name-lookup.ts → lib/street/name-lookup.ts} +14 -30
- package/{street-normalize.ts → lib/street/normalize.ts} +44 -19
- package/{street-segment-schema.ts → lib/street/segment-schema.ts} +7 -7
- package/{types.ts → lib/types.ts} +18 -12
- package/{unified-schema.ts → lib/unified-schema.ts} +20 -24
- package/lib/uprn/existence.ts +84 -0
- package/lib/uprn/index.ts +9 -0
- package/{uprn-lookup.ts → lib/uprn/lookup.ts} +14 -18
- package/{uprn-schema.ts → lib/uprn/schema.ts} +3 -3
- package/lib/weights-overlay-linker.ts +878 -0
- package/out/address/index.d.ts +9 -0
- package/out/address/index.d.ts.map +1 -0
- package/out/address/index.js +9 -0
- package/out/address/index.js.map +1 -0
- package/out/{address-point-interpolation.d.ts → address/point-interpolation.d.ts} +11 -10
- package/out/address/point-interpolation.d.ts.map +1 -0
- package/out/{address-point-interpolation.js → address/point-interpolation.js} +18 -18
- package/out/address/point-interpolation.js.map +1 -0
- package/out/{address-point-schema.d.ts → address/point-schema.d.ts} +16 -6
- package/out/address/point-schema.d.ts.map +1 -0
- package/out/{address-point-schema.js → address/point-schema.js} +7 -3
- package/out/address/point-schema.js.map +1 -0
- package/out/{address-point.d.ts → address/point.d.ts} +16 -8
- package/out/address/point.d.ts.map +1 -0
- package/out/{address-point.js → address/point.js} +71 -20
- package/out/address/point.js.map +1 -0
- package/out/{ancestry-backfill.d.ts → ancestry/backfill.d.ts} +7 -5
- package/out/ancestry/backfill.d.ts.map +1 -0
- package/out/{ancestry-backfill.js → ancestry/backfill.js} +12 -16
- package/out/ancestry/backfill.js.map +1 -0
- package/out/{ancestry.d.ts → ancestry/index.d.ts} +4 -3
- package/out/ancestry/index.d.ts.map +1 -0
- package/out/{ancestry.js → ancestry/index.js} +3 -2
- package/out/ancestry/index.js.map +1 -0
- package/out/build-candidate.d.ts +30 -24
- package/out/build-candidate.d.ts.map +1 -1
- package/out/build-candidate.js +50 -52
- package/out/build-candidate.js.map +1 -1
- package/out/build-slim.d.ts +4 -4
- package/out/build-slim.d.ts.map +1 -1
- package/out/build-slim.js +124 -139
- package/out/build-slim.js.map +1 -1
- package/out/candidate/alias-bags.d.ts +5 -3
- package/out/candidate/alias-bags.d.ts.map +1 -1
- package/out/candidate/alias-bags.js +2 -2
- package/out/candidate/alias-bags.js.map +1 -1
- package/out/candidate/ancestors-sidecar.d.ts +9 -10
- package/out/candidate/ancestors-sidecar.d.ts.map +1 -1
- package/out/candidate/ancestors-sidecar.js +7 -7
- package/out/candidate/ancestors-sidecar.js.map +1 -1
- package/out/candidate/country-display-names.d.ts +1 -1
- package/out/candidate/country-display-names.d.ts.map +1 -1
- package/out/candidate/country-display-names.js +1 -1
- package/out/candidate/country-display-names.js.map +1 -1
- package/out/candidate/extract-fold.d.ts +32 -0
- package/out/candidate/extract-fold.d.ts.map +1 -0
- package/out/candidate/{shard-fold.js → extract-fold.js} +20 -20
- package/out/candidate/extract-fold.js.map +1 -0
- package/out/candidate/name-roles.d.ts +13 -11
- package/out/candidate/name-roles.d.ts.map +1 -1
- package/out/candidate/name-roles.js +11 -10
- package/out/candidate/name-roles.js.map +1 -1
- package/out/candidate/own-name.d.ts +1 -1
- package/out/candidate/own-name.d.ts.map +1 -1
- package/out/candidate/own-name.js +1 -1
- package/out/candidate/own-name.js.map +1 -1
- package/out/candidate/place-attrs.d.ts +3 -3
- package/out/candidate/place-attrs.d.ts.map +1 -1
- package/out/candidate/place-attrs.js +1 -1
- package/out/candidate/place-attrs.js.map +1 -1
- package/out/candidate-ancestors-schema.d.ts +4 -4
- package/out/candidate-ancestors-schema.d.ts.map +1 -1
- package/out/candidate-ancestors-schema.js +2 -2
- package/out/candidate-ancestors-schema.js.map +1 -1
- package/out/candidate-fts.d.ts +3 -3
- package/out/candidate-fts.d.ts.map +1 -1
- package/out/candidate-fts.js +1 -1
- package/out/candidate-fts.js.map +1 -1
- package/out/candidate-importance.d.ts +16 -16
- package/out/candidate-importance.d.ts.map +1 -1
- package/out/candidate-importance.js +46 -51
- package/out/candidate-importance.js.map +1 -1
- package/out/candidate-lookup.d.ts +11 -9
- package/out/candidate-lookup.d.ts.map +1 -1
- package/out/candidate-lookup.js +61 -58
- package/out/candidate-lookup.js.map +1 -1
- package/out/candidate-schema.d.ts +5 -5
- package/out/candidate-schema.d.ts.map +1 -1
- package/out/candidate-schema.js.map +1 -1
- package/out/candidate-scoring.d.ts +7 -7
- package/out/candidate-scoring.d.ts.map +1 -1
- package/out/candidate-scoring.js +10 -14
- package/out/candidate-scoring.js.map +1 -1
- package/out/capital-schema.d.ts +3 -3
- package/out/capital-schema.d.ts.map +1 -1
- package/out/capital-schema.js +2 -2
- package/out/capital-schema.js.map +1 -1
- package/out/capitals.d.ts +1 -1
- package/out/capitals.d.ts.map +1 -1
- package/out/capitals.js +2 -2
- package/out/capitals.js.map +1 -1
- package/out/coincident-roles.d.ts +6 -5
- package/out/coincident-roles.d.ts.map +1 -1
- package/out/coincident-roles.js +2 -4
- package/out/coincident-roles.js.map +1 -1
- package/out/{convention.d.ts → convention/index.d.ts} +4 -4
- package/out/convention/index.d.ts.map +1 -0
- package/out/{convention.js → convention/index.js} +2 -2
- package/out/convention/index.js.map +1 -0
- package/out/{convention-schema.d.ts → convention/schema.d.ts} +2 -2
- package/out/convention/schema.d.ts.map +1 -0
- package/out/{convention-schema.js → convention/schema.js} +3 -3
- package/out/convention/schema.js.map +1 -0
- package/out/coverage-manifest-schema.d.ts +8 -8
- package/out/coverage-manifest-schema.d.ts.map +1 -1
- package/out/coverage-manifest-schema.js +4 -4
- package/out/coverage-manifest-schema.js.map +1 -1
- package/out/currency-backfill.d.ts +51 -7
- package/out/currency-backfill.d.ts.map +1 -1
- package/out/currency-backfill.js +65 -49
- package/out/currency-backfill.js.map +1 -1
- package/out/env.d.ts +43 -0
- package/out/env.d.ts.map +1 -0
- package/out/env.js +48 -0
- package/out/env.js.map +1 -0
- package/out/exact-match.d.ts +5 -5
- package/out/exact-match.d.ts.map +1 -1
- package/out/exact-match.js +10 -11
- package/out/exact-match.js.map +1 -1
- package/out/extracts.d.ts +114 -0
- package/out/extracts.d.ts.map +1 -0
- package/out/{sharding.js → extracts.js} +38 -38
- package/out/extracts.js.map +1 -0
- package/out/{fst-autocomplete.d.ts → fst/autocomplete.d.ts} +2 -2
- package/out/fst/autocomplete.d.ts.map +1 -0
- package/out/{fst-autocomplete.js → fst/autocomplete.js} +3 -3
- package/out/fst/autocomplete.js.map +1 -0
- package/out/{fst-builder.d.ts → fst/builder.d.ts} +5 -5
- package/out/fst/builder.d.ts.map +1 -0
- package/out/{fst-builder.js → fst/builder.js} +14 -13
- package/out/fst/builder.js.map +1 -0
- package/out/{fst-deserialize-web.d.ts → fst/deserialize-web.d.ts} +3 -3
- package/out/fst/deserialize-web.d.ts.map +1 -0
- package/out/{fst-deserialize-web.js → fst/deserialize-web.js} +10 -74
- package/out/fst/deserialize-web.js.map +1 -0
- package/out/fst/format.d.ts +80 -0
- package/out/fst/format.d.ts.map +1 -0
- package/out/fst/format.js +91 -0
- package/out/fst/format.js.map +1 -0
- package/out/{fst-freshness.d.ts → fst/freshness.d.ts} +10 -13
- package/out/fst/freshness.d.ts.map +1 -0
- package/out/{fst-freshness.js → fst/freshness.js} +41 -73
- package/out/fst/freshness.js.map +1 -0
- package/out/fst/index.d.ts +14 -0
- package/out/fst/index.d.ts.map +1 -0
- package/out/fst/index.js +14 -0
- package/out/fst/index.js.map +1 -0
- package/out/{fst-matcher.d.ts → fst/matcher.d.ts} +2 -2
- package/out/fst/matcher.d.ts.map +1 -0
- package/out/{fst-matcher.js → fst/matcher.js} +1 -1
- package/out/fst/matcher.js.map +1 -0
- package/out/{fst-serialize.d.ts → fst/serialize.d.ts} +5 -10
- package/out/fst/serialize.d.ts.map +1 -0
- package/out/{fst-serialize.js → fst/serialize.js} +18 -98
- package/out/fst/serialize.js.map +1 -0
- package/out/{fst-types.d.ts → fst/types.d.ts} +4 -3
- package/out/fst/types.d.ts.map +1 -0
- package/out/{fst-types.js → fst/types.js} +1 -1
- package/out/fst/types.js.map +1 -0
- package/out/{fts.d.ts → fts/index.d.ts} +16 -9
- package/out/fts/index.d.ts.map +1 -0
- package/out/{fts.js → fts/index.js} +16 -11
- package/out/fts/index.js.map +1 -0
- package/out/{fts-query.d.ts → fts/query.d.ts} +2 -2
- package/out/fts/query.d.ts.map +1 -0
- package/out/{fts-query.js → fts/query.js} +1 -1
- package/out/fts/query.js.map +1 -0
- package/out/{geonames-aliases.d.ts → geonames/aliases.d.ts} +8 -6
- package/out/geonames/aliases.d.ts.map +1 -0
- package/out/{geonames-aliases.js → geonames/aliases.js} +7 -7
- package/out/geonames/aliases.js.map +1 -0
- package/out/geonames/index.d.ts +8 -0
- package/out/geonames/index.d.ts.map +1 -0
- package/out/geonames/index.js +8 -0
- package/out/geonames/index.js.map +1 -0
- package/out/{geonames-postal.d.ts → geonames/postal.d.ts} +10 -8
- package/out/geonames/postal.d.ts.map +1 -0
- package/out/{geonames-postal.js → geonames/postal.js} +9 -9
- package/out/geonames/postal.js.map +1 -0
- package/out/index.d.ts +32 -32
- package/out/index.d.ts.map +1 -1
- package/out/index.js +24 -24
- package/out/index.js.map +1 -1
- package/out/interpolation.d.ts +10 -9
- package/out/interpolation.d.ts.map +1 -1
- package/out/interpolation.js +20 -20
- package/out/interpolation.js.map +1 -1
- package/out/lookup.d.ts +21 -20
- package/out/lookup.d.ts.map +1 -1
- package/out/lookup.js +102 -112
- package/out/lookup.js.map +1 -1
- package/out/name-score.d.ts.map +1 -1
- package/out/name-score.js.map +1 -1
- package/out/nsul/index.d.ts +8 -0
- package/out/nsul/index.d.ts.map +1 -0
- package/out/nsul/index.js +8 -0
- package/out/nsul/index.js.map +1 -0
- package/out/nsul/lookup.d.ts +83 -0
- package/out/nsul/lookup.d.ts.map +1 -0
- package/out/nsul/lookup.js +80 -0
- package/out/nsul/lookup.js.map +1 -0
- package/out/nsul/schema.d.ts +100 -0
- package/out/nsul/schema.d.ts.map +1 -0
- package/out/nsul/schema.js +78 -0
- package/out/nsul/schema.js.map +1 -0
- package/out/place-importance-schema.d.ts +5 -5
- package/out/place-importance-schema.d.ts.map +1 -1
- package/out/place-importance-schema.js +3 -3
- package/out/place-importance-schema.js.map +1 -1
- package/out/poi/index.d.ts +8 -0
- package/out/poi/index.d.ts.map +1 -0
- package/out/poi/index.js +8 -0
- package/out/poi/index.js.map +1 -0
- package/out/{poi-lookup.d.ts → poi/lookup.d.ts} +8 -10
- package/out/poi/lookup.d.ts.map +1 -0
- package/out/{poi-lookup.js → poi/lookup.js} +14 -18
- package/out/poi/lookup.js.map +1 -0
- package/out/{poi-schema.d.ts → poi/schema.d.ts} +4 -4
- package/out/poi/schema.d.ts.map +1 -0
- package/out/{poi-schema.js → poi/schema.js} +1 -1
- package/out/poi/schema.js.map +1 -0
- package/out/polygon-schema.d.ts.map +1 -1
- package/out/polygon-schema.js.map +1 -1
- package/out/{postal-city-alias-lookup.d.ts → postal/city-alias-lookup.d.ts} +6 -5
- package/out/postal/city-alias-lookup.d.ts.map +1 -0
- package/out/{postal-city-alias-lookup.js → postal/city-alias-lookup.js} +11 -15
- package/out/postal/city-alias-lookup.js.map +1 -0
- package/out/{postal-city-alias-schema.d.ts → postal/city-alias-schema.d.ts} +1 -1
- package/out/{postal-city-alias-schema.d.ts.map → postal/city-alias-schema.d.ts.map} +1 -1
- package/out/{postal-city-alias-schema.js → postal/city-alias-schema.js} +1 -1
- package/out/{postal-city-alias-schema.js.map → postal/city-alias-schema.js.map} +1 -1
- package/out/{postal-city-candidate-schema.d.ts → postal/city-candidate-schema.d.ts} +3 -3
- package/out/{postal-city-candidate-schema.d.ts.map → postal/city-candidate-schema.d.ts.map} +1 -1
- package/out/{postal-city-candidate-schema.js → postal/city-candidate-schema.js} +2 -2
- package/out/{postal-city-candidate-schema.js.map → postal/city-candidate-schema.js.map} +1 -1
- package/out/postal/index.d.ts +9 -0
- package/out/postal/index.d.ts.map +1 -0
- package/out/postal/index.js +9 -0
- package/out/postal/index.js.map +1 -0
- package/out/postcode-point-lookup.d.ts +10 -10
- package/out/postcode-point-lookup.d.ts.map +1 -1
- package/out/postcode-point-lookup.js +13 -13
- package/out/postcode-point-lookup.js.map +1 -1
- package/out/primary-preference.d.ts +13 -5
- package/out/primary-preference.d.ts.map +1 -1
- package/out/primary-preference.js +16 -8
- package/out/primary-preference.js.map +1 -1
- package/out/proximity-rerank.d.ts +2 -2
- package/out/proximity-rerank.d.ts.map +1 -1
- package/out/proximity-rerank.js +2 -2
- package/out/proximity-rerank.js.map +1 -1
- package/out/ranking-weights.d.ts +15 -3
- package/out/ranking-weights.d.ts.map +1 -1
- package/out/ranking-weights.js +21 -3
- package/out/ranking-weights.js.map +1 -1
- package/out/region-keys.d.ts +8 -8
- package/out/region-keys.d.ts.map +1 -1
- package/out/region-keys.js +9 -9
- package/out/region-keys.js.map +1 -1
- package/out/reverse.d.ts +6 -6
- package/out/reverse.d.ts.map +1 -1
- package/out/reverse.js +20 -29
- package/out/reverse.js.map +1 -1
- package/out/schema.d.ts +9 -0
- package/out/schema.d.ts.map +1 -1
- package/out/schema.js.map +1 -1
- package/out/search-fetch.d.ts +12 -10
- package/out/search-fetch.d.ts.map +1 -1
- package/out/search-fetch.js +21 -20
- package/out/search-fetch.js.map +1 -1
- package/out/sqlite-convention-source.d.ts +7 -7
- package/out/sqlite-convention-source.d.ts.map +1 -1
- package/out/sqlite-convention-source.js +5 -5
- package/out/sqlite-convention-source.js.map +1 -1
- package/out/sqlite-utils.d.ts +8 -8
- package/out/sqlite-utils.d.ts.map +1 -1
- package/out/sqlite-utils.js +7 -8
- package/out/sqlite-utils.js.map +1 -1
- package/out/{street-centroid-schema.d.ts → street/centroid-schema.d.ts} +6 -6
- package/out/{street-centroid-schema.d.ts.map → street/centroid-schema.d.ts.map} +1 -1
- package/out/{street-centroid-schema.js → street/centroid-schema.js} +5 -5
- package/out/{street-centroid-schema.js.map → street/centroid-schema.js.map} +1 -1
- package/out/{street-centroid.d.ts → street/centroid.d.ts} +6 -6
- package/out/street/centroid.d.ts.map +1 -0
- package/out/{street-centroid.js → street/centroid.js} +13 -19
- package/out/street/centroid.js.map +1 -0
- package/out/street/index.d.ts +13 -0
- package/out/street/index.d.ts.map +1 -0
- package/out/street/index.js +13 -0
- package/out/street/index.js.map +1 -0
- package/out/{street-morphology-fst-builder.d.ts → street/morphology-fst-builder.d.ts} +4 -4
- package/out/street/morphology-fst-builder.d.ts.map +1 -0
- package/out/{street-morphology-fst-builder.js → street/morphology-fst-builder.js} +18 -13
- package/out/street/morphology-fst-builder.js.map +1 -0
- package/out/{street-morphology-fst-loader.d.ts → street/morphology-fst-loader.d.ts} +5 -5
- package/out/street/morphology-fst-loader.d.ts.map +1 -0
- package/out/{street-morphology-fst-loader.js → street/morphology-fst-loader.js} +11 -10
- package/out/street/morphology-fst-loader.js.map +1 -0
- package/out/{street-name-lookup.d.ts → street/name-lookup.d.ts} +4 -7
- package/out/street/name-lookup.d.ts.map +1 -0
- package/out/{street-name-lookup.js → street/name-lookup.js} +9 -23
- package/out/street/name-lookup.js.map +1 -0
- package/out/{street-normalize.d.ts → street/normalize.d.ts} +25 -14
- package/out/street/normalize.d.ts.map +1 -0
- package/out/{street-normalize.js → street/normalize.js} +36 -17
- package/out/street/normalize.js.map +1 -0
- package/out/{street-segment-schema.d.ts → street/segment-schema.d.ts} +8 -8
- package/out/{street-segment-schema.d.ts.map → street/segment-schema.d.ts.map} +1 -1
- package/out/{street-segment-schema.js → street/segment-schema.js} +4 -4
- package/out/{street-segment-schema.js.map → street/segment-schema.js.map} +1 -1
- package/out/types.d.ts +18 -12
- package/out/types.d.ts.map +1 -1
- package/out/types.js.map +1 -1
- package/out/unified-schema.d.ts +5 -4
- package/out/unified-schema.d.ts.map +1 -1
- package/out/unified-schema.js +15 -18
- package/out/unified-schema.js.map +1 -1
- package/out/uprn/existence.d.ts +53 -0
- package/out/uprn/existence.d.ts.map +1 -0
- package/out/uprn/existence.js +61 -0
- package/out/uprn/existence.js.map +1 -0
- package/out/uprn/index.d.ts +9 -0
- package/out/uprn/index.d.ts.map +1 -0
- package/out/uprn/index.js +9 -0
- package/out/uprn/index.js.map +1 -0
- package/out/{uprn-lookup.d.ts → uprn/lookup.d.ts} +4 -4
- package/out/uprn/lookup.d.ts.map +1 -0
- package/out/{uprn-lookup.js → uprn/lookup.js} +11 -14
- package/out/uprn/lookup.js.map +1 -0
- package/out/{uprn-schema.d.ts → uprn/schema.d.ts} +4 -4
- package/out/uprn/schema.d.ts.map +1 -0
- package/out/{uprn-schema.js → uprn/schema.js} +4 -4
- package/out/uprn/schema.js.map +1 -0
- package/out/weights-overlay-linker.d.ts +184 -26
- package/out/weights-overlay-linker.d.ts.map +1 -1
- package/out/weights-overlay-linker.js +338 -86
- package/out/weights-overlay-linker.js.map +1 -1
- package/package.json +465 -269
- 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.map +0 -1
- package/out/address-point-schema.js.map +0 -1
- package/out/address-point.d.ts.map +0 -1
- package/out/address-point.js.map +0 -1
- package/out/ancestry-backfill.d.ts.map +0 -1
- package/out/ancestry-backfill.js.map +0 -1
- package/out/ancestry.d.ts.map +0 -1
- package/out/ancestry.js.map +0 -1
- package/out/candidate/shard-fold.d.ts +0 -31
- package/out/candidate/shard-fold.d.ts.map +0 -1
- package/out/candidate/shard-fold.js.map +0 -1
- package/out/convention-schema.d.ts.map +0 -1
- package/out/convention-schema.js.map +0 -1
- package/out/convention.d.ts.map +0 -1
- package/out/convention.js.map +0 -1
- package/out/fst-autocomplete.d.ts.map +0 -1
- package/out/fst-autocomplete.js.map +0 -1
- package/out/fst-builder.d.ts.map +0 -1
- package/out/fst-builder.js.map +0 -1
- package/out/fst-deserialize-web.d.ts.map +0 -1
- package/out/fst-deserialize-web.js.map +0 -1
- package/out/fst-freshness.d.ts.map +0 -1
- package/out/fst-freshness.js.map +0 -1
- package/out/fst-matcher.d.ts.map +0 -1
- package/out/fst-matcher.js.map +0 -1
- package/out/fst-serialize.d.ts.map +0 -1
- package/out/fst-serialize.js.map +0 -1
- package/out/fst-types.d.ts.map +0 -1
- package/out/fst-types.js.map +0 -1
- package/out/fts-query.d.ts.map +0 -1
- package/out/fts-query.js.map +0 -1
- package/out/fts.d.ts.map +0 -1
- package/out/fts.js.map +0 -1
- package/out/geonames-aliases.d.ts.map +0 -1
- package/out/geonames-aliases.js.map +0 -1
- package/out/geonames-postal.d.ts.map +0 -1
- package/out/geonames-postal.js.map +0 -1
- package/out/poi-lookup.d.ts.map +0 -1
- package/out/poi-lookup.js.map +0 -1
- package/out/poi-schema.d.ts.map +0 -1
- package/out/poi-schema.js.map +0 -1
- package/out/postal-city-alias-lookup.d.ts.map +0 -1
- package/out/postal-city-alias-lookup.js.map +0 -1
- package/out/sharding.d.ts +0 -114
- package/out/sharding.d.ts.map +0 -1
- package/out/sharding.js.map +0 -1
- package/out/street-centroid.d.ts.map +0 -1
- package/out/street-centroid.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.map +0 -1
- package/out/street-morphology-fst-loader.js.map +0 -1
- package/out/street-name-lookup.d.ts.map +0 -1
- package/out/street-name-lookup.js.map +0 -1
- package/out/street-normalize.d.ts.map +0 -1
- package/out/street-normalize.js.map +0 -1
- package/out/uprn-lookup.d.ts.map +0 -1
- package/out/uprn-lookup.js.map +0 -1
- package/out/uprn-schema.d.ts.map +0 -1
- package/out/uprn-schema.js.map +0 -1
- package/weights-overlay-linker.ts +0 -377
- /package/{name-score.ts → lib/name-score.ts} +0 -0
- /package/{polygon-schema.ts → lib/polygon-schema.ts} +0 -0
- /package/{postal-city-alias-schema.ts → lib/postal/city-alias-schema.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/address/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,uBAAuB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/address/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,8BAA8B,CAAA;AAC5C,cAAc,uBAAuB,CAAA"}
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
* Address-point interpolation — "Method 2" of the resolution ladder (#483, Phase 1 of
|
|
7
7
|
* `docs/articles/plan/2026-06-11-resolution-ladder.md`): when the exact address-point tier (#476)
|
|
8
8
|
* misses a house number, bracket the number with REAL neighbor points on the same street from the
|
|
9
|
-
* same #476
|
|
10
|
-
* replaces TIGER's uniform-spacing assumption — the dominant error term of the TIGER pilot's
|
|
9
|
+
* same #476 extract and interpolate linearly in house-number space between them. Real occupancy
|
|
10
|
+
* replaces TIGER's uniform-spacing assumption — the dominant error term of the TIGER pilot's check
|
|
11
11
|
* miss; TIGER range interpolation (`StreetInterpolator`) demotes to the fallback for streets too
|
|
12
12
|
* sparse to bracket.
|
|
13
13
|
*
|
|
14
14
|
* Matching key is `street_key` — THE shared normalizer plus the route fold
|
|
15
|
-
* (`canonicalizeRouteKey`), identical at build time (`scripts/build-address-point-
|
|
15
|
+
* (`canonicalizeRouteKey`), identical at build time (`scripts/build-address-point-extract.ts`) and
|
|
16
16
|
* query time, by construction. Scope is postcode-first like the segment tier; a query without a
|
|
17
17
|
* postcode goes straight to the fallback (which carries its own statewide-ambiguity abstention).
|
|
18
18
|
*
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
*
|
|
21
21
|
* - Neighbor candidates NEVER include the queried number itself (any unit/duplicate row of it) — in
|
|
22
22
|
* production the exact tier would already have answered an on-file number, and in the eval
|
|
23
|
-
* this is what makes grading against the same
|
|
23
|
+
* this is what makes grading against the same extract non-circular by construction.
|
|
24
24
|
* - Both-sided bracket (`bracket: "both"`): linear interpolation between the nearest known number
|
|
25
25
|
* below and above; `uncertaintyM` = half the distance between them.
|
|
26
26
|
* - Single-sided (`bracket: "single"`): linear extrapolation along the two nearest known numbers on
|
|
@@ -32,17 +32,18 @@
|
|
|
32
32
|
*
|
|
33
33
|
* Standalone like the segment tier — core wiring rides the Phase 2 ordered `spatialTiers` list.
|
|
34
34
|
*/
|
|
35
|
-
import { DatabaseSync } from "node:sqlite";
|
|
36
35
|
import type { InterpolationLookup } from "@mailwoman/resolver";
|
|
37
|
-
import
|
|
38
|
-
|
|
36
|
+
import { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
37
|
+
import type { AddressPointDatabase } from "#address/point-schema";
|
|
38
|
+
import type { InterpolatedHit, InterpolationQuery, StreetInterpolator } from "#interpolation";
|
|
39
|
+
export declare class AddressPointInterpolator<DB extends AddressPointDatabase = AddressPointDatabase> implements InterpolationLookup {
|
|
39
40
|
#private;
|
|
40
41
|
constructor(opts: {
|
|
41
42
|
dbPath?: string;
|
|
42
|
-
database?:
|
|
43
|
+
database?: DatabaseClient<DB>;
|
|
43
44
|
fallback?: StreetInterpolator;
|
|
44
45
|
});
|
|
45
46
|
find(query: InterpolationQuery): InterpolatedHit | null;
|
|
46
|
-
|
|
47
|
+
[Symbol.dispose](): void;
|
|
47
48
|
}
|
|
48
|
-
//# sourceMappingURL=
|
|
49
|
+
//# sourceMappingURL=point-interpolation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"point-interpolation.d.ts","sourceRoot":"","sources":["../../lib/address/point-interpolation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AA6B7F,qBAAa,wBAAwB,CACpC,EAAE,SAAS,oBAAoB,GAAG,oBAAoB,CACrD,YAAW,mBAAmB;;gBAUnB,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;KAAE;IA2BnG,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,eAAe,GAAG,IAAI;IAyBvD,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAGxB"}
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
* Address-point interpolation — "Method 2" of the resolution ladder (#483, Phase 1 of
|
|
7
7
|
* `docs/articles/plan/2026-06-11-resolution-ladder.md`): when the exact address-point tier (#476)
|
|
8
8
|
* misses a house number, bracket the number with REAL neighbor points on the same street from the
|
|
9
|
-
* same #476
|
|
10
|
-
* replaces TIGER's uniform-spacing assumption — the dominant error term of the TIGER pilot's
|
|
9
|
+
* same #476 extract and interpolate linearly in house-number space between them. Real occupancy
|
|
10
|
+
* replaces TIGER's uniform-spacing assumption — the dominant error term of the TIGER pilot's check
|
|
11
11
|
* miss; TIGER range interpolation (`StreetInterpolator`) demotes to the fallback for streets too
|
|
12
12
|
* sparse to bracket.
|
|
13
13
|
*
|
|
14
14
|
* Matching key is `street_key` — THE shared normalizer plus the route fold
|
|
15
|
-
* (`canonicalizeRouteKey`), identical at build time (`scripts/build-address-point-
|
|
15
|
+
* (`canonicalizeRouteKey`), identical at build time (`scripts/build-address-point-extract.ts`) and
|
|
16
16
|
* query time, by construction. Scope is postcode-first like the segment tier; a query without a
|
|
17
17
|
* postcode goes straight to the fallback (which carries its own statewide-ambiguity abstention).
|
|
18
18
|
*
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
*
|
|
21
21
|
* - Neighbor candidates NEVER include the queried number itself (any unit/duplicate row of it) — in
|
|
22
22
|
* production the exact tier would already have answered an on-file number, and in the eval
|
|
23
|
-
* this is what makes grading against the same
|
|
23
|
+
* this is what makes grading against the same extract non-circular by construction.
|
|
24
24
|
* - Both-sided bracket (`bracket: "both"`): linear interpolation between the nearest known number
|
|
25
25
|
* below and above; `uncertaintyM` = half the distance between them.
|
|
26
26
|
* - Single-sided (`bracket: "single"`): linear extrapolation along the two nearest known numbers on
|
|
@@ -32,10 +32,10 @@
|
|
|
32
32
|
*
|
|
33
33
|
* Standalone like the segment tier — core wiring rides the Phase 2 ordered `spatialTiers` list.
|
|
34
34
|
*/
|
|
35
|
-
import { DatabaseSync } from "node:sqlite";
|
|
36
35
|
import { haversineKm } from "@mailwoman/spatial";
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
36
|
+
import { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
37
|
+
import { hasTable, prepareAll } from "#sqlite-utils";
|
|
38
|
+
import { canonicalizeRouteKey, streetKeyVariants } from "#street/normalize";
|
|
39
39
|
/**
|
|
40
40
|
* Extrapolation cap for a single-sided bracket: at most one pair-span beyond the nearest known point (`t = 2`). Past
|
|
41
41
|
* it, the two-point line carries no evidence about the query number.
|
|
@@ -43,23 +43,25 @@ import { canonicalizeRouteKey, streetKeyVariants } from "./street-normalize.js";
|
|
|
43
43
|
const MAX_EXTRAPOLATION_T = 2;
|
|
44
44
|
export class AddressPointInterpolator {
|
|
45
45
|
#db;
|
|
46
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Resources this instance opened. A connection handed in by a caller is NOT in here, so disposal cannot reach it —
|
|
48
|
+
* ownership is membership rather than a flag a later branch has to check.
|
|
49
|
+
*/
|
|
50
|
+
#resources = new DisposableStack();
|
|
47
51
|
#fallback;
|
|
48
52
|
#byPostcode;
|
|
49
53
|
constructor(opts) {
|
|
50
54
|
if (opts.database) {
|
|
51
55
|
this.#db = opts.database;
|
|
52
|
-
this.#ownsDB = false;
|
|
53
56
|
}
|
|
54
57
|
else if (opts.dbPath) {
|
|
55
|
-
this.#db = new
|
|
56
|
-
this.#ownsDB = true;
|
|
58
|
+
this.#db = this.#resources.use(new DatabaseClient(opts.dbPath, { readOnly: true }));
|
|
57
59
|
}
|
|
58
60
|
else {
|
|
59
61
|
throw new Error("AddressPointInterpolator: one of dbPath or database is required");
|
|
60
62
|
}
|
|
61
63
|
this.#fallback = opts.fallback;
|
|
62
|
-
// Degrade gracefully on an empty/tableless
|
|
64
|
+
// Degrade gracefully on an empty/tableless extract (#568): with no `address_point` table this tier
|
|
63
65
|
// is skipped, deferring to the segment fallback rather than crashing at construction.
|
|
64
66
|
if (hasTable(this.#db, "address_point")) {
|
|
65
67
|
// Strictly-numeric neighbor numbers on the route-folded street key within the ZIP. The
|
|
@@ -76,7 +78,7 @@ export class AddressPointInterpolator {
|
|
|
76
78
|
if (!/^\d+$/.test(numberRaw))
|
|
77
79
|
return null;
|
|
78
80
|
const n = Number(numberRaw);
|
|
79
|
-
// No own table (empty
|
|
81
|
+
// No own table (empty extract) or no postcode → defer to the segment fallback rather than query.
|
|
80
82
|
if (!this.#byPostcode || !query.postcode)
|
|
81
83
|
return this.#fallback?.find(query) ?? null;
|
|
82
84
|
// Key-variant ladder (see `streetKeyVariants`) — same probe order as the exact-point reader.
|
|
@@ -90,10 +92,8 @@ export class AddressPointInterpolator {
|
|
|
90
92
|
const hit = rows.length >= 2 ? interpolateFromNeighbors(rows, n) : null;
|
|
91
93
|
return hit ?? this.#fallback?.find(query) ?? null;
|
|
92
94
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
this.#db.close();
|
|
96
|
-
}
|
|
95
|
+
[Symbol.dispose]() {
|
|
96
|
+
this.#resources[Symbol.dispose]();
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
@@ -173,4 +173,4 @@ function interpolateFromNeighbors(rows, n) {
|
|
|
173
173
|
release: near.release,
|
|
174
174
|
};
|
|
175
175
|
}
|
|
176
|
-
//# sourceMappingURL=
|
|
176
|
+
//# sourceMappingURL=point-interpolation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"point-interpolation.js","sourceRoot":"","sources":["../../lib/address/point-interpolation.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* Typed schema for the SITUS / rooftop ADDRESS-POINT
|
|
7
|
-
* by `scripts/build-address-point-
|
|
6
|
+
* Typed schema for the SITUS / rooftop ADDRESS-POINT extracts (`address-points-<cc>-<slug>.db`, built
|
|
7
|
+
* by `scripts/build-address-point-extract.ts` — the #476/#567 national rooftop tier behind the
|
|
8
8
|
* demo's "type any US address, get the building"). Single source of truth for the columns shared
|
|
9
9
|
* by the BUILDER and the READER ({@link AddressPointSqliteLookup}), so a column rename in one is a
|
|
10
10
|
* compile error in the other.
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* schema guards the contract; positional inserts keep the speed.)
|
|
17
17
|
*/
|
|
18
18
|
import type { Kysely } from "kysely";
|
|
19
|
-
import type { NameKey, RouteKey, StreetKey } from "
|
|
19
|
+
import type { NameKey, RouteKey, StreetKey } from "#street/normalize";
|
|
20
20
|
/**
|
|
21
21
|
* One rooftop address point. `(street_norm, number)` within a `postcode` (preferred) or `locality_norm` scope is the
|
|
22
22
|
* lookup; `street_key` is the #483 route-fold key for interpolation. Coordinates are non-null (the builder drops
|
|
@@ -56,6 +56,16 @@ export interface AddressPointTable {
|
|
|
56
56
|
* The pinned data release the point was ingested from.
|
|
57
57
|
*/
|
|
58
58
|
release: string;
|
|
59
|
+
/**
|
|
60
|
+
* The source register's stable administrative key for the point's commune or municipality — BAN's `code_insee`. A
|
|
61
|
+
* display name (`locality_norm`) is not a key; the coverage basis is computed per THIS.
|
|
62
|
+
*/
|
|
63
|
+
admin_code: string | null;
|
|
64
|
+
/**
|
|
65
|
+
* The register's own certification flag for the point (BAN `certification_commune`: 1 certified by the commune, 0
|
|
66
|
+
* not), or null for a source that states none. A basis is never inferred from a share of these.
|
|
67
|
+
*/
|
|
68
|
+
certified: number | null;
|
|
59
69
|
}
|
|
60
70
|
/**
|
|
61
71
|
* The address-point database schema for `new DatabaseClient<AddressPointDatabase>(...)`.
|
|
@@ -66,7 +76,7 @@ export interface AddressPointDatabase {
|
|
|
66
76
|
/**
|
|
67
77
|
* The slice of a Kysely handle the `address_point` DDL touches — the parameter type its builders take.
|
|
68
78
|
*
|
|
69
|
-
* Kysely is invariant in its schema parameter (the incompatibility is in `transaction()`), so a
|
|
79
|
+
* Kysely is invariant in its schema parameter (the incompatibility is in `transaction()`), so a extract that EXTENDS
|
|
70
80
|
* `AddressPointTable` — OSM adds `h3_cell` — cannot pass its own handle to a `Kysely<AddressPointDatabase>` parameter.
|
|
71
81
|
* Naming only `schema` lets it, and the DDL below needs nothing else.
|
|
72
82
|
*/
|
|
@@ -75,7 +85,7 @@ export type AddressPointSchemaHandle = Pick<Kysely<AddressPointDatabase>, "schem
|
|
|
75
85
|
* The `address_point` columns in INSERT order. The builder's positional prepared statement derives its placeholder list
|
|
76
86
|
* from this, so the positional order can't drift from the DDL / the reader.
|
|
77
87
|
*/
|
|
78
|
-
export declare const ADDRESS_POINT_COLUMNS: readonly ["street_norm", "street_key", "number", "unit", "postcode", "locality_norm", "street_raw", "lat", "lon", "source", "release"];
|
|
88
|
+
export declare const ADDRESS_POINT_COLUMNS: readonly ["street_norm", "street_key", "number", "unit", "postcode", "locality_norm", "street_raw", "lat", "lon", "source", "release", "admin_code", "certified"];
|
|
79
89
|
/**
|
|
80
90
|
* Create the `address_point` table — called before the streaming bulk load.
|
|
81
91
|
*/
|
|
@@ -84,4 +94,4 @@ export declare function createAddressPointTable(db: AddressPointSchemaHandle): P
|
|
|
84
94
|
* Create the three probe indexes the reader relies on (postcode-scope, locality-scope, route-key).
|
|
85
95
|
*/
|
|
86
96
|
export declare function createAddressPointIndexes(db: AddressPointSchemaHandle): Promise<void>;
|
|
87
|
-
//# sourceMappingURL=
|
|
97
|
+
//# sourceMappingURL=point-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"point-schema.d.ts","sourceRoot":"","sources":["../../lib/address/point-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAErE;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC;;OAEG;IACH,WAAW,EAAE,SAAS,CAAA;IACtB;;;OAGG;IACH,UAAU,EAAE,QAAQ,CAAA;IACpB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB;;OAEG;IACH,aAAa,EAAE,OAAO,GAAG,IAAI,CAAA;IAC7B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,aAAa,EAAE,iBAAiB,CAAA;CAChC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEnF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,mKAcxB,CAAA;AAEV;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzF;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,EAAE,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB3F"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
|
-
* Typed schema for the SITUS / rooftop ADDRESS-POINT
|
|
7
|
-
* by `scripts/build-address-point-
|
|
6
|
+
* Typed schema for the SITUS / rooftop ADDRESS-POINT extracts (`address-points-<cc>-<slug>.db`, built
|
|
7
|
+
* by `scripts/build-address-point-extract.ts` — the #476/#567 national rooftop tier behind the
|
|
8
8
|
* demo's "type any US address, get the building"). Single source of truth for the columns shared
|
|
9
9
|
* by the BUILDER and the READER ({@link AddressPointSqliteLookup}), so a column rename in one is a
|
|
10
10
|
* compile error in the other.
|
|
@@ -31,6 +31,8 @@ export const ADDRESS_POINT_COLUMNS = [
|
|
|
31
31
|
"lon",
|
|
32
32
|
"source",
|
|
33
33
|
"release",
|
|
34
|
+
"admin_code",
|
|
35
|
+
"certified",
|
|
34
36
|
];
|
|
35
37
|
/**
|
|
36
38
|
* Create the `address_point` table — called before the streaming bulk load.
|
|
@@ -50,6 +52,8 @@ export async function createAddressPointTable(db) {
|
|
|
50
52
|
.addColumn("lon", "real", (c) => c.notNull())
|
|
51
53
|
.addColumn("source", "text", (c) => c.notNull())
|
|
52
54
|
.addColumn("release", "text", (c) => c.notNull())
|
|
55
|
+
.addColumn("admin_code", "text")
|
|
56
|
+
.addColumn("certified", "integer")
|
|
53
57
|
.execute();
|
|
54
58
|
}
|
|
55
59
|
/**
|
|
@@ -73,4 +77,4 @@ export async function createAddressPointIndexes(db) {
|
|
|
73
77
|
// bbox so it simply carries one extra (cheap) index on a future rebuild.
|
|
74
78
|
await db.schema.createIndex("idx_ap_street").on("address_point").columns(["street_norm", "number"]).execute();
|
|
75
79
|
}
|
|
76
|
-
//# sourceMappingURL=
|
|
80
|
+
//# sourceMappingURL=point-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"point-schema.js","sourceRoot":"","sources":["../../lib/address/point-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAyEH;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACpC,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,MAAM;IACN,UAAU;IACV,eAAe;IACf,YAAY;IACZ,KAAK;IACL,KAAK;IACL,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,WAAW;CACF,CAAA;AAEV;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAA4B;IACzE,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,eAAe,CAAC;SAC5B,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACrD,wFAAwF;SACvF,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACnD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/C,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;SACzB,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;SAC7B,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC;SAClC,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACnD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC5C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC5C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/C,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAChD,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;SAC/B,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC;SACjC,OAAO,EAAE,CAAA;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,EAA4B;IAC3E,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,iBAAiB,CAAC;SAC9B,EAAE,CAAC,eAAe,CAAC;SACnB,OAAO,CAAC,CAAC,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;SAC9C,OAAO,EAAE,CAAA;IAEX,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,iBAAiB,CAAC;SAC9B,EAAE,CAAC,eAAe,CAAC;SACnB,OAAO,CAAC,CAAC,eAAe,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;SACnD,OAAO,EAAE,CAAA;IAEX,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;IACjH,oGAAoG;IACpG,uGAAuG;IACvG,wGAAwG;IACxG,yEAAyE;IACzE,MAAM,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA;AAC9G,CAAC"}
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
6
|
* SQLite implementation of core's `AddressPointLookup` (#476): exact `(street, number)` within a
|
|
7
|
-
* postcode (preferred), locality, or — for
|
|
7
|
+
* postcode (preferred), locality, or — for extracts whose points carry no scope tag (OSM, #247) —
|
|
8
8
|
* the resolved locality's BBOX. Query-side normalization is THE shared normalizer
|
|
9
|
-
* (`street-normalize.ts`), selected per the
|
|
9
|
+
* (`street-normalize.ts`), selected per the extract's `streetLocale` so build-side and probe-side
|
|
10
10
|
* stay identical by construction (US delegates to the USPS pipeline; FR/DE/NL use the locale rules).
|
|
11
11
|
*
|
|
12
12
|
* Matching is exact-after-normalization only — no fuzzy street matching in this tier (measure how
|
|
@@ -15,16 +15,24 @@
|
|
|
15
15
|
* scopes missed). Multiple hits return the first by rowid — unit siblings share the building coord.
|
|
16
16
|
*/
|
|
17
17
|
import type { AddressPointHit, AddressPointLookup } from "@mailwoman/resolver";
|
|
18
|
-
import {
|
|
19
|
-
|
|
18
|
+
import type { AddressPointDatabase } from "#address/point-schema";
|
|
19
|
+
import { type StreetLocale } from "#street/normalize";
|
|
20
|
+
export declare class AddressPointSqliteLookup<DB extends AddressPointDatabase = AddressPointDatabase> implements AddressPointLookup, Disposable {
|
|
20
21
|
#private;
|
|
21
22
|
/**
|
|
22
|
-
* @param dbPath
|
|
23
|
-
* @param opts.streetLocale The street-normalization locale this
|
|
23
|
+
* @param dbPath Extract path.
|
|
24
|
+
* @param opts.streetLocale The street-normalization locale this extract was BUILT with — must match, or every key
|
|
24
25
|
* misses. Defaults to `"us"` (the situs tier), so existing callers are unchanged.
|
|
26
|
+
* @param opts.localityKeys Whether the extract's `locality_norm` is a FULL place name a query can be held to. The BAN
|
|
27
|
+
* and OSM extracts write the commune or `addr:city` in full; the US situs extract writes the NAD city field, which
|
|
28
|
+
* several counties abbreviate (`addi` for Addison on 5,174 Texas rows, 327,264 Texas rows at four characters or
|
|
29
|
+
* fewer) or give as the parent town (`easton` for North Easton). A key like that can steer WHICH row answers but
|
|
30
|
+
* cannot refuse one, so it never contradicts. Defaults from the street locale: `"us"` is abbreviated, the rest
|
|
31
|
+
* full.
|
|
25
32
|
*/
|
|
26
33
|
constructor(dbPath: string, opts?: {
|
|
27
34
|
streetLocale?: StreetLocale;
|
|
35
|
+
localityKeys?: "full" | "abbreviated";
|
|
28
36
|
});
|
|
29
37
|
find(query: {
|
|
30
38
|
street: string;
|
|
@@ -38,6 +46,6 @@ export declare class AddressPointSqliteLookup implements AddressPointLookup {
|
|
|
38
46
|
maxLon: number;
|
|
39
47
|
};
|
|
40
48
|
}): AddressPointHit | null;
|
|
41
|
-
|
|
49
|
+
[Symbol.dispose](): void;
|
|
42
50
|
}
|
|
43
|
-
//# sourceMappingURL=
|
|
51
|
+
//# sourceMappingURL=point.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../lib/address/point.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAG9E,OAAO,KAAK,EAAE,oBAAoB,EAAqB,MAAM,uBAAuB,CAAA;AAEpF,OAAO,EAON,KAAK,YAAY,EACjB,MAAM,mBAAmB,CAAA;AAc1B,qBAAa,wBAAwB,CAAC,EAAE,SAAS,oBAAoB,GAAG,oBAAoB,CAC3F,YAAW,kBAAkB,EAAE,UAAU;;IAiBzC;;;;;;;;;;OAUG;gBACS,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,YAAY,CAAC,EAAE,YAAY,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CAAA;KAAO;IAkC7G,IAAI,CAAC,KAAK,EAAE;QACX,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE,MAAM,CAAA;QACd,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,IAAI,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAA;KACzE,GAAG,eAAe,GAAG,IAAI;IAmK1B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAGxB"}
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*
|
|
6
6
|
* SQLite implementation of core's `AddressPointLookup` (#476): exact `(street, number)` within a
|
|
7
|
-
* postcode (preferred), locality, or — for
|
|
7
|
+
* postcode (preferred), locality, or — for extracts whose points carry no scope tag (OSM, #247) —
|
|
8
8
|
* the resolved locality's BBOX. Query-side normalization is THE shared normalizer
|
|
9
|
-
* (`street-normalize.ts`), selected per the
|
|
9
|
+
* (`street-normalize.ts`), selected per the extract's `streetLocale` so build-side and probe-side
|
|
10
10
|
* stay identical by construction (US delegates to the USPS pipeline; FR/DE/NL use the locale rules).
|
|
11
11
|
*
|
|
12
12
|
* Matching is exact-after-normalization only — no fuzzy street matching in this tier (measure how
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
* postcode, then locality, then the bbox fall-through (only when a bbox is supplied AND the prior
|
|
15
15
|
* scopes missed). Multiple hits return the first by rowid — unit siblings share the building coord.
|
|
16
16
|
*/
|
|
17
|
-
import {
|
|
18
|
-
import { hasTable, prepareGet } from "
|
|
19
|
-
import { normalizeLocalityForKey, streetKeyVariants, streetLocaleForSurface, stripArrondissement, } from "
|
|
17
|
+
import { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
18
|
+
import { hasTable, prepareGet } from "#sqlite-utils";
|
|
19
|
+
import { normalizeLocalityForKey, streetKeyVariants, streetLocaleForSurface, stripArrondissement, } from "#street/normalize";
|
|
20
20
|
/**
|
|
21
21
|
* The 4 columns the reader SELECTs, in the schema's order — referenced by the prepared SELECTs so the projected
|
|
22
22
|
* `AddressPointRow` stays in lockstep with the shared schema.
|
|
@@ -25,22 +25,33 @@ const SELECT_COLS = "lat, lon, source, release, locality_norm, postcode";
|
|
|
25
25
|
export class AddressPointSqliteLookup {
|
|
26
26
|
#db;
|
|
27
27
|
#locale;
|
|
28
|
+
#localityKeys;
|
|
28
29
|
#byPostcode;
|
|
30
|
+
#byPostcodeLocality;
|
|
29
31
|
#byLocality;
|
|
30
32
|
#byBbox;
|
|
31
33
|
/**
|
|
32
|
-
* @param dbPath
|
|
33
|
-
* @param opts.streetLocale The street-normalization locale this
|
|
34
|
+
* @param dbPath Extract path.
|
|
35
|
+
* @param opts.streetLocale The street-normalization locale this extract was BUILT with — must match, or every key
|
|
34
36
|
* misses. Defaults to `"us"` (the situs tier), so existing callers are unchanged.
|
|
37
|
+
* @param opts.localityKeys Whether the extract's `locality_norm` is a FULL place name a query can be held to. The BAN
|
|
38
|
+
* and OSM extracts write the commune or `addr:city` in full; the US situs extract writes the NAD city field, which
|
|
39
|
+
* several counties abbreviate (`addi` for Addison on 5,174 Texas rows, 327,264 Texas rows at four characters or
|
|
40
|
+
* fewer) or give as the parent town (`easton` for North Easton). A key like that can steer WHICH row answers but
|
|
41
|
+
* cannot refuse one, so it never contradicts. Defaults from the street locale: `"us"` is abbreviated, the rest
|
|
42
|
+
* full.
|
|
35
43
|
*/
|
|
36
44
|
constructor(dbPath, opts = {}) {
|
|
37
|
-
this.#db = new
|
|
45
|
+
this.#db = new DatabaseClient(dbPath, { readOnly: true });
|
|
38
46
|
this.#locale = opts.streetLocale ?? "us";
|
|
39
|
-
|
|
47
|
+
this.#localityKeys = opts.localityKeys ?? (this.#locale === "us" ? "abbreviated" : "full");
|
|
48
|
+
// Degrade gracefully on an empty/tableless extract (interrupted build, stray 0-byte file): with no
|
|
40
49
|
// `address_point` table this lookup is a no-op miss, not a crash that loses the whole state (#568).
|
|
41
50
|
if (hasTable(this.#db, "address_point")) {
|
|
42
51
|
this.#byPostcode = prepareGet(this.#db, `SELECT ${SELECT_COLS} FROM address_point
|
|
43
52
|
WHERE postcode = ? AND street_norm = ? AND number = ? LIMIT 1`);
|
|
53
|
+
this.#byPostcodeLocality = prepareGet(this.#db, `SELECT ${SELECT_COLS} FROM address_point
|
|
54
|
+
WHERE postcode = ? AND locality_norm = ? AND street_norm = ? AND number = ? LIMIT 1`);
|
|
44
55
|
this.#byLocality = prepareGet(this.#db, `SELECT ${SELECT_COLS} FROM address_point
|
|
45
56
|
WHERE locality_norm = ? AND street_norm = ? AND number = ? LIMIT 1`);
|
|
46
57
|
this.#byBbox = prepareGet(this.#db, `SELECT ${SELECT_COLS} FROM address_point
|
|
@@ -114,27 +125,67 @@ export class AddressPointSqliteLookup {
|
|
|
114
125
|
#probe(streetNorm, number, query) {
|
|
115
126
|
let row;
|
|
116
127
|
if (query.postcode) {
|
|
117
|
-
|
|
128
|
+
const postcode = query.postcode.trim();
|
|
129
|
+
const localityKey = query.locality ? this.#localityKey(query.locality) : undefined;
|
|
130
|
+
// A postcode can span several places — DE 04509 covers Schönwölkau and Werlitzsch, both with a Teichstraße 3 —
|
|
131
|
+
// so when the query names a locality the row whose own locality agrees is asked for FIRST. Only when no such
|
|
132
|
+
// row exists does the postcode-only row answer, and then only if its locality does not name a different place
|
|
133
|
+
// (see `#scopeContradicts` for what "different" tolerates): a query naming a third village under the postcode
|
|
134
|
+
// falls through to the locality rung rather than answering the wrong rooftop.
|
|
135
|
+
const agreeing = localityKey ? this.#byPostcodeLocality(postcode, localityKey, streetNorm, number) : undefined;
|
|
136
|
+
const candidate = agreeing ?? this.#byPostcode(postcode, streetNorm, number);
|
|
137
|
+
row = candidate && !this.#scopeContradicts(candidate, query) ? candidate : undefined;
|
|
118
138
|
}
|
|
119
139
|
if (!row && query.locality) {
|
|
120
|
-
// FR
|
|
140
|
+
// FR extracts key arrondissement communes at the base city (both-sides fold, see the BAN
|
|
121
141
|
// builder + stripArrondissement) — fold the probe too so "Paris 13e Arrondissement" and
|
|
122
|
-
// "Paris" both hit. No-op for "us"
|
|
123
|
-
|
|
124
|
-
? stripArrondissement(normalizeLocalityForKey(query.locality))
|
|
125
|
-
: normalizeLocalityForKey(query.locality);
|
|
126
|
-
row = this.#byLocality(localityKey, streetNorm, number);
|
|
142
|
+
// "Paris" both hit. No-op for "us" extracts and every non-arrondissement commune.
|
|
143
|
+
row = this.#byLocality(this.#localityKey(query.locality), streetNorm, number);
|
|
127
144
|
}
|
|
128
145
|
// Bbox fall-through (#247): the point carries no postcode/locality of its own, but its coordinate falls
|
|
129
146
|
// inside the resolved locality's box. Only reached when the scoped probes missed AND a bbox was supplied.
|
|
130
147
|
if (!row && query.bbox) {
|
|
131
148
|
const b = query.bbox;
|
|
132
|
-
|
|
149
|
+
const candidate = this.#byBbox(streetNorm, number, b.minLat, b.maxLat, b.minLon, b.maxLon);
|
|
150
|
+
// A register row that carries its own scope and was NOT found by the scoped rungs is a different address that
|
|
151
|
+
// happens to share the street and number inside the box: `10 rue de la République, 75008 Paris` reached
|
|
152
|
+
// Servon's `10 rue de la République` (postcode 77170) 26 km away this way, at rooftop tier and 1 m uncertainty.
|
|
153
|
+
// The rung exists for points with no scope of their own; a point whose scope disagrees with the query is a miss.
|
|
154
|
+
row = candidate && !this.#scopeContradicts(candidate, query) ? candidate : undefined;
|
|
133
155
|
}
|
|
134
156
|
return row;
|
|
135
157
|
}
|
|
136
|
-
|
|
137
|
-
|
|
158
|
+
/**
|
|
159
|
+
* The query's locality folded the way the extract's builder folded its `locality_norm`. FR extracts key
|
|
160
|
+
* arrondissement communes at the base city (both-sides fold, see the BAN builder + stripArrondissement), so "Paris
|
|
161
|
+
* 13e Arrondissement" and "Paris" both hit; a no-op for every other locale.
|
|
162
|
+
*/
|
|
163
|
+
#localityKey(locality) {
|
|
164
|
+
return this.#locale === "fr"
|
|
165
|
+
? stripArrondissement(normalizeLocalityForKey(locality))
|
|
166
|
+
: normalizeLocalityForKey(locality);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Whether a row's OWN postcode or locality names a different place than the query did. Absent scope on the row is not
|
|
170
|
+
* a contradiction — it is the case the bbox rung was built for — and a rung that matched ON a field cannot contradict
|
|
171
|
+
* it, so at the postcode rung only the locality can disagree and at the bbox rung either can.
|
|
172
|
+
*
|
|
173
|
+
* The locality is consulted only on an extract whose keys are full names (the constructor's `localityKeys`). Under
|
|
174
|
+
* exact comparison against the US extract's abbreviated keys, the postcode rung refused `4900 Airport Pkwy, Addison
|
|
175
|
+
* TX 75001`'s own rooftop row (`addi`) and `678 Depot St, North Easton, MA 02356`'s (`easton`), and both `pass` board
|
|
176
|
+
* rows fell to interpolation 144–198 m away — invisible to a 1 km grade (#2155). `servon` against `paris` and
|
|
177
|
+
* `werlitzsch` against `krensitz`, on the BAN and OSM extracts, are different places and still refuse.
|
|
178
|
+
*/
|
|
179
|
+
#scopeContradicts(row, query) {
|
|
180
|
+
if (query.postcode && row.postcode && row.postcode.trim() !== query.postcode.trim())
|
|
181
|
+
return true;
|
|
182
|
+
if (this.#localityKeys === "full" && query.locality && row.locality_norm) {
|
|
183
|
+
return row.locality_norm !== this.#localityKey(query.locality);
|
|
184
|
+
}
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
[Symbol.dispose]() {
|
|
188
|
+
this.#db[Symbol.dispose]();
|
|
138
189
|
}
|
|
139
190
|
}
|
|
140
|
-
//# sourceMappingURL=
|
|
191
|
+
//# sourceMappingURL=point.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"point.js","sourceRoot":"","sources":["../../lib/address/point.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,7 +44,9 @@
|
|
|
44
44
|
* test: each (id, ancestor_id) is inserted at most once, so a second run over the same DB adds
|
|
45
45
|
* nothing.
|
|
46
46
|
*/
|
|
47
|
-
import type {
|
|
47
|
+
import type { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
48
|
+
import { type PathBuilderLike } from "path-ts";
|
|
49
|
+
import type { WOFDatabase } from "#schema";
|
|
48
50
|
export interface AncestryBackfillResult {
|
|
49
51
|
/**
|
|
50
52
|
* Places that gained at least one ancestor row.
|
|
@@ -61,12 +63,12 @@ export interface AncestryBackfillResult {
|
|
|
61
63
|
noGeojson: number;
|
|
62
64
|
}
|
|
63
65
|
/**
|
|
64
|
-
* Discover the `data` directories under a WOF repos root that hold
|
|
66
|
+
* Discover the `data` directories under a WOF repos root that hold attached geojson, e.g.
|
|
65
67
|
* `<root>/whosonfirst-data/whosonfirst-data-admin-us/data`. Resolves an id to its geojson via these roots. Accepts both
|
|
66
68
|
* the nested lab layout (a `whosonfirst-data` group dir holding the admin repos) and a flat layout (admin repos
|
|
67
69
|
* directly under the root); searches at most two directory levels deep.
|
|
68
70
|
*/
|
|
69
|
-
export declare function discoverAdminDataRoots(reposRoot:
|
|
71
|
+
export declare function discoverAdminDataRoots(reposRoot: PathBuilderLike): Promise<string[]>;
|
|
70
72
|
/**
|
|
71
73
|
* Insert missing ancestor rows for every place whose ancestry chain dead-ended before reaching a country, by reading
|
|
72
74
|
* `wof:hierarchy` from its source geojson under `geojsonRoots` (see {@link discoverAdminDataRoots}). Runs inside a
|
|
@@ -79,7 +81,7 @@ export declare function discoverAdminDataRoots(reposRoot: string): string[];
|
|
|
79
81
|
* ~40-minute one (their ancestry comes from the parent_id closure, not this backfill). Correctness-preserving — the
|
|
80
82
|
* skipped rows would have `noGeojson`-skipped anyway. Omit `maxID` (default) for the legacy WOF-only DBs.
|
|
81
83
|
*/
|
|
82
|
-
export declare function backfillAncestorsFromHierarchy(db:
|
|
84
|
+
export declare function backfillAncestorsFromHierarchy(db: DatabaseClient<WOFDatabase>, geojsonRoots: readonly string[], opts?: {
|
|
83
85
|
maxID?: number;
|
|
84
86
|
}): Promise<AncestryBackfillResult>;
|
|
85
|
-
//# sourceMappingURL=
|
|
87
|
+
//# sourceMappingURL=backfill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backfill.d.ts","sourceRoot":"","sources":["../../lib/ancestry/backfill.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,SAAS,CAAA;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAO1C,MAAM,WAAW,sBAAsB;IACtC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAA;CACjB;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4B1F;AAYD;;;;;;;;;;;GAWG;AACH,wBAAsB,8BAA8B,CACnD,EAAE,EAAE,cAAc,CAAC,WAAW,CAAC,EAC/B,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3B,OAAO,CAAC,sBAAsB,CAAC,CAkHjC"}
|