@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
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Typed schema for the candidate gazetteer's ancestors sidecar (`candidate_ancestor` +
|
|
7
|
+
* `candidate_interval`) — the containment lineage the candidate table itself cannot answer, built
|
|
8
|
+
* into the same `candidate.db` by `build-candidate.ts` and read by
|
|
9
|
+
* {@link WOFCandidateTableLookup.ancestors}.
|
|
10
|
+
*
|
|
11
|
+
* The sidecar stores denormalized closure rows. Each row represents one (place, ancestor) edge. The row includes the
|
|
12
|
+
* parent's placetype, display name and folded key. The two consumers determine this layout:
|
|
13
|
+
*
|
|
14
|
+
* 1. The admin-coherence check needs the winner's chain as (placetype, name) pairs in one probe.
|
|
15
|
+
* A fixed-slot `[id.8]` chain returns ids. Each id would then need a name lookup, but the artifact has no
|
|
16
|
+
* per-id table. That design requires up to 8 indirections. The closure row requires none.
|
|
17
|
+
* 2. The account layer needs every candidate under a `name_key` enumerable with its chain from
|
|
18
|
+
* one artifact probe ("present-but-outranked, discriminated by containment"). That is the
|
|
19
|
+
* candidate probe (contiguous) followed by one `spr_id`-clustered closure probe per candidate
|
|
20
|
+
* — each a handful of adjacent pages.
|
|
21
|
+
*
|
|
22
|
+
* The artifact is read over HTTP byte ranges. A join to a dimension table scatters page fetches. A `without rowid`
|
|
23
|
+
* B-tree clustered on `(spr_id, depth)` keeps a whole chain in 1–2 pages. The builder repeats parent strings to
|
|
24
|
+
* avoid joins during reads.
|
|
25
|
+
*
|
|
26
|
+
* `depth` is 1 for the nearest ancestor (deepest containment tier) and increases outward to the
|
|
27
|
+
* country. This matches the nearest-first order that `ancestry.ts` serves for the FTS backend. Both backends'
|
|
28
|
+
* `ancestors()` results therefore use the same order. The order within a place is deterministic:
|
|
29
|
+
* containment depth descending (`placetypeDepth`), then ancestor id ascending, capped at
|
|
30
|
+
* {@link MAX_ANCESTOR_DEPTH}. `parent_name_key` is the shared {@link normalizeLocalityForKey}
|
|
31
|
+
* fold — the same fold `candidate.name_key` is built with, so a chain entry and a candidate key
|
|
32
|
+
* compare under one normalizer.
|
|
33
|
+
*
|
|
34
|
+
* `candidate_interval` stores pre/post-order labels over the canonical-parent forest. The builder assigns them
|
|
35
|
+
* during construction. The predicate `a.pre <= d.pre and d.post <= a.post` tests whether `a` contains `d` in O(1)
|
|
36
|
+
* time. It needs no chain scan or tier information. Descendants of `a` occupy the contiguous range
|
|
37
|
+
* `pre between a.pre and a.post`. Interval labels add relabeling work to updates. This database is sealed and
|
|
38
|
+
* read-only, so the builder can regenerate all labels together.
|
|
39
|
+
*
|
|
40
|
+
* WOF places can have multiple parents because boundaries can be ambiguous or participate in multiple
|
|
41
|
+
* hierarchies. `candidate_ancestor` stores every parent. Its closure rows hold the complete containment record.
|
|
42
|
+
* One interval pair encodes only a tree. The interval forest therefore links each place to one canonical parent:
|
|
43
|
+
* the depth-1 edge with the finest containment tier and lowest ancestor id. This follows the same MIN-based
|
|
44
|
+
* stability convention as the candidate table's `region_id` stamp. A containment query about another hierarchy
|
|
45
|
+
* must consult the closure rows. The interval result answers only whether a place is contained along the canonical
|
|
46
|
+
* hierarchy.
|
|
47
|
+
*
|
|
48
|
+
* absence semantics (meaning-of-zero): a place with no `candidate_interval` row has no recorded
|
|
49
|
+
* ancestry in the source (extract-fed postcodes and localities, isolated places, cycle-skipped
|
|
50
|
+
* rows). Absence is unverifiable, never a containment verdict.
|
|
51
|
+
*/
|
|
52
|
+
import { type Kysely } from "kysely";
|
|
53
|
+
import type { CandidateDatabase } from "#candidate/schema";
|
|
54
|
+
import type { NameKey } from "#street/normalize";
|
|
55
|
+
/**
|
|
56
|
+
* The deepest chain the sidecar stores per place.
|
|
57
|
+
*
|
|
58
|
+
* WOF containment within the resolvable placetypes (country … microhood) never legitimately exceeds this.
|
|
59
|
+
* The build drops and counts anything past it as source noise rather than storing it.
|
|
60
|
+
*/
|
|
61
|
+
export declare const MAX_ANCESTOR_DEPTH = 8;
|
|
62
|
+
/**
|
|
63
|
+
* The closure-row table's name — probed with `hasTable` by the reader, so an artifact
|
|
64
|
+
* predating the sidecar degrades to "no ancestors capability" rather than `no such table`.
|
|
65
|
+
*/
|
|
66
|
+
export declare const CANDIDATE_ANCESTOR_TABLE = "candidate_ancestor";
|
|
67
|
+
/**
|
|
68
|
+
* The interval-label table's name — the closure table's seal-time sibling.
|
|
69
|
+
* Existence-restricted the same way.
|
|
70
|
+
*/
|
|
71
|
+
export declare const CANDIDATE_INTERVAL_TABLE = "candidate_interval";
|
|
72
|
+
/**
|
|
73
|
+
* One (place, ancestor) edge, denormalized so a chain read is a single clustered probe (no join).
|
|
74
|
+
*/
|
|
75
|
+
export interface CandidateAncestorTable {
|
|
76
|
+
/**
|
|
77
|
+
* WOF id of the place whose chain this row belongs to — the same `spr_id` the candidate table resolves to.
|
|
78
|
+
*/
|
|
79
|
+
spr_id: number;
|
|
80
|
+
/**
|
|
81
|
+
* 1 = nearest ancestor, increasing outward to the country. Deterministic within a place (containment depth
|
|
82
|
+
* descending, then ancestor id ascending), so `(spr_id, depth)` is a stable primary key across rebuilds.
|
|
83
|
+
*/
|
|
84
|
+
depth: number;
|
|
85
|
+
/**
|
|
86
|
+
* WOF id of the ancestor.
|
|
87
|
+
*/
|
|
88
|
+
parent_spr_id: number;
|
|
89
|
+
/**
|
|
90
|
+
* Small int from the shared `placetype_codes` dictionary (the same one the candidate table uses).
|
|
91
|
+
*/
|
|
92
|
+
parent_placetype_id: number;
|
|
93
|
+
/**
|
|
94
|
+
* The ancestor's canonical display name.
|
|
95
|
+
*
|
|
96
|
+
* What {@link Ancestor.name} serves, matching the FTS backend's register.
|
|
97
|
+
*/
|
|
98
|
+
parent_name: string;
|
|
99
|
+
/**
|
|
100
|
+
* The shared {@link normalizeLocalityForKey} fold of `parent_name` — comparable against
|
|
101
|
+
* `candidate.name_key` and against a query-side fold under one normalizer, by construction.
|
|
102
|
+
*/
|
|
103
|
+
parent_name_key: NameKey;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Pre/post-order labels over the canonical-parent forest — one row per place with
|
|
107
|
+
* recorded ancestry (see the module docstring for absence semantics).
|
|
108
|
+
*
|
|
109
|
+
* `pre < post` always.
|
|
110
|
+
* Labels are unique across the artifact.
|
|
111
|
+
*/
|
|
112
|
+
export interface CandidateIntervalTable {
|
|
113
|
+
spr_id: number;
|
|
114
|
+
pre: number;
|
|
115
|
+
post: number;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* The sidecar tables, for a `Kysely` view over the candidate DB.
|
|
119
|
+
*
|
|
120
|
+
* `CandidateDatabase` (candidate-schema.ts) extends this, so the builder's
|
|
121
|
+
* one typed client sees both families.
|
|
122
|
+
*/
|
|
123
|
+
export interface CandidateAncestorsDatabase {
|
|
124
|
+
candidate_ancestor: CandidateAncestorTable;
|
|
125
|
+
candidate_interval: CandidateIntervalTable;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* The `candidate_ancestor` columns in clustered-key order.
|
|
129
|
+
*
|
|
130
|
+
* The first two columns form the primary key.
|
|
131
|
+
* The builder's positional `insert` binds values in this order.
|
|
132
|
+
*
|
|
133
|
+
* Keep in sync with {@link CandidateAncestorTable}.
|
|
134
|
+
*/
|
|
135
|
+
export declare const CANDIDATE_ANCESTOR_COLUMNS: readonly ["spr_id", "depth", "parent_spr_id", "parent_placetype_id", "parent_name", "parent_name_key"];
|
|
136
|
+
/**
|
|
137
|
+
* Create the clustered closure table.
|
|
138
|
+
*
|
|
139
|
+
* The builder inserts in `(spr_id, depth)` order so the B-tree leaves are contiguous
|
|
140
|
+
* per place — the byte-range read discipline.
|
|
141
|
+
*/
|
|
142
|
+
export declare function createCandidateAncestorTable(db: Kysely<CandidateDatabase>): Promise<void>;
|
|
143
|
+
/**
|
|
144
|
+
* Create the interval-label table.
|
|
145
|
+
*
|
|
146
|
+
* Small rows probed by primary key — the `without rowid` win case.
|
|
147
|
+
*/
|
|
148
|
+
export declare function createCandidateIntervalTable(db: Kysely<CandidateDatabase>): Promise<void>;
|
|
149
|
+
/**
|
|
150
|
+
* One place's interval label.
|
|
151
|
+
* The shape both sides of a containment comparison read.
|
|
152
|
+
*/
|
|
153
|
+
export interface IntervalLabel {
|
|
154
|
+
pre: number;
|
|
155
|
+
post: number;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Does `outer` contain `inner` along the canonical hierarchy?
|
|
159
|
+
*
|
|
160
|
+
* Reflexive: a place contains itself (containment degenerates to identity,
|
|
161
|
+
* the same reading the admin-coherence check gives a self-match).
|
|
162
|
+
* The shared function for every consumer of the labels — a re-derived comparison risks
|
|
163
|
+
* disagreeing at exactly the strict/inclusive boundary this line settles.
|
|
164
|
+
*/
|
|
165
|
+
export declare function intervalContains(outer: IntervalLabel, inner: IntervalLabel): boolean;
|
|
166
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../lib/candidate/ancestors/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAKzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC;;;GAGG;AACH,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAE5D;;;GAGG;AACH,eAAO,MAAM,wBAAwB,uBAAuB,CAAA;AAE5D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAA;IAC3B;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAA;IACnB;;;OAGG;IACH,eAAe,EAAE,OAAO,CAAA;CACxB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IAC1C,kBAAkB,EAAE,sBAAsB,CAAA;IAC1C,kBAAkB,EAAE,sBAAsB,CAAA;CAC1C;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,YACtC,QAAQ,EACR,OAAO,EACP,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,iBAAiB,CACR,CAAA;AAEV;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAAC,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/F;AAED;;;;GAIG;AACH,wBAAsB,4BAA4B,CAAC,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ/F;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAEpF"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Typed schema for the candidate gazetteer's ancestors sidecar (`candidate_ancestor` +
|
|
7
|
+
* `candidate_interval`) — the containment lineage the candidate table itself cannot answer, built
|
|
8
|
+
* into the same `candidate.db` by `build-candidate.ts` and read by
|
|
9
|
+
* {@link WOFCandidateTableLookup.ancestors}.
|
|
10
|
+
*
|
|
11
|
+
* The sidecar stores denormalized closure rows. Each row represents one (place, ancestor) edge. The row includes the
|
|
12
|
+
* parent's placetype, display name and folded key. The two consumers determine this layout:
|
|
13
|
+
*
|
|
14
|
+
* 1. The admin-coherence check needs the winner's chain as (placetype, name) pairs in one probe.
|
|
15
|
+
* A fixed-slot `[id.8]` chain returns ids. Each id would then need a name lookup, but the artifact has no
|
|
16
|
+
* per-id table. That design requires up to 8 indirections. The closure row requires none.
|
|
17
|
+
* 2. The account layer needs every candidate under a `name_key` enumerable with its chain from
|
|
18
|
+
* one artifact probe ("present-but-outranked, discriminated by containment"). That is the
|
|
19
|
+
* candidate probe (contiguous) followed by one `spr_id`-clustered closure probe per candidate
|
|
20
|
+
* — each a handful of adjacent pages.
|
|
21
|
+
*
|
|
22
|
+
* The artifact is read over HTTP byte ranges. A join to a dimension table scatters page fetches. A `without rowid`
|
|
23
|
+
* B-tree clustered on `(spr_id, depth)` keeps a whole chain in 1–2 pages. The builder repeats parent strings to
|
|
24
|
+
* avoid joins during reads.
|
|
25
|
+
*
|
|
26
|
+
* `depth` is 1 for the nearest ancestor (deepest containment tier) and increases outward to the
|
|
27
|
+
* country. This matches the nearest-first order that `ancestry.ts` serves for the FTS backend. Both backends'
|
|
28
|
+
* `ancestors()` results therefore use the same order. The order within a place is deterministic:
|
|
29
|
+
* containment depth descending (`placetypeDepth`), then ancestor id ascending, capped at
|
|
30
|
+
* {@link MAX_ANCESTOR_DEPTH}. `parent_name_key` is the shared {@link normalizeLocalityForKey}
|
|
31
|
+
* fold — the same fold `candidate.name_key` is built with, so a chain entry and a candidate key
|
|
32
|
+
* compare under one normalizer.
|
|
33
|
+
*
|
|
34
|
+
* `candidate_interval` stores pre/post-order labels over the canonical-parent forest. The builder assigns them
|
|
35
|
+
* during construction. The predicate `a.pre <= d.pre and d.post <= a.post` tests whether `a` contains `d` in O(1)
|
|
36
|
+
* time. It needs no chain scan or tier information. Descendants of `a` occupy the contiguous range
|
|
37
|
+
* `pre between a.pre and a.post`. Interval labels add relabeling work to updates. This database is sealed and
|
|
38
|
+
* read-only, so the builder can regenerate all labels together.
|
|
39
|
+
*
|
|
40
|
+
* WOF places can have multiple parents because boundaries can be ambiguous or participate in multiple
|
|
41
|
+
* hierarchies. `candidate_ancestor` stores every parent. Its closure rows hold the complete containment record.
|
|
42
|
+
* One interval pair encodes only a tree. The interval forest therefore links each place to one canonical parent:
|
|
43
|
+
* the depth-1 edge with the finest containment tier and lowest ancestor id. This follows the same MIN-based
|
|
44
|
+
* stability convention as the candidate table's `region_id` stamp. A containment query about another hierarchy
|
|
45
|
+
* must consult the closure rows. The interval result answers only whether a place is contained along the canonical
|
|
46
|
+
* hierarchy.
|
|
47
|
+
*
|
|
48
|
+
* absence semantics (meaning-of-zero): a place with no `candidate_interval` row has no recorded
|
|
49
|
+
* ancestry in the source (extract-fed postcodes and localities, isolated places, cycle-skipped
|
|
50
|
+
* rows). Absence is unverifiable, never a containment verdict.
|
|
51
|
+
*/
|
|
52
|
+
import { sql } from "kysely";
|
|
53
|
+
/**
|
|
54
|
+
* The deepest chain the sidecar stores per place.
|
|
55
|
+
*
|
|
56
|
+
* WOF containment within the resolvable placetypes (country … microhood) never legitimately exceeds this.
|
|
57
|
+
* The build drops and counts anything past it as source noise rather than storing it.
|
|
58
|
+
*/
|
|
59
|
+
export const MAX_ANCESTOR_DEPTH = 8;
|
|
60
|
+
/**
|
|
61
|
+
* The closure-row table's name — probed with `hasTable` by the reader, so an artifact
|
|
62
|
+
* predating the sidecar degrades to "no ancestors capability" rather than `no such table`.
|
|
63
|
+
*/
|
|
64
|
+
export const CANDIDATE_ANCESTOR_TABLE = "candidate_ancestor";
|
|
65
|
+
/**
|
|
66
|
+
* The interval-label table's name — the closure table's seal-time sibling.
|
|
67
|
+
* Existence-restricted the same way.
|
|
68
|
+
*/
|
|
69
|
+
export const CANDIDATE_INTERVAL_TABLE = "candidate_interval";
|
|
70
|
+
/**
|
|
71
|
+
* The `candidate_ancestor` columns in clustered-key order.
|
|
72
|
+
*
|
|
73
|
+
* The first two columns form the primary key.
|
|
74
|
+
* The builder's positional `insert` binds values in this order.
|
|
75
|
+
*
|
|
76
|
+
* Keep in sync with {@link CandidateAncestorTable}.
|
|
77
|
+
*/
|
|
78
|
+
export const CANDIDATE_ANCESTOR_COLUMNS = [
|
|
79
|
+
"spr_id",
|
|
80
|
+
"depth",
|
|
81
|
+
"parent_spr_id",
|
|
82
|
+
"parent_placetype_id",
|
|
83
|
+
"parent_name",
|
|
84
|
+
"parent_name_key",
|
|
85
|
+
];
|
|
86
|
+
/**
|
|
87
|
+
* Create the clustered closure table.
|
|
88
|
+
*
|
|
89
|
+
* The builder inserts in `(spr_id, depth)` order so the B-tree leaves are contiguous
|
|
90
|
+
* per place — the byte-range read discipline.
|
|
91
|
+
*/
|
|
92
|
+
export async function createCandidateAncestorTable(db) {
|
|
93
|
+
await db.schema
|
|
94
|
+
.createTable(CANDIDATE_ANCESTOR_TABLE)
|
|
95
|
+
.addColumn("spr_id", "integer", (c) => c.notNull())
|
|
96
|
+
.addColumn("depth", "integer", (c) => c.notNull())
|
|
97
|
+
.addColumn("parent_spr_id", "integer", (c) => c.notNull())
|
|
98
|
+
.addColumn("parent_placetype_id", "integer", (c) => c.notNull())
|
|
99
|
+
.addColumn("parent_name", "text", (c) => c.notNull())
|
|
100
|
+
.addColumn("parent_name_key", "text", (c) => c.notNull())
|
|
101
|
+
.addPrimaryKeyConstraint("candidate_ancestor_pk", ["spr_id", "depth"])
|
|
102
|
+
// `without rowid` has no first-class builder. The raw modifier is the idiomatic fallback.
|
|
103
|
+
.modifyEnd(sql `without rowid`)
|
|
104
|
+
.execute();
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Create the interval-label table.
|
|
108
|
+
*
|
|
109
|
+
* Small rows probed by primary key — the `without rowid` win case.
|
|
110
|
+
*/
|
|
111
|
+
export async function createCandidateIntervalTable(db) {
|
|
112
|
+
await db.schema
|
|
113
|
+
.createTable(CANDIDATE_INTERVAL_TABLE)
|
|
114
|
+
.addColumn("spr_id", "integer", (c) => c.primaryKey())
|
|
115
|
+
.addColumn("pre", "integer", (c) => c.notNull())
|
|
116
|
+
.addColumn("post", "integer", (c) => c.notNull())
|
|
117
|
+
.modifyEnd(sql `without rowid`)
|
|
118
|
+
.execute();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Does `outer` contain `inner` along the canonical hierarchy?
|
|
122
|
+
*
|
|
123
|
+
* Reflexive: a place contains itself (containment degenerates to identity,
|
|
124
|
+
* the same reading the admin-coherence check gives a self-match).
|
|
125
|
+
* The shared function for every consumer of the labels — a re-derived comparison risks
|
|
126
|
+
* disagreeing at exactly the strict/inclusive boundary this line settles.
|
|
127
|
+
*/
|
|
128
|
+
export function intervalContains(outer, inner) {
|
|
129
|
+
return outer.pre <= inner.pre && inner.post <= outer.post;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../lib/candidate/ancestors/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,EAAE,GAAG,EAAe,MAAM,QAAQ,CAAA;AAQzC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAA;AAE5D;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAA;AA4D5D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACzC,QAAQ;IACR,OAAO;IACP,eAAe;IACf,qBAAqB;IACrB,aAAa;IACb,iBAAiB;CACR,CAAA;AAEV;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,EAA6B;IAC/E,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,wBAAwB,CAAC;SACrC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAClD,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACjD,SAAS,CAAC,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACzD,SAAS,CAAC,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/D,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACpD,SAAS,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACxD,uBAAuB,CAAC,uBAAuB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtE,0FAA0F;SACzF,SAAS,CAAC,GAAG,CAAA,eAAe,CAAC;SAC7B,OAAO,EAAE,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,EAA6B;IAC/E,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,wBAAwB,CAAC;SACrC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;SACrD,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/C,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SAChD,SAAS,CAAC,GAAG,CAAA,eAAe,CAAC;SAC7B,OAAO,EAAE,CAAA;AACZ,CAAC;AAWD;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,KAAoB;IAC1E,OAAO,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAA;AAC1D,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
* @file Pass 3b of the candidate build — the containment sidecar (closure rows + interval labels).
|
|
6
|
+
*/
|
|
7
|
+
import type { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
8
|
+
import type { PlaceAttrs } from "#candidate/place-attrs";
|
|
9
|
+
import type { CandidateDatabase } from "#candidate/schema";
|
|
10
|
+
import type { WOFDatabase } from "#schema";
|
|
11
|
+
/**
|
|
12
|
+
* Build the ancestors sidecar (closure rows plus interval labels) from the source
|
|
13
|
+
* `ancestors` table, excluding self rows and placetypes outside the containment ladder.
|
|
14
|
+
* an edge to a parent with no current `spr` row is dropped and counted.
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildAncestorsSidecar(ctx: {
|
|
17
|
+
src: DatabaseClient<WOFDatabase>;
|
|
18
|
+
out: DatabaseClient<CandidateDatabase>;
|
|
19
|
+
attrs: Map<number, PlaceAttrs>;
|
|
20
|
+
ptID: (pt: string | null) => number;
|
|
21
|
+
progress: (phase: string, message: string) => void;
|
|
22
|
+
}): Promise<{
|
|
23
|
+
ancestorRows: number;
|
|
24
|
+
ancestorPlaces: number;
|
|
25
|
+
intervalPlaces: number;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=sidecar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidecar.d.ts","sourceRoot":"","sources":["../../../lib/candidate/ancestors/sidecar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAW9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE;IAChD,GAAG,EAAE,cAAc,CAAC,WAAW,CAAC,CAAA;IAChC,GAAG,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAA;IACtC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC9B,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAA;IACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAClD,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CAmKpF"}
|
|
@@ -4,17 +4,12 @@
|
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
* @file Pass 3b of the candidate build — the containment sidecar (closure rows + interval labels).
|
|
6
6
|
*/
|
|
7
|
-
import { placetypeDepth } from "#ancestry
|
|
8
|
-
import { CANDIDATE_ANCESTOR_COLUMNS, CANDIDATE_ANCESTOR_TABLE, CANDIDATE_INTERVAL_TABLE, createCandidateAncestorTable, createCandidateIntervalTable, MAX_ANCESTOR_DEPTH, } from "#candidate
|
|
7
|
+
import { placetypeDepth } from "#ancestry";
|
|
8
|
+
import { CANDIDATE_ANCESTOR_COLUMNS, CANDIDATE_ANCESTOR_TABLE, CANDIDATE_INTERVAL_TABLE, createCandidateAncestorTable, createCandidateIntervalTable, MAX_ANCESTOR_DEPTH, } from "#candidate/ancestors/schema";
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* depth)` insert is sorted — the contiguous-leaves discipline of the candidate table itself.
|
|
14
|
-
*
|
|
15
|
-
* Excluded by policy: self rows, and placetypes outside the containment ladder (continent, empire, …: `placetypeDepth` 0)
|
|
16
|
-
* — they discriminate nothing a consumer of this sidecar checks. An edge to a parent with no current `spr` row has no
|
|
17
|
-
* name to denormalize; it is dropped and counted rather than stored blind.
|
|
10
|
+
* Build the ancestors sidecar (closure rows plus interval labels) from the source
|
|
11
|
+
* `ancestors` table, excluding self rows and placetypes outside the containment ladder.
|
|
12
|
+
* an edge to a parent with no current `spr` row is dropped and counted.
|
|
18
13
|
*/
|
|
19
14
|
export async function buildAncestorsSidecar(ctx) {
|
|
20
15
|
const { src, out, attrs, ptID, progress } = ctx;
|
|
@@ -22,23 +17,22 @@ export async function buildAncestorsSidecar(ctx) {
|
|
|
22
17
|
await createCandidateAncestorTable(ctx.out);
|
|
23
18
|
await createCandidateIntervalTable(ctx.out);
|
|
24
19
|
const insAncestor = out.prepare(`INSERT INTO ${CANDIDATE_ANCESTOR_TABLE} VALUES (${CANDIDATE_ANCESTOR_COLUMNS.map(() => "?").join(", ")})`);
|
|
25
|
-
//
|
|
26
|
-
//
|
|
27
|
-
// convention). ALL parents stay in the closure rows; only the interval tree canonicalizes.
|
|
20
|
+
// One parent per place (the finest containment tier, lowest ancestor id) canonicalizes the interval tree.
|
|
21
|
+
// All parents stay in the closure rows.
|
|
28
22
|
const canonicalParentOf = new Map();
|
|
29
23
|
const childrenOf = new Map();
|
|
30
24
|
const forest = new Set();
|
|
31
25
|
let ancestorRows = 0;
|
|
32
26
|
let ancestorPlaces = 0;
|
|
33
27
|
let droppedParents = 0;
|
|
34
|
-
//
|
|
28
|
+
// The stream is grouped by child id, so each flush owns one place.
|
|
35
29
|
let childID = -1;
|
|
36
30
|
let edges = [];
|
|
37
31
|
const flush = () => {
|
|
38
32
|
if (childID < 0 || !edges.length)
|
|
39
33
|
return;
|
|
40
|
-
// Deterministic nearest-first: containment depth descending, then ancestor id ascending
|
|
41
|
-
// the FTS backend's `ancestorLineage` ordering
|
|
34
|
+
// Deterministic nearest-first: containment depth descending, then ancestor id ascending,
|
|
35
|
+
// matching the FTS backend's `ancestorLineage` ordering across rebuilds.
|
|
42
36
|
edges.sort((a, b) => placetypeDepth(b.apt) - placetypeDepth(a.apt) || a.aid - b.aid);
|
|
43
37
|
if (edges.length > MAX_ANCESTOR_DEPTH) {
|
|
44
38
|
edges = edges.slice(0, MAX_ANCESTOR_DEPTH);
|
|
@@ -85,8 +79,8 @@ export async function buildAncestorsSidecar(ctx) {
|
|
|
85
79
|
}
|
|
86
80
|
flush();
|
|
87
81
|
out.exec("COMMIT");
|
|
88
|
-
// Interval labels
|
|
89
|
-
// order
|
|
82
|
+
// Interval labels are a pre/post-order DFS over the canonical-parent forest, with root
|
|
83
|
+
// and child order id-ascending so labels stay stable across rebuilds.
|
|
90
84
|
const preOf = new Map();
|
|
91
85
|
const postOf = new Map();
|
|
92
86
|
for (const kids of childrenOf.values()) {
|
|
@@ -105,8 +99,8 @@ export async function buildAncestorsSidecar(ctx) {
|
|
|
105
99
|
const kids = childrenOf.get(top.id);
|
|
106
100
|
if (kids && top.next < kids.length) {
|
|
107
101
|
const kid = kids[top.next++];
|
|
108
|
-
// Each child holds exactly one canonical parent, so a labeled node
|
|
109
|
-
//
|
|
102
|
+
// Each child holds exactly one canonical parent, so a labeled node means upstream grouping broke.
|
|
103
|
+
// Skip rather than corrupt the numbering.
|
|
110
104
|
if (preOf.has(kid))
|
|
111
105
|
continue;
|
|
112
106
|
preOf.set(kid, counter++);
|
|
@@ -118,9 +112,8 @@ export async function buildAncestorsSidecar(ctx) {
|
|
|
118
112
|
}
|
|
119
113
|
}
|
|
120
114
|
}
|
|
121
|
-
// A canonical-parent
|
|
122
|
-
//
|
|
123
|
-
// absence semantics the schema module states. Counted so a jump is visible across rebuilds.
|
|
115
|
+
// A canonical-parent cycle leaves its members unreachable from any root,
|
|
116
|
+
// so they receive no label and containment against them reads unverifiable.
|
|
124
117
|
const cycleSkipped = forest.size - preOf.size;
|
|
125
118
|
const insInterval = out.prepare(`INSERT INTO ${CANDIDATE_INTERVAL_TABLE} VALUES (?, ?, ?)`);
|
|
126
119
|
const labeled = [...preOf.keys()];
|
|
@@ -137,4 +130,4 @@ export async function buildAncestorsSidecar(ctx) {
|
|
|
137
130
|
(cycleSkipped ? `; ${cycleSkipped.toLocaleString()} places skipped (canonical-parent cycle)` : ""));
|
|
138
131
|
return { ancestorRows, ancestorPlaces, intervalPlaces: preOf.size };
|
|
139
132
|
}
|
|
140
|
-
//# sourceMappingURL=
|
|
133
|
+
//# sourceMappingURL=sidecar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidecar.js","sourceRoot":"","sources":["../../../lib/candidate/ancestors/sidecar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EACN,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,kBAAkB,GAClB,MAAM,6BAA6B,CAAA;AAKpC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAM3C;IACA,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAA;IAE/C,QAAQ,CAAC,WAAW,EAAE,+DAA+D,CAAC,CAAA;IACtF,MAAM,4BAA4B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC3C,MAAM,4BAA4B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAE3C,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAC9B,eAAe,wBAAwB,YAAY,0BAA0B,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC1G,CAAA;IAED,0GAA0G;IAC1G,wCAAwC;IACxC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAA;IACnD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAA;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;IAEhC,IAAI,YAAY,GAAG,CAAC,CAAA;IACpB,IAAI,cAAc,GAAG,CAAC,CAAA;IACtB,IAAI,cAAc,GAAG,CAAC,CAAA;IAEtB,mEAAmE;IACnE,IAAI,OAAO,GAAG,CAAC,CAAC,CAAA;IAChB,IAAI,KAAK,GAAwC,EAAE,CAAA;IAEnD,MAAM,KAAK,GAAG,GAAS,EAAE;QACxB,IAAI,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAM;QAExC,yFAAyF;QACzF,yEAAyE;QACzE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAA;QAEpF,IAAI,KAAK,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;YACvC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAA;QAC3C,CAAC;QAED,cAAc,EAAE,CAAA;QAEhB,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAE,CAAA;YAEnC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YAEnF,YAAY,EAAE,CAAA;QACf,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG,CAAA;QAE/B,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QAEzC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAE1C,IAAI,QAAQ,EAAE,CAAC;YACd,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvB,CAAC;aAAM,CAAC;YACP,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;QACrC,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACnB,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACtB,CAAC,CAAA;IAED,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEjB,KAAK,MAAM,CAAC,IAAI,GAAG;SACjB,OAAO,CAAC,+FAA+F,CAAC;SACxG,OAAO,EAAE,EAAE,CAAC;QACb,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAEvB,IAAI,EAAE,KAAK,OAAO,EAAE,CAAC;YACpB,KAAK,EAAE,CAAA;YACP,OAAO,GAAG,EAAE,CAAA;YACZ,KAAK,GAAG,EAAE,CAAA;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAQ;QAE5B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAA;QAE9C,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAQ;QAEvC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;QAEjC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,cAAc,EAAE,CAAA;YAEhB,SAAQ;QACT,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;IACzB,CAAC;IAED,KAAK,EAAE,CAAA;IACP,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAElB,uFAAuF;IACvF,sEAAsE;IACtE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IAExC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,wFAAwF;QACxF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3B,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAEpE,wFAAwF;IACxF,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAE3B,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QAC1B,MAAM,KAAK,GAAwC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QAE1E,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAA;YACzB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAEnC,IAAI,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAE,CAAA;gBAE7B,kGAAkG;gBAClG,0CAA0C;gBAC1C,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAQ;gBAE5B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;gBACzB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;YACjC,CAAC;iBAAM,CAAC;gBACP,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;gBAC7B,KAAK,CAAC,GAAG,EAAE,CAAA;YACZ,CAAC;QACF,CAAC;IACF,CAAC;IAED,yEAAyE;IACzE,4EAA4E;IAC5E,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IAE7C,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,wBAAwB,mBAAmB,CAAC,CAAA;IAC3F,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IAEjC,wFAAwF;IACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;IAE7B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEjB,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QAC1B,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAA;IACrD,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAElB,QAAQ,CACP,WAAW,EACX,GAAG,YAAY,CAAC,cAAc,EAAE,wBAAwB,cAAc,CAAC,cAAc,EAAE,WAAW;QACjG,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,kBAAkB;QAChD,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC,cAAc,EAAE,gDAAgD,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5G,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,cAAc,EAAE,0CAA0C,CAAC,CAAC,CAAC,EAAE,CAAC,CACnG,CAAA;IAED,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,CAAC,IAAI,EAAE,CAAA;AACpE,CAAC"}
|
|
@@ -2,26 +2,16 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
* @file Pass 1b of the candidate build — fold ICU's country display names onto the country rows.
|
|
6
5
|
*/
|
|
7
6
|
import type { PlaceAttrs, StageRow } from "#candidate/place-attrs";
|
|
8
7
|
/**
|
|
9
|
-
*
|
|
8
|
+
* Stages each country name that `Intl.DisplayNames` renders in the codex display-name
|
|
9
|
+
* locales as a non-primary key on that country's candidate row.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* 237 country rows are synthetic and carry a canonical English name and nothing else; WOF holds no Chinese country
|
|
14
|
-
* names at all; and the GeoNames alias fold filters through a Latin-script regex, so neither existing source could ever
|
|
15
|
-
* supply them.
|
|
11
|
+
* The row's display name is unchanged, so a query such as `格鲁吉亚` resolves to the existing Georgia row.
|
|
12
|
+
* When several country rows share an ISO code, the most populous one receives the keys.
|
|
16
13
|
*
|
|
17
|
-
*
|
|
18
|
-
* every other locale-sensitive operation. No download, no vendored corpus, no snapshot to drift.
|
|
19
|
-
*
|
|
20
|
-
* `is_primary = 0`: these are NAMES THE WORLD USES, not the country's canonical name. The display `name` stays whatever
|
|
21
|
-
* the gazetteer already had, so resolving `格鲁吉亚` answers with the Georgia country row rather than renaming it.
|
|
22
|
-
*
|
|
23
|
-
* Returns the row count so the caller can report it — a zero means ICU supplied nothing, which is a different fact from
|
|
24
|
-
* the pass not having run.
|
|
14
|
+
* @returns The number of rows staged.
|
|
25
15
|
*/
|
|
26
16
|
export declare function stageCountryDisplayNames(ctx: {
|
|
27
17
|
attrs: Map<number, PlaceAttrs>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"country-display-names.d.ts","sourceRoot":"","sources":["../../lib/candidate/country-display-names.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"country-display-names.d.ts","sourceRoot":"","sources":["../../lib/candidate/country-display-names.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAGlE;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE;IAC7C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,QAAQ,CAAA;IAClB,EAAE,EAAE;QAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAC/B,GAAG,MAAM,CAsCT"}
|
|
@@ -2,31 +2,19 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
* @file Pass 1b of the candidate build — fold ICU's country display names onto the country rows.
|
|
6
5
|
*/
|
|
7
6
|
import { enumerateCountryDisplayNames } from "@mailwoman/codex/country";
|
|
8
7
|
import { normalizeLocalityForKey } from "#street/normalize";
|
|
9
8
|
/**
|
|
10
|
-
*
|
|
9
|
+
* Stages each country name that `Intl.DisplayNames` renders in the codex display-name
|
|
10
|
+
* locales as a non-primary key on that country's candidate row.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* 237 country rows are synthetic and carry a canonical English name and nothing else; WOF holds no Chinese country
|
|
15
|
-
* names at all; and the GeoNames alias fold filters through a Latin-script regex, so neither existing source could ever
|
|
16
|
-
* supply them.
|
|
12
|
+
* The row's display name is unchanged, so a query such as `格鲁吉亚` resolves to the existing Georgia row.
|
|
13
|
+
* When several country rows share an ISO code, the most populous one receives the keys.
|
|
17
14
|
*
|
|
18
|
-
*
|
|
19
|
-
* every other locale-sensitive operation. No download, no vendored corpus, no snapshot to drift.
|
|
20
|
-
*
|
|
21
|
-
* `is_primary = 0`: these are NAMES THE WORLD USES, not the country's canonical name. The display `name` stays whatever
|
|
22
|
-
* the gazetteer already had, so resolving `格鲁吉亚` answers with the Georgia country row rather than renaming it.
|
|
23
|
-
*
|
|
24
|
-
* Returns the row count so the caller can report it — a zero means ICU supplied nothing, which is a different fact from
|
|
25
|
-
* the pass not having run.
|
|
15
|
+
* @returns The number of rows staged.
|
|
26
16
|
*/
|
|
27
17
|
export function stageCountryDisplayNames(ctx) {
|
|
28
|
-
// One country row per ISO2. Where a code has several (historic rows surviving the is_current filter), the most
|
|
29
|
-
// populous wins — the same tiebreak the ranking uses everywhere else.
|
|
30
18
|
const countryByISO2 = new Map();
|
|
31
19
|
for (const [sid, a] of ctx.attrs) {
|
|
32
20
|
if (a.ptid !== ctx.countryPtID)
|
|
@@ -35,7 +23,7 @@ export function stageCountryDisplayNames(ctx) {
|
|
|
35
23
|
if (!iso2 || iso2 === "??")
|
|
36
24
|
continue;
|
|
37
25
|
const held = countryByISO2.get(iso2);
|
|
38
|
-
if (!held || a.pop > held.a.pop) {
|
|
26
|
+
if (!held || (a.pop ?? 0) > (held.a.pop ?? 0)) {
|
|
39
27
|
countryByISO2.set(iso2, { sid, a });
|
|
40
28
|
}
|
|
41
29
|
}
|
|
@@ -46,8 +34,6 @@ export function stageCountryDisplayNames(ctx) {
|
|
|
46
34
|
if (!target)
|
|
47
35
|
continue;
|
|
48
36
|
const k = normalizeLocalityForKey(name);
|
|
49
|
-
// The country's own key is already staged as its primary; INSERT OR IGNORE at materialization dedupes the
|
|
50
|
-
// rest, so this only skips the obvious self-alias.
|
|
51
37
|
if (!k || k === target.a.pkey)
|
|
52
38
|
continue;
|
|
53
39
|
ctx.stageRow(k, target.a, target.sid, 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"country-display-names.js","sourceRoot":"","sources":["../../lib/candidate/country-display-names.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"country-display-names.js","sourceRoot":"","sources":["../../lib/candidate/country-display-names.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAA;AAGvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAE3D;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAMxC;IACA,MAAM,aAAa,GAAG,IAAI,GAAG,EAA0C,CAAA;IAEvE,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,WAAW;YAAE,SAAQ;QAExC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAEpC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,SAAQ;QAEpC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEpC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;YAC/C,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QACpC,CAAC;IACF,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,CAAA;IAEd,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEpB,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,4BAA4B,EAAE,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEtC,IAAI,CAAC,MAAM;YAAE,SAAQ;QAErB,MAAM,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;QAEvC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI;YAAE,SAAQ;QAEvC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAExC,MAAM,EAAE,CAAA;IACT,CAAC;IAED,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAErB,OAAO,MAAM,CAAA;AACd,CAAC"}
|
|
@@ -2,34 +2,26 @@
|
|
|
2
2
|
* @copyright Sister Software
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
|
-
* @file Pass 4 of the candidate build — fold a postcode or locality extract into the staging table.
|
|
6
5
|
*/
|
|
7
6
|
import { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
8
|
-
import type {
|
|
7
|
+
import type { PathBuilderLike } from "path-ts";
|
|
9
8
|
import type { PlaceAttrs, StageRow } from "#candidate/place-attrs";
|
|
9
|
+
import type { CandidateDatabase } from "#candidate/schema";
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* Stages one postcode or locality extract's located `spr` rows and their `names`
|
|
12
|
+
* aliases into the candidate table.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* {@link extractRegionAncestry}), so the pick's stamped ancestors agree with the scope it was found under.
|
|
14
|
+
* When `attrs` is given and the extract's `ancestors` table places a row in a known region,
|
|
15
|
+
* the row also gets that region's scope and the region's ancestor chain.
|
|
16
|
+
* The stored ancestors then agree with the row's scope.
|
|
18
17
|
*/
|
|
19
18
|
export declare function foldExtract(ctx: {
|
|
20
|
-
/**
|
|
21
|
-
* The staging connection. The extract itself is opened read-only here and closed before returning.
|
|
22
|
-
*/
|
|
23
19
|
out: DatabaseClient<CandidateDatabase>;
|
|
24
|
-
extractPath:
|
|
20
|
+
extractPath: PathBuilderLike;
|
|
25
21
|
extractPlacetype: "postalcode" | "locality";
|
|
26
22
|
ccID: (code: string | null) => number;
|
|
27
23
|
ptID: (pt: string | null) => number;
|
|
28
24
|
stageRow: StageRow;
|
|
29
|
-
/**
|
|
30
|
-
* The admin places pass 1 staged — what an extract's region ancestry is resolved against. Absent, no extract row
|
|
31
|
-
* takes a region scope (the postcode extracts, which carry none).
|
|
32
|
-
*/
|
|
33
25
|
attrs?: Map<number, PlaceAttrs>;
|
|
34
26
|
progress: (phase: string, message: string) => void;
|
|
35
27
|
}): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-fold.d.ts","sourceRoot":"","sources":["../../lib/candidate/extract-fold.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"extract-fold.d.ts","sourceRoot":"","sources":["../../lib/candidate/extract-fold.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAG9C,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AA0B1D;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE;IAChC,GAAG,EAAE,cAAc,CAAC,iBAAiB,CAAC,CAAA;IACtC,WAAW,EAAE,eAAe,CAAA;IAC5B,gBAAgB,EAAE,YAAY,GAAG,UAAU,CAAA;IAC3C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAA;IACrC,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,CAAA;IACnC,QAAQ,EAAE,QAAQ,CAAA;IAElB,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAClD,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAqH/E"}
|