@mailwoman/resolver-wof-sqlite 8.0.0 → 8.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/candidate-lookup.ts +13 -1
- package/coverage-manifest-schema.ts +210 -0
- package/fst-builder.ts +39 -7
- package/fst-types.ts +20 -0
- package/index.ts +9 -0
- package/interpolation.ts +26 -0
- package/out/candidate-lookup.d.ts +7 -0
- package/out/candidate-lookup.d.ts.map +1 -1
- package/out/candidate-lookup.js +11 -0
- package/out/candidate-lookup.js.map +1 -1
- package/out/coverage-manifest-schema.d.ts +81 -0
- package/out/coverage-manifest-schema.d.ts.map +1 -0
- package/out/coverage-manifest-schema.js +145 -0
- package/out/coverage-manifest-schema.js.map +1 -0
- package/out/fst-builder.d.ts.map +1 -1
- package/out/fst-builder.js +29 -6
- package/out/fst-builder.js.map +1 -1
- package/out/fst-types.d.ts +20 -0
- package/out/fst-types.d.ts.map +1 -1
- package/out/index.d.ts +2 -0
- package/out/index.d.ts.map +1 -1
- package/out/index.js +1 -0
- package/out/index.js.map +1 -1
- package/out/interpolation.d.ts +6 -0
- package/out/interpolation.d.ts.map +1 -1
- package/out/interpolation.js +21 -0
- package/out/interpolation.js.map +1 -1
- package/out/street-morphology-fst-loader.d.ts +51 -0
- package/out/street-morphology-fst-loader.d.ts.map +1 -0
- package/out/street-morphology-fst-loader.js +53 -0
- package/out/street-morphology-fst-loader.js.map +1 -0
- package/out/street-segment-schema.d.ts +23 -0
- package/out/street-segment-schema.d.ts.map +1 -1
- package/out/street-segment-schema.js +15 -0
- package/out/street-segment-schema.js.map +1 -1
- package/package.json +13 -5
- package/street-morphology-fst-loader.ts +87 -0
- package/street-segment-schema.ts +36 -0
package/candidate-lookup.ts
CHANGED
|
@@ -25,10 +25,11 @@
|
|
|
25
25
|
|
|
26
26
|
import { DatabaseSync } from "node:sqlite"
|
|
27
27
|
|
|
28
|
-
import { expandPlacetypeFilter } from "@mailwoman/resolver"
|
|
28
|
+
import { expandPlacetypeFilter, type GazetteerArtifactCoverage } from "@mailwoman/resolver"
|
|
29
29
|
|
|
30
30
|
import { CANDIDATE_FTS_TABLE } from "./candidate-fts.ts"
|
|
31
31
|
import type { CandidateTable, CountryCodeTable, PlacetypeCodeTable } from "./candidate-schema.ts"
|
|
32
|
+
import { readGazetteerCoverageManifest } from "./coverage-manifest-schema.ts"
|
|
32
33
|
import { haversineKm } from "./geo.ts"
|
|
33
34
|
import { trigramJaccard } from "./lookup.ts"
|
|
34
35
|
import { POSTAL_CITY_CANDIDATE_TABLE, type PostalCityCandidateTable } from "./postal-city-candidate-schema.ts"
|
|
@@ -212,6 +213,12 @@ export class WOFCandidateTableLookup implements PlaceLookup {
|
|
|
212
213
|
* country-agnostic retry. Prepared only alongside `#ftsProbe`.
|
|
213
214
|
*/
|
|
214
215
|
readonly #nameKeyExistsProbe: ReturnType<DatabaseSync["prepare"]> | undefined
|
|
216
|
+
/**
|
|
217
|
+
* Facts this candidate DB declares about itself — the coverage manifest (`country_coverage` + `country_bbox`) the
|
|
218
|
+
* gazetteer build emits, read once at open. `undefined` when the artifact predates the manifest, so every consumer
|
|
219
|
+
* (the hard-country coverage gate, guard-B plausibility) falls back to its code constants byte-identically.
|
|
220
|
+
*/
|
|
221
|
+
readonly artifactCoverage: GazetteerArtifactCoverage | undefined
|
|
215
222
|
|
|
216
223
|
constructor(opts: WOFCandidateTableLookupOpts) {
|
|
217
224
|
if (opts.database) {
|
|
@@ -255,6 +262,11 @@ export class WOFCandidateTableLookup implements PlaceLookup {
|
|
|
255
262
|
)
|
|
256
263
|
this.#nameKeyExistsProbe = this.#db.prepare("SELECT 1 FROM candidate WHERE name_key = ? LIMIT 1")
|
|
257
264
|
}
|
|
265
|
+
|
|
266
|
+
// Coverage manifest (survey candidate #2): the artifact's own coverage facts, existence-gated like
|
|
267
|
+
// the probes above — a candidate.db built before the manifest reads `undefined` and consumers keep
|
|
268
|
+
// their code-constant fallbacks byte-identically.
|
|
269
|
+
this.artifactCoverage = readGazetteerCoverageManifest(this.#db)
|
|
258
270
|
}
|
|
259
271
|
|
|
260
272
|
/** Does this query want a locality-tier place? Postal-city aliases (#741) are all localities. */
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Typed schema + read/write helpers for the candidate gazetteer's COVERAGE MANIFEST — the two
|
|
7
|
+
* country-keyed tables through which the artifact declares facts about ITSELF, so those facts are
|
|
8
|
+
* updated at gazetteer REBUILD, not by a hand-edited code PR after someone remembers:
|
|
9
|
+
*
|
|
10
|
+
* - `country_coverage`: the hard-country-filter coverage record (#743/#194) — per-country
|
|
11
|
+
* promote-gate verdicts + the measured hard-resolve rates that used to live in a code comment on
|
|
12
|
+
* `HARD_PLACE_COUNTRY_SAFELIST`. Presence = measured; `hard_filter_safe = 0` = measured and
|
|
13
|
+
* FAILED the gate (FI 69.5%, PL 77.8%) — distinguishable from a country never measured at all
|
|
14
|
+
* (the meaning-of-zero rule, `docs/articles/plan/reference/layer-contract.mdx`).
|
|
15
|
+
* - `country_bbox`: the coarse guard-B plausibility boxes that used to live in
|
|
16
|
+
* `resolver/plausibility.ts`'s `COUNTRY_BBOX`. An absent row fails open (never trips the guard),
|
|
17
|
+
* exactly like an absent key in the constant.
|
|
18
|
+
*
|
|
19
|
+
* Emission happens at build time (`mailwoman/gazetteer-pipeline/coverage-manifest.ts` owns the
|
|
20
|
+
* measured record and calls {@link writeGazetteerCoverageManifest} before the DB is sealed — never
|
|
21
|
+
* patch a shipped DB, rebuild). The read happens at open time ({@link WOFCandidateTableLookup}
|
|
22
|
+
* calls {@link readGazetteerCoverageManifest} in its constructor); an artifact that predates the
|
|
23
|
+
* manifest returns `undefined` and every consumer falls back to the code constants byte-identically.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import type { DatabaseSync } from "node:sqlite"
|
|
27
|
+
|
|
28
|
+
import {
|
|
29
|
+
hardCountrySafelistFromCoverage,
|
|
30
|
+
type CountryBBoxFact,
|
|
31
|
+
type CountryCoverageFact,
|
|
32
|
+
type GazetteerArtifactCoverage,
|
|
33
|
+
} from "@mailwoman/core/resolver"
|
|
34
|
+
import { sql, type Kysely } from "kysely"
|
|
35
|
+
|
|
36
|
+
import { hasTable } from "./sqlite-utils.ts"
|
|
37
|
+
|
|
38
|
+
/** One country's hard-filter coverage measurement — the storage form of {@link CountryCoverageFact}. */
|
|
39
|
+
export interface CountryCoverageTable {
|
|
40
|
+
/** ISO 3166-1 alpha-2, uppercase (PK). */
|
|
41
|
+
country: string
|
|
42
|
+
/** 0/1 — the promote-gate verdict (a verdict column, NOT re-derived from the rate; see the fact type's docstring). */
|
|
43
|
+
hard_filter_safe: number
|
|
44
|
+
/** Measured hard-resolve rate 0..1 on the panel named in `source`; NULL when the receipt recorded none. */
|
|
45
|
+
hard_resolve_rate: number | null
|
|
46
|
+
/** Panel size behind `hard_resolve_rate`; NULL when unrecorded. */
|
|
47
|
+
sample_size: number | null
|
|
48
|
+
/** ISO-8601 date of the measurement / promote gate. */
|
|
49
|
+
measured_at: string
|
|
50
|
+
/** The receipt: which panel/gate produced this row. */
|
|
51
|
+
source: string
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** One country's coarse guard-B bounding box — the storage form of {@link CountryBBoxFact}. */
|
|
55
|
+
export interface CountryBBoxTable {
|
|
56
|
+
/** ISO 3166-1 alpha-2, uppercase (PK). */
|
|
57
|
+
country: string
|
|
58
|
+
lat_min: number
|
|
59
|
+
lat_max: number
|
|
60
|
+
lon_min: number
|
|
61
|
+
lon_max: number
|
|
62
|
+
/** Provenance of the box (harness + date). */
|
|
63
|
+
source: string
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** The coverage-manifest schema for `new DatabaseClient<GazetteerCoverageDatabase>(...)`. */
|
|
67
|
+
export interface GazetteerCoverageDatabase {
|
|
68
|
+
country_coverage: CountryCoverageTable
|
|
69
|
+
country_bbox: CountryBBoxTable
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Table names the lookup probes (existence-gated, so a candidate.db built before the manifest is byte-stable). */
|
|
73
|
+
export const COUNTRY_COVERAGE_TABLE = "country_coverage"
|
|
74
|
+
export const COUNTRY_BBOX_TABLE = "country_bbox"
|
|
75
|
+
|
|
76
|
+
/** Create `country_coverage` — a handful of small PK-probed rows, the WITHOUT ROWID sweet spot. */
|
|
77
|
+
export async function createCountryCoverageTable(db: Kysely<GazetteerCoverageDatabase>): Promise<void> {
|
|
78
|
+
await db.schema
|
|
79
|
+
.createTable(COUNTRY_COVERAGE_TABLE)
|
|
80
|
+
.ifNotExists()
|
|
81
|
+
.addColumn("country", "text", (c) => c.primaryKey())
|
|
82
|
+
.addColumn("hard_filter_safe", "integer", (c) => c.notNull())
|
|
83
|
+
.addColumn("hard_resolve_rate", "real")
|
|
84
|
+
.addColumn("sample_size", "integer")
|
|
85
|
+
.addColumn("measured_at", "text", (c) => c.notNull())
|
|
86
|
+
.addColumn("source", "text", (c) => c.notNull())
|
|
87
|
+
// `WITHOUT ROWID` has no first-class builder; the raw modifier is the idiomatic fallback.
|
|
88
|
+
.modifyEnd(sql`without rowid`)
|
|
89
|
+
.execute()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Create `country_bbox` — same shape discipline as {@link createCountryCoverageTable}. */
|
|
93
|
+
export async function createCountryBBoxTable(db: Kysely<GazetteerCoverageDatabase>): Promise<void> {
|
|
94
|
+
await db.schema
|
|
95
|
+
.createTable(COUNTRY_BBOX_TABLE)
|
|
96
|
+
.ifNotExists()
|
|
97
|
+
.addColumn("country", "text", (c) => c.primaryKey())
|
|
98
|
+
.addColumn("lat_min", "real", (c) => c.notNull())
|
|
99
|
+
.addColumn("lat_max", "real", (c) => c.notNull())
|
|
100
|
+
.addColumn("lon_min", "real", (c) => c.notNull())
|
|
101
|
+
.addColumn("lon_max", "real", (c) => c.notNull())
|
|
102
|
+
.addColumn("source", "text", (c) => c.notNull())
|
|
103
|
+
.modifyEnd(sql`without rowid`)
|
|
104
|
+
.execute()
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Write the coverage manifest into a candidate DB UNDER CONSTRUCTION (pre-seal — a shipped DB is never patched, rebuild
|
|
109
|
+
* instead). Creates both tables and inserts the facts; call exactly once, from the gazetteer build.
|
|
110
|
+
*/
|
|
111
|
+
export async function writeGazetteerCoverageManifest(
|
|
112
|
+
db: Kysely<GazetteerCoverageDatabase>,
|
|
113
|
+
facts: { coverage: readonly CountryCoverageFact[]; bboxes: readonly CountryBBoxFact[] }
|
|
114
|
+
): Promise<void> {
|
|
115
|
+
await createCountryCoverageTable(db)
|
|
116
|
+
await createCountryBBoxTable(db)
|
|
117
|
+
|
|
118
|
+
if (facts.coverage.length > 0) {
|
|
119
|
+
await db
|
|
120
|
+
.insertInto(COUNTRY_COVERAGE_TABLE)
|
|
121
|
+
.values(
|
|
122
|
+
facts.coverage.map((f) => ({
|
|
123
|
+
country: f.country.toUpperCase(),
|
|
124
|
+
hard_filter_safe: f.hardFilterSafe ? 1 : 0,
|
|
125
|
+
hard_resolve_rate: f.hardResolveRate ?? null,
|
|
126
|
+
sample_size: f.sampleSize ?? null,
|
|
127
|
+
measured_at: f.measuredAt,
|
|
128
|
+
source: f.source,
|
|
129
|
+
}))
|
|
130
|
+
)
|
|
131
|
+
.execute()
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (facts.bboxes.length > 0) {
|
|
135
|
+
await db
|
|
136
|
+
.insertInto(COUNTRY_BBOX_TABLE)
|
|
137
|
+
.values(
|
|
138
|
+
facts.bboxes.map((f) => ({
|
|
139
|
+
country: f.country.toUpperCase(),
|
|
140
|
+
lat_min: f.latMin,
|
|
141
|
+
lat_max: f.latMax,
|
|
142
|
+
lon_min: f.lonMin,
|
|
143
|
+
lon_max: f.lonMax,
|
|
144
|
+
source: f.source,
|
|
145
|
+
}))
|
|
146
|
+
)
|
|
147
|
+
.execute()
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Read the coverage manifest from an OPEN candidate DB, or `undefined` when the artifact predates it (neither table
|
|
153
|
+
* present) — the signal for consumers to fall back to the code constants byte-identically. Synchronous raw reads on
|
|
154
|
+
* purpose: this runs inside {@link WOFCandidateTableLookup}'s synchronous constructor (the sync-reader carve-out in
|
|
155
|
+
* `AGENTS.md`), and the tables are a few dozen rows read once per open.
|
|
156
|
+
*/
|
|
157
|
+
export function readGazetteerCoverageManifest(db: DatabaseSync): GazetteerArtifactCoverage | undefined {
|
|
158
|
+
const hasCoverage = hasTable(db, COUNTRY_COVERAGE_TABLE)
|
|
159
|
+
const hasBBox = hasTable(db, COUNTRY_BBOX_TABLE)
|
|
160
|
+
|
|
161
|
+
if (!hasCoverage && !hasBBox) return undefined
|
|
162
|
+
|
|
163
|
+
const countryCoverage = new Map<string, CountryCoverageFact>()
|
|
164
|
+
|
|
165
|
+
if (hasCoverage) {
|
|
166
|
+
const rows = db
|
|
167
|
+
.prepare(
|
|
168
|
+
`SELECT country, hard_filter_safe, hard_resolve_rate, sample_size, measured_at, source FROM ${COUNTRY_COVERAGE_TABLE}`
|
|
169
|
+
)
|
|
170
|
+
.all() as unknown as CountryCoverageTable[]
|
|
171
|
+
|
|
172
|
+
for (const row of rows) {
|
|
173
|
+
const country = String(row.country).toUpperCase()
|
|
174
|
+
countryCoverage.set(country, {
|
|
175
|
+
country,
|
|
176
|
+
hardFilterSafe: Number(row.hard_filter_safe) !== 0,
|
|
177
|
+
...(row.hard_resolve_rate === null ? {} : { hardResolveRate: Number(row.hard_resolve_rate) }),
|
|
178
|
+
...(row.sample_size === null ? {} : { sampleSize: Number(row.sample_size) }),
|
|
179
|
+
measuredAt: String(row.measured_at),
|
|
180
|
+
source: String(row.source),
|
|
181
|
+
})
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const countryBBoxes = new Map<string, CountryBBoxFact>()
|
|
186
|
+
|
|
187
|
+
if (hasBBox) {
|
|
188
|
+
const rows = db
|
|
189
|
+
.prepare(`SELECT country, lat_min, lat_max, lon_min, lon_max, source FROM ${COUNTRY_BBOX_TABLE}`)
|
|
190
|
+
.all() as unknown as CountryBBoxTable[]
|
|
191
|
+
|
|
192
|
+
for (const row of rows) {
|
|
193
|
+
const country = String(row.country).toUpperCase()
|
|
194
|
+
countryBBoxes.set(country, {
|
|
195
|
+
country,
|
|
196
|
+
latMin: Number(row.lat_min),
|
|
197
|
+
latMax: Number(row.lat_max),
|
|
198
|
+
lonMin: Number(row.lon_min),
|
|
199
|
+
lonMax: Number(row.lon_max),
|
|
200
|
+
source: String(row.source),
|
|
201
|
+
})
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
countryCoverage,
|
|
207
|
+
countryBBoxes,
|
|
208
|
+
hardCountrySafelist: hardCountrySafelistFromCoverage(countryCoverage.values()),
|
|
209
|
+
}
|
|
210
|
+
}
|
package/fst-builder.ts
CHANGED
|
@@ -206,8 +206,30 @@ export function buildFSTFromWOF(opts: BuildFSTOpts): {
|
|
|
206
206
|
progress("trie", "Building trie")
|
|
207
207
|
const nodes: FSTNode[] = [{ edges: new Map(), places: [] }]
|
|
208
208
|
|
|
209
|
-
|
|
210
|
-
|
|
209
|
+
// Degenerate-surface curation (see BuildFSTOpts.excludeSurfaces). Applied to the WHOLE normalized
|
|
210
|
+
// surface only — a multi-token name containing a function word ("los angeles") is never affected.
|
|
211
|
+
const excludeSurfaces = opts.excludeSurfaces
|
|
212
|
+
const excludeAllTokensOf = opts.excludeAllTokensOf
|
|
213
|
+
let excludedCount = 0
|
|
214
|
+
|
|
215
|
+
function isDegenerate(tokens: string[]): boolean {
|
|
216
|
+
if (tokens.length === 0) return false
|
|
217
|
+
|
|
218
|
+
if (excludeSurfaces?.has(tokens.join(" "))) return true
|
|
219
|
+
|
|
220
|
+
if (excludeAllTokensOf !== undefined && tokens.every((t) => excludeAllTokensOf.has(t))) return true
|
|
221
|
+
|
|
222
|
+
return false
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function insertName(tokens: string[], entry: PlaceEntry): boolean {
|
|
226
|
+
if (tokens.length === 0) return false
|
|
227
|
+
|
|
228
|
+
if (isDegenerate(tokens)) {
|
|
229
|
+
excludedCount++
|
|
230
|
+
|
|
231
|
+
return false
|
|
232
|
+
}
|
|
211
233
|
let stateID = 0
|
|
212
234
|
|
|
213
235
|
for (const t of tokens) {
|
|
@@ -227,6 +249,8 @@ export function buildFSTFromWOF(opts: BuildFSTOpts): {
|
|
|
227
249
|
if (!existing.some((p) => p.wofID === entry.wofID && p.placetype === entry.placetype)) {
|
|
228
250
|
existing.push(entry)
|
|
229
251
|
}
|
|
252
|
+
|
|
253
|
+
return true
|
|
230
254
|
}
|
|
231
255
|
|
|
232
256
|
let insertCount = 0
|
|
@@ -245,8 +269,10 @@ export function buildFSTFromWOF(opts: BuildFSTOpts): {
|
|
|
245
269
|
|
|
246
270
|
// Insert the primary name from spr.
|
|
247
271
|
const primaryTokens = normalizeTokens(row.name)
|
|
248
|
-
|
|
249
|
-
|
|
272
|
+
|
|
273
|
+
if (insertName(primaryTokens, entry)) {
|
|
274
|
+
insertCount++
|
|
275
|
+
}
|
|
250
276
|
|
|
251
277
|
// Insert alt names from the names table.
|
|
252
278
|
const altNames = namesByPlace.get(row.id) ?? []
|
|
@@ -255,15 +281,18 @@ export function buildFSTFromWOF(opts: BuildFSTOpts): {
|
|
|
255
281
|
if (altName === row.name) continue
|
|
256
282
|
const altTokens = normalizeTokens(altName)
|
|
257
283
|
|
|
258
|
-
if (altTokens.length > 0 && altTokens.join(" ") !== primaryTokens.join(" ")) {
|
|
259
|
-
insertName(altTokens, entry)
|
|
284
|
+
if (altTokens.length > 0 && altTokens.join(" ") !== primaryTokens.join(" ") && insertName(altTokens, entry)) {
|
|
260
285
|
insertCount++
|
|
261
286
|
}
|
|
262
287
|
}
|
|
263
288
|
}
|
|
264
289
|
|
|
265
290
|
db.close()
|
|
266
|
-
progress(
|
|
291
|
+
progress(
|
|
292
|
+
"done",
|
|
293
|
+
`Built trie: ${nodes.length} states, ${insertCount} name insertions` +
|
|
294
|
+
(excludedCount > 0 ? ` (${excludedCount} degenerate surfaces excluded)` : "")
|
|
295
|
+
)
|
|
267
296
|
|
|
268
297
|
const edgeCount = nodes.reduce((sum, n) => sum + n.edges.size, 0)
|
|
269
298
|
const matcher = FSTMatcher.fromNodes(nodes)
|
|
@@ -276,6 +305,9 @@ export function buildFSTFromWOF(opts: BuildFSTOpts): {
|
|
|
276
305
|
nameInsertions: insertCount,
|
|
277
306
|
importanceMatches: importanceMap.size,
|
|
278
307
|
sourceDB: opts.dbPath,
|
|
308
|
+
...(excludeSurfaces !== undefined || excludeAllTokensOf !== undefined
|
|
309
|
+
? { exclusionPolicy: opts.exclusionPolicy ?? "unspecified", excludedInsertions: excludedCount }
|
|
310
|
+
: {}),
|
|
279
311
|
}
|
|
280
312
|
|
|
281
313
|
return {
|
package/fst-types.ts
CHANGED
|
@@ -60,6 +60,10 @@ export interface FSTProvenance {
|
|
|
60
60
|
importanceMatches: number
|
|
61
61
|
sourceDB?: string
|
|
62
62
|
modelCardVersion?: string
|
|
63
|
+
/** Degenerate-surface curation policy applied at build time (absent = uncurated build). */
|
|
64
|
+
exclusionPolicy?: string
|
|
65
|
+
/** Name insertions refused by the curation policy. */
|
|
66
|
+
excludedInsertions?: number
|
|
63
67
|
}
|
|
64
68
|
|
|
65
69
|
export interface BuildFSTOpts {
|
|
@@ -67,6 +71,22 @@ export interface BuildFSTOpts {
|
|
|
67
71
|
countries?: string[]
|
|
68
72
|
placetypes?: PlacetypeID[]
|
|
69
73
|
languages?: string[]
|
|
74
|
+
/**
|
|
75
|
+
* Degenerate-surface curation (build-time; the ASR-contextual-biasing "prune the bias list" discipline). A name whose
|
|
76
|
+
* FULL normalized token sequence joins to a member of this set is never inserted — the surface carries no
|
|
77
|
+
* discriminative value as a bias key (bare function words: "la"; bare street-type words: "boulevard"). The FST is a
|
|
78
|
+
* bias list, not the gazetteer of record — the resolver's candidate tables are untouched, so excluded places stay
|
|
79
|
+
* findable; they just stop nudging the decoder on degenerate keys. Keys must be `normalizeTokens(...).join(" ")`.
|
|
80
|
+
*/
|
|
81
|
+
excludeSurfaces?: ReadonlySet<string>
|
|
82
|
+
/**
|
|
83
|
+
* Compositional clause of the same policy: refuse a name whose EVERY normalized token is a member (e.g. "de la") — a
|
|
84
|
+
* surface made entirely of function words cannot be discriminative. Source this from stopwords only, never
|
|
85
|
+
* street-type words ("Avenue Road" is a real name; "de la" is not).
|
|
86
|
+
*/
|
|
87
|
+
excludeAllTokensOf?: ReadonlySet<string>
|
|
88
|
+
/** Recorded verbatim into provenance when either exclusion set is supplied. */
|
|
89
|
+
exclusionPolicy?: string
|
|
70
90
|
onProgress?: (phase: string, detail?: string) => void
|
|
71
91
|
}
|
|
72
92
|
|
package/index.ts
CHANGED
|
@@ -23,6 +23,15 @@ export { WOFSqlitePlaceLookup, type RankingWeights, type WOFSqlitePlaceLookupOpt
|
|
|
23
23
|
|
|
24
24
|
export { CANDIDATE_FTS_TABLE, createCandidateFTS } from "./candidate-fts.ts"
|
|
25
25
|
export { WOFCandidateTableLookup, type WOFCandidateTableLookupOpts } from "./candidate-lookup.ts"
|
|
26
|
+
export {
|
|
27
|
+
COUNTRY_BBOX_TABLE,
|
|
28
|
+
COUNTRY_COVERAGE_TABLE,
|
|
29
|
+
createCountryBBoxTable,
|
|
30
|
+
createCountryCoverageTable,
|
|
31
|
+
readGazetteerCoverageManifest,
|
|
32
|
+
writeGazetteerCoverageManifest,
|
|
33
|
+
} from "./coverage-manifest-schema.ts"
|
|
34
|
+
export type { CountryBBoxTable, CountryCoverageTable, GazetteerCoverageDatabase } from "./coverage-manifest-schema.ts"
|
|
26
35
|
export { SQLiteStreetNameLookup, type SQLiteStreetNameLookupOpts } from "./street-name-lookup.ts"
|
|
27
36
|
|
|
28
37
|
export { GEONAMES_ID_BASE, ingestGeonamesAliases, type GeonamesIngestProgress } from "./geonames-aliases.ts"
|
package/interpolation.ts
CHANGED
|
@@ -97,6 +97,7 @@ export class StreetInterpolator implements InterpolationLookup {
|
|
|
97
97
|
readonly #ownsDB: boolean
|
|
98
98
|
readonly #byPostcode: ReturnType<DatabaseSync["prepare"]> | undefined
|
|
99
99
|
readonly #byStreet: ReturnType<DatabaseSync["prepare"]> | undefined
|
|
100
|
+
readonly #radiusCalibration: number | undefined
|
|
100
101
|
|
|
101
102
|
constructor(opts: { dbPath?: string; database?: DatabaseSync }) {
|
|
102
103
|
if (opts.database) {
|
|
@@ -122,6 +123,31 @@ export class StreetInterpolator implements InterpolationLookup {
|
|
|
122
123
|
WHERE street_norm = ? AND min_hn <= ? AND max_hn >= ?`
|
|
123
124
|
)
|
|
124
125
|
}
|
|
126
|
+
|
|
127
|
+
// #374 doctrine: the conformal radius multiplier is a property of the calibration set the ARTIFACT was
|
|
128
|
+
// built against, so it ships in the shard's `interp_calibration` metadata table (street-segment-schema.ts)
|
|
129
|
+
// and is read here, once, at open time — sync raw `.prepare()` per the sync-by-interface doctrine
|
|
130
|
+
// (AGENTS.md). Shards predating the table (the pre-2026-07 fleet) yield `undefined`; callers then fall
|
|
131
|
+
// back to their in-code table, byte-identically.
|
|
132
|
+
if (hasTable(this.#db, "interp_calibration")) {
|
|
133
|
+
const row = this.#db.prepare("SELECT radius_multiplier FROM interp_calibration LIMIT 1").get() as
|
|
134
|
+
| { radius_multiplier: unknown }
|
|
135
|
+
| undefined
|
|
136
|
+
const value = row?.radius_multiplier
|
|
137
|
+
|
|
138
|
+
if (typeof value === "number" && Number.isFinite(value) && value > 0) {
|
|
139
|
+
this.#radiusCalibration = value
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* The artifact's own conformal radius multiplier (#374), read from the shard's `interp_calibration` metadata table at
|
|
146
|
+
* construction. `undefined` = the shard predates the table (or carries no valid row) — the resolver then applies no
|
|
147
|
+
* artifact default and callers may supply a legacy fallback.
|
|
148
|
+
*/
|
|
149
|
+
get radiusCalibration(): number | undefined {
|
|
150
|
+
return this.#radiusCalibration
|
|
125
151
|
}
|
|
126
152
|
|
|
127
153
|
find(query: InterpolationQuery): InterpolatedHit | null {
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
* `bbox` field on {@link FindPlaceQuery}).
|
|
24
24
|
*/
|
|
25
25
|
import { DatabaseSync } from "node:sqlite";
|
|
26
|
+
import { type GazetteerArtifactCoverage } from "@mailwoman/resolver";
|
|
26
27
|
import type { CandidateTable } from "./candidate-schema.ts";
|
|
27
28
|
import type { FindPlaceQuery, PlaceCandidate, PlaceLookup } from "./types.ts";
|
|
28
29
|
export interface WOFCandidateTableLookupOpts {
|
|
@@ -68,6 +69,12 @@ export declare function rankByPrimaryPreference<R extends Pick<CandidateRow, "ne
|
|
|
68
69
|
*/
|
|
69
70
|
export declare class WOFCandidateTableLookup implements PlaceLookup {
|
|
70
71
|
#private;
|
|
72
|
+
/**
|
|
73
|
+
* Facts this candidate DB declares about itself — the coverage manifest (`country_coverage` + `country_bbox`) the
|
|
74
|
+
* gazetteer build emits, read once at open. `undefined` when the artifact predates the manifest, so every consumer
|
|
75
|
+
* (the hard-country coverage gate, guard-B plausibility) falls back to its code constants byte-identically.
|
|
76
|
+
*/
|
|
77
|
+
readonly artifactCoverage: GazetteerArtifactCoverage | undefined;
|
|
71
78
|
constructor(opts: WOFCandidateTableLookupOpts);
|
|
72
79
|
findPlace(query: FindPlaceQuery): Promise<PlaceCandidate[]>;
|
|
73
80
|
close(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidate-lookup.d.ts","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"candidate-lookup.d.ts","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAG3F,OAAO,KAAK,EAAE,cAAc,EAAwC,MAAM,uBAAuB,CAAA;AAOjG,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAA;AAE3F,MAAM,WAAW,2BAA2B;IAC3C,gFAAgF;IAChF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,YAAY,CAAA;CACvB;AAED;;;GAGG;AACH,KAAK,YAAY,GAAG,IAAI,CACvB,cAAc,EACZ,QAAQ,GACR,MAAM,GACN,YAAY,GACZ,cAAc,GACd,UAAU,GACV,WAAW,GACX,SAAS,GACT,SAAS,GACT,SAAS,GACT,SAAS,GACT,UAAU,GACV,YAAY,CACd,CAAA;AAwCD,wHAAwH;AACxH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;;;;;OAOG;IACH,OAAO,EAAE,OAAO,CAAA;CAChB,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC,EAC7G,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,SAA2B,GAC9B,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CA+BrB;AAqBD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,WAAW;;IAyB1D;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,GAAG,SAAS,CAAA;gBAEpD,IAAI,EAAE,2BAA2B;IAyDvC,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAuQjE,KAAK,IAAI,IAAI;CAKb"}
|
package/out/candidate-lookup.js
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
import { DatabaseSync } from "node:sqlite";
|
|
26
26
|
import { expandPlacetypeFilter } from "@mailwoman/resolver";
|
|
27
27
|
import { CANDIDATE_FTS_TABLE } from "./candidate-fts.js";
|
|
28
|
+
import { readGazetteerCoverageManifest } from "./coverage-manifest-schema.js";
|
|
28
29
|
import { haversineKm } from "./geo.js";
|
|
29
30
|
import { trigramJaccard } from "./lookup.js";
|
|
30
31
|
import { POSTAL_CITY_CANDIDATE_TABLE } from "./postal-city-candidate-schema.js";
|
|
@@ -141,6 +142,12 @@ export class WOFCandidateTableLookup {
|
|
|
141
142
|
* country-agnostic retry. Prepared only alongside `#ftsProbe`.
|
|
142
143
|
*/
|
|
143
144
|
#nameKeyExistsProbe;
|
|
145
|
+
/**
|
|
146
|
+
* Facts this candidate DB declares about itself — the coverage manifest (`country_coverage` + `country_bbox`) the
|
|
147
|
+
* gazetteer build emits, read once at open. `undefined` when the artifact predates the manifest, so every consumer
|
|
148
|
+
* (the hard-country coverage gate, guard-B plausibility) falls back to its code constants byte-identically.
|
|
149
|
+
*/
|
|
150
|
+
artifactCoverage;
|
|
144
151
|
constructor(opts) {
|
|
145
152
|
if (opts.database) {
|
|
146
153
|
this.#db = opts.database;
|
|
@@ -177,6 +184,10 @@ export class WOFCandidateTableLookup {
|
|
|
177
184
|
this.#ftsProbe = this.#db.prepare(`SELECT name_key FROM ${CANDIDATE_FTS_TABLE} WHERE ${CANDIDATE_FTS_TABLE} MATCH ? ORDER BY bm25(${CANDIDATE_FTS_TABLE}) LIMIT ?`);
|
|
178
185
|
this.#nameKeyExistsProbe = this.#db.prepare("SELECT 1 FROM candidate WHERE name_key = ? LIMIT 1");
|
|
179
186
|
}
|
|
187
|
+
// Coverage manifest (survey candidate #2): the artifact's own coverage facts, existence-gated like
|
|
188
|
+
// the probes above — a candidate.db built before the manifest reads `undefined` and consumers keep
|
|
189
|
+
// their code-constant fallbacks byte-identically.
|
|
190
|
+
this.artifactCoverage = readGazetteerCoverageManifest(this.#db);
|
|
180
191
|
}
|
|
181
192
|
/** Does this query want a locality-tier place? Postal-city aliases (#741) are all localities. */
|
|
182
193
|
#wantsLocality(placetype) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidate-lookup.js","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"candidate-lookup.js","sourceRoot":"","sources":["../candidate-lookup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @copyright Sister Software
|
|
3
|
+
* @license AGPL-3.0
|
|
4
|
+
* @author Teffen Ellis, et al.
|
|
5
|
+
*
|
|
6
|
+
* Typed schema + read/write helpers for the candidate gazetteer's COVERAGE MANIFEST — the two
|
|
7
|
+
* country-keyed tables through which the artifact declares facts about ITSELF, so those facts are
|
|
8
|
+
* updated at gazetteer REBUILD, not by a hand-edited code PR after someone remembers:
|
|
9
|
+
*
|
|
10
|
+
* - `country_coverage`: the hard-country-filter coverage record (#743/#194) — per-country
|
|
11
|
+
* promote-gate verdicts + the measured hard-resolve rates that used to live in a code comment on
|
|
12
|
+
* `HARD_PLACE_COUNTRY_SAFELIST`. Presence = measured; `hard_filter_safe = 0` = measured and
|
|
13
|
+
* FAILED the gate (FI 69.5%, PL 77.8%) — distinguishable from a country never measured at all
|
|
14
|
+
* (the meaning-of-zero rule, `docs/articles/plan/reference/layer-contract.mdx`).
|
|
15
|
+
* - `country_bbox`: the coarse guard-B plausibility boxes that used to live in
|
|
16
|
+
* `resolver/plausibility.ts`'s `COUNTRY_BBOX`. An absent row fails open (never trips the guard),
|
|
17
|
+
* exactly like an absent key in the constant.
|
|
18
|
+
*
|
|
19
|
+
* Emission happens at build time (`mailwoman/gazetteer-pipeline/coverage-manifest.ts` owns the
|
|
20
|
+
* measured record and calls {@link writeGazetteerCoverageManifest} before the DB is sealed — never
|
|
21
|
+
* patch a shipped DB, rebuild). The read happens at open time ({@link WOFCandidateTableLookup}
|
|
22
|
+
* calls {@link readGazetteerCoverageManifest} in its constructor); an artifact that predates the
|
|
23
|
+
* manifest returns `undefined` and every consumer falls back to the code constants byte-identically.
|
|
24
|
+
*/
|
|
25
|
+
import type { DatabaseSync } from "node:sqlite";
|
|
26
|
+
import { type CountryBBoxFact, type CountryCoverageFact, type GazetteerArtifactCoverage } from "@mailwoman/core/resolver";
|
|
27
|
+
import { type Kysely } from "kysely";
|
|
28
|
+
/** One country's hard-filter coverage measurement — the storage form of {@link CountryCoverageFact}. */
|
|
29
|
+
export interface CountryCoverageTable {
|
|
30
|
+
/** ISO 3166-1 alpha-2, uppercase (PK). */
|
|
31
|
+
country: string;
|
|
32
|
+
/** 0/1 — the promote-gate verdict (a verdict column, NOT re-derived from the rate; see the fact type's docstring). */
|
|
33
|
+
hard_filter_safe: number;
|
|
34
|
+
/** Measured hard-resolve rate 0..1 on the panel named in `source`; NULL when the receipt recorded none. */
|
|
35
|
+
hard_resolve_rate: number | null;
|
|
36
|
+
/** Panel size behind `hard_resolve_rate`; NULL when unrecorded. */
|
|
37
|
+
sample_size: number | null;
|
|
38
|
+
/** ISO-8601 date of the measurement / promote gate. */
|
|
39
|
+
measured_at: string;
|
|
40
|
+
/** The receipt: which panel/gate produced this row. */
|
|
41
|
+
source: string;
|
|
42
|
+
}
|
|
43
|
+
/** One country's coarse guard-B bounding box — the storage form of {@link CountryBBoxFact}. */
|
|
44
|
+
export interface CountryBBoxTable {
|
|
45
|
+
/** ISO 3166-1 alpha-2, uppercase (PK). */
|
|
46
|
+
country: string;
|
|
47
|
+
lat_min: number;
|
|
48
|
+
lat_max: number;
|
|
49
|
+
lon_min: number;
|
|
50
|
+
lon_max: number;
|
|
51
|
+
/** Provenance of the box (harness + date). */
|
|
52
|
+
source: string;
|
|
53
|
+
}
|
|
54
|
+
/** The coverage-manifest schema for `new DatabaseClient<GazetteerCoverageDatabase>(...)`. */
|
|
55
|
+
export interface GazetteerCoverageDatabase {
|
|
56
|
+
country_coverage: CountryCoverageTable;
|
|
57
|
+
country_bbox: CountryBBoxTable;
|
|
58
|
+
}
|
|
59
|
+
/** Table names the lookup probes (existence-gated, so a candidate.db built before the manifest is byte-stable). */
|
|
60
|
+
export declare const COUNTRY_COVERAGE_TABLE = "country_coverage";
|
|
61
|
+
export declare const COUNTRY_BBOX_TABLE = "country_bbox";
|
|
62
|
+
/** Create `country_coverage` — a handful of small PK-probed rows, the WITHOUT ROWID sweet spot. */
|
|
63
|
+
export declare function createCountryCoverageTable(db: Kysely<GazetteerCoverageDatabase>): Promise<void>;
|
|
64
|
+
/** Create `country_bbox` — same shape discipline as {@link createCountryCoverageTable}. */
|
|
65
|
+
export declare function createCountryBBoxTable(db: Kysely<GazetteerCoverageDatabase>): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Write the coverage manifest into a candidate DB UNDER CONSTRUCTION (pre-seal — a shipped DB is never patched, rebuild
|
|
68
|
+
* instead). Creates both tables and inserts the facts; call exactly once, from the gazetteer build.
|
|
69
|
+
*/
|
|
70
|
+
export declare function writeGazetteerCoverageManifest(db: Kysely<GazetteerCoverageDatabase>, facts: {
|
|
71
|
+
coverage: readonly CountryCoverageFact[];
|
|
72
|
+
bboxes: readonly CountryBBoxFact[];
|
|
73
|
+
}): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Read the coverage manifest from an OPEN candidate DB, or `undefined` when the artifact predates it (neither table
|
|
76
|
+
* present) — the signal for consumers to fall back to the code constants byte-identically. Synchronous raw reads on
|
|
77
|
+
* purpose: this runs inside {@link WOFCandidateTableLookup}'s synchronous constructor (the sync-reader carve-out in
|
|
78
|
+
* `AGENTS.md`), and the tables are a few dozen rows read once per open.
|
|
79
|
+
*/
|
|
80
|
+
export declare function readGazetteerCoverageManifest(db: DatabaseSync): GazetteerArtifactCoverage | undefined;
|
|
81
|
+
//# sourceMappingURL=coverage-manifest-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-manifest-schema.d.ts","sourceRoot":"","sources":["../coverage-manifest-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,EAEN,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,EAC9B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAIzC,wGAAwG;AACxG,MAAM,WAAW,oBAAoB;IACpC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,sHAAsH;IACtH,gBAAgB,EAAE,MAAM,CAAA;IACxB,2GAA2G;IAC3G,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,mEAAmE;IACnE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAA;CACd;AAED,+FAA+F;AAC/F,MAAM,WAAW,gBAAgB;IAChC,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAA;CACd;AAED,6FAA6F;AAC7F,MAAM,WAAW,yBAAyB;IACzC,gBAAgB,EAAE,oBAAoB,CAAA;IACtC,YAAY,EAAE,gBAAgB,CAAA;CAC9B;AAED,mHAAmH;AACnH,eAAO,MAAM,sBAAsB,qBAAqB,CAAA;AACxD,eAAO,MAAM,kBAAkB,iBAAiB,CAAA;AAEhD,mGAAmG;AACnG,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,MAAM,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAarG;AAED,2FAA2F;AAC3F,wBAAsB,sBAAsB,CAAC,EAAE,EAAE,MAAM,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAYjG;AAED;;;GAGG;AACH,wBAAsB,8BAA8B,CACnD,EAAE,EAAE,MAAM,CAAC,yBAAyB,CAAC,EACrC,KAAK,EAAE;IAAE,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;CAAE,GACrF,OAAO,CAAC,IAAI,CAAC,CAmCf;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,EAAE,EAAE,YAAY,GAAG,yBAAyB,GAAG,SAAS,CAqDrG"}
|