@mailwoman/tiger 1.0.0 → 4.13.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.
@@ -0,0 +1,184 @@
1
+ /**
2
+ * @copyright Sister Software.
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * Pull a state's Census 2020 P.L. 94-171 redistricting counts (table P2 — Hispanic-or-Latino by
7
+ * race, per block) into the `pl_block` table of a TIGER {@link DatabaseClient} DB, keyed on the
8
+ * same 15-char block `GEOID` as {@link fetchTIGER}'s `tabblock20`. Join the two for block-level
9
+ * race + geometry (e.g. a dot-density map).
10
+ *
11
+ * Keyless public data. The per-state ZIP holds a pipe-delimited geographic header
12
+ * (`<st>geo<yr>.pl`) and three data segments; segment 1 (`<st>00001<yr>.pl`) carries P1 + P2. We
13
+ * join the header (filtered to SUMLEV 750 = block) to segment 1 by LOGRECNO. Field offsets are
14
+ * fixed by the 2020 P.L. layout (verified against the real files).
15
+ *
16
+ * https://www2.census.gov/programs-surveys/decennial/2020/data/01-Redistricting_File--PL_94-171/
17
+ */
18
+ import { DatabaseClient } from "@mailwoman/core/kysley/client";
19
+ import { spawn } from "node:child_process";
20
+ import { createReadStream, createWriteStream, existsSync } from "node:fs";
21
+ import { mkdir, rename } from "node:fs/promises";
22
+ import { dirname, join } from "node:path";
23
+ import { createInterface } from "node:readline";
24
+ import { DatabaseSync } from "node:sqlite";
25
+ import { Readable } from "node:stream";
26
+ import { pipeline } from "node:stream/promises";
27
+ import { AdminLevel1CodeToAbbreviation, StateName } from "../state.js";
28
+ import { initializeTIGERSchema, TIGER_PRAGMAS } from "./schema.js";
29
+ const REDISTRICTING_BASE = "https://www2.census.gov/programs-surveys/decennial/2020/data/01-Redistricting_File--PL_94-171";
30
+ const DEFAULT_DATA_ROOT = process.env.MAILWOMAN_DATA_ROOT ?? "/mnt/playpen/mailwoman-data";
31
+ // P.L. 94-171 (2020) pipe-delimited field offsets (0-based).
32
+ // Geographic header: …|SUMLEV(2)|…|LOGRECNO(7)|GEOID(8)|GEOCODE(9)|… — GEOCODE is the bare 15-char
33
+ // block FIPS (matches TIGER GEOID20); SUMLEV 750 = tabulation block.
34
+ const GEO_SUMLEV = 2;
35
+ const GEO_LOGRECNO = 7;
36
+ const GEO_GEOCODE = 9;
37
+ // Segment 1: FILEID|STUSAB|CHARITER|CIFSN|LOGRECNO(4)| P1×71 | P2×73. P0020001 is at index 76.
38
+ const SEG_LOGRECNO = 4;
39
+ const P2 = (fieldNo) => 76 + (fieldNo - 1);
40
+ // The eight P2 categories that partition the total (P0020001), in `pl_block` column order.
41
+ const CATEGORY_INDEX = {
42
+ pop_total: P2(1),
43
+ hispanic: P2(2), // Hispanic or Latino (any race)
44
+ white: P2(5), // Not Hispanic: White alone
45
+ black: P2(6),
46
+ aian: P2(7),
47
+ asian: P2(8),
48
+ nhpi: P2(9),
49
+ other: P2(10),
50
+ multi: P2(11), // Two or more races
51
+ };
52
+ function runCapture(cmd, args) {
53
+ return new Promise((resolve, reject) => {
54
+ const child = spawn(cmd, args);
55
+ let out = "";
56
+ let err = "";
57
+ child.stdout.on("data", (d) => (out += d));
58
+ child.stderr.on("data", (d) => (err += d));
59
+ child.on("error", reject);
60
+ child.on("close", (code) => code === 0 ? resolve(out) : reject(new Error(`${cmd} exited ${code}: ${err.slice(0, 500)}`)));
61
+ });
62
+ }
63
+ async function downloadIfNeeded(url, dest) {
64
+ if (existsSync(dest)) {
65
+ try {
66
+ await runCapture("unzip", ["-tq", dest]);
67
+ return true;
68
+ }
69
+ catch {
70
+ // corrupt cache — re-download
71
+ }
72
+ }
73
+ const tmp = dest + ".tmp";
74
+ const res = await fetch(url, { redirect: "follow" });
75
+ if (!res.ok || !res.body)
76
+ throw new Error(`HTTP ${res.status} fetching ${url}`);
77
+ await pipeline(Readable.fromWeb(res.body), createWriteStream(tmp));
78
+ await rename(tmp, dest);
79
+ return false;
80
+ }
81
+ async function eachLine(path, fn) {
82
+ for await (const line of createInterface({ input: createReadStream(path), crlfDelay: Infinity })) {
83
+ if (line)
84
+ fn(line);
85
+ }
86
+ }
87
+ /**
88
+ * Fetch one state's P.L. 94-171 block race counts into `pl_block`. Yields progress; returns the
89
+ * tally.
90
+ */
91
+ export async function* fetchRedistricting(options) {
92
+ const vintage = options.vintage ?? 2020;
93
+ const dataRoot = options.dataRoot ?? DEFAULT_DATA_ROOT;
94
+ const batchSize = options.batchSize ?? 2000;
95
+ const state = options.stateFIPS;
96
+ const abbr = AdminLevel1CodeToAbbreviation[state];
97
+ if (!abbr)
98
+ throw new Error(`Unknown state FIPS "${state}"`);
99
+ const stateName = StateName[abbr];
100
+ const dirName = stateName.replace(/ /g, "_");
101
+ const fileAbbr = abbr.toLowerCase();
102
+ const cacheDir = join(dataRoot, "census", "redistricting", String(vintage), state);
103
+ // Same stable `tiger.db` default as fetchTIGER — pl_block lives alongside tabblock20 in one DB.
104
+ const outPath = options.outPath ?? join(dataRoot, "tiger", "tiger.db");
105
+ await mkdir(cacheDir, { recursive: true });
106
+ await mkdir(dirname(outPath), { recursive: true });
107
+ const zipName = `${fileAbbr}${vintage}.pl.zip`;
108
+ const zipPath = join(cacheDir, zipName);
109
+ const url = `${REDISTRICTING_BASE}/${dirName}/${zipName}`;
110
+ const cached = await downloadIfNeeded(url, zipPath);
111
+ yield { phase: "download", file: zipName, cached };
112
+ await runCapture("unzip", ["-o", "-q", zipPath, "-d", cacheDir]);
113
+ const geoPath = join(cacheDir, `${fileAbbr}geo${vintage}.pl`);
114
+ const seg1Path = join(cacheDir, `${fileAbbr}00001${vintage}.pl`);
115
+ yield { phase: "extract", file: `${fileAbbr}geo${vintage}.pl` };
116
+ // Pass 1: header → LOGRECNO → GEOID for the blocks we want.
117
+ const prefix = options.county ? state + options.county : state;
118
+ const logToGeoid = new Map();
119
+ await eachLine(geoPath, (line) => {
120
+ const f = line.split("|");
121
+ if (f[GEO_SUMLEV] !== "750")
122
+ return;
123
+ const geoid = f[GEO_GEOCODE] ?? "";
124
+ if (!geoid.startsWith(prefix))
125
+ return;
126
+ logToGeoid.set(f[GEO_LOGRECNO] ?? "", geoid);
127
+ });
128
+ const total = logToGeoid.size;
129
+ yield { phase: "header", blocks: total };
130
+ const db = new DatabaseSync(outPath);
131
+ db.exec(TIGER_PRAGMAS);
132
+ const kdb = new DatabaseClient({ database: db });
133
+ await initializeTIGERSchema(kdb);
134
+ try {
135
+ // Idempotent re-run: drop the rows we're about to (re)load.
136
+ await kdb
137
+ .deleteFrom("pl_block")
138
+ .where("GEOID", "like", prefix + "%")
139
+ .execute();
140
+ let inserted = 0;
141
+ let batch = [];
142
+ const flush = async () => {
143
+ if (!batch.length)
144
+ return;
145
+ const rows = batch;
146
+ batch = [];
147
+ await kdb.insertInto("pl_block").values(rows).execute();
148
+ inserted += rows.length;
149
+ };
150
+ // Pass 2: segment 1 → P2 counts for the mapped LOGRECNOs, flushing as we go.
151
+ for await (const line of createInterface({ input: createReadStream(seg1Path), crlfDelay: Infinity })) {
152
+ if (!line)
153
+ continue;
154
+ const f = line.split("|");
155
+ const geoid = logToGeoid.get(f[SEG_LOGRECNO] ?? "");
156
+ if (!geoid)
157
+ continue;
158
+ batch.push({
159
+ GEOID: geoid,
160
+ pop_total: Number(f[CATEGORY_INDEX.pop_total] ?? 0),
161
+ hispanic: Number(f[CATEGORY_INDEX.hispanic] ?? 0),
162
+ white: Number(f[CATEGORY_INDEX.white] ?? 0),
163
+ black: Number(f[CATEGORY_INDEX.black] ?? 0),
164
+ aian: Number(f[CATEGORY_INDEX.aian] ?? 0),
165
+ asian: Number(f[CATEGORY_INDEX.asian] ?? 0),
166
+ nhpi: Number(f[CATEGORY_INDEX.nhpi] ?? 0),
167
+ other: Number(f[CATEGORY_INDEX.other] ?? 0),
168
+ multi: Number(f[CATEGORY_INDEX.multi] ?? 0),
169
+ });
170
+ if (batch.length >= batchSize) {
171
+ await flush();
172
+ yield { phase: "load", inserted, total };
173
+ }
174
+ }
175
+ await flush();
176
+ yield { phase: "load", inserted, total };
177
+ db.exec("PRAGMA wal_checkpoint(TRUNCATE);");
178
+ return { outPath, table: "pl_block", inserted };
179
+ }
180
+ finally {
181
+ await kdb.destroy();
182
+ }
183
+ }
184
+ //# sourceMappingURL=redistricting.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"redistricting.js","sourceRoot":"","sources":["../../sdk/redistricting.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redistricting.js","sourceRoot":"","sources":["../../sdk/redistricting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * @copyright Sister Software.
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * TIGER SQLite schema, as a string so it loads in both `tsx` source mode and the compiled CLI
7
+ * (`tsc` doesn't copy `.sql` assets into `out/`). Geometry is GeoJSON text — NOT SpatiaLite. The
8
+ * prior SpatiaLite path (`load_extension` of a hardcoded macOS dylib + WKB `GEOM` columns) never
9
+ * loaded on Linux; plain text keeps the build dependency-free and `node:sqlite`-native (read it
10
+ * back with `JSON.parse`).
11
+ */
12
+ import { type Generated, type Kysely } from "kysely";
13
+ /** Kysely row type for `tabblock20`. Geometry is a GeoJSON string. */
14
+ export interface TIGERBlockTable {
15
+ GEOID: string;
16
+ state_code: string;
17
+ county_code: string;
18
+ tract_code: string;
19
+ block_group_code: string;
20
+ block_code: string;
21
+ urbanized_area_code: string | null;
22
+ urban_rural_code: string | null;
23
+ housing_unit_count: number;
24
+ land_area_sqm: number;
25
+ water_area_sqm: number;
26
+ population: number;
27
+ geometry: string;
28
+ }
29
+ /**
30
+ * Kysely row type for `pl_block` — Census 2020 P.L. 94-171 table P2 (Hispanic-or-Latino by race),
31
+ * one row per tabulation block, keyed on the same 15-char `GEOID` as {@link TIGERBlockTable}. The
32
+ * eight category columns partition `pop_total`.
33
+ */
34
+ export interface PLBlockTable {
35
+ GEOID: string;
36
+ pop_total: number;
37
+ hispanic: number;
38
+ white: number;
39
+ black: number;
40
+ aian: number;
41
+ asian: number;
42
+ nhpi: number;
43
+ other: number;
44
+ multi: number;
45
+ }
46
+ /** Kysely row type for `tiger_streets` (ADDRFEAT — named street segments + ZIPs, per county). */
47
+ export interface TIGERStreetTable {
48
+ linearid: string;
49
+ fullname: string;
50
+ zipl: string | null;
51
+ zipr: string | null;
52
+ statefp: string;
53
+ }
54
+ /** Kysely row type for `tiger_places` (PLACE — incorporated/census places, per state). */
55
+ export interface TIGERPlaceTable {
56
+ geoid: string;
57
+ name: string;
58
+ statefp: string;
59
+ lsad: string | null;
60
+ namelsad: string | null;
61
+ classfp: string | null;
62
+ }
63
+ /** The TIGER database schema, for `new DatabaseClient<TIGERDatabase>(...)`. */
64
+ export interface TIGERDatabase {
65
+ tabblock20: TIGERBlockTable;
66
+ pl_block: PLBlockTable;
67
+ tiger_streets: TIGERStreetTable;
68
+ tiger_places: TIGERPlaceTable;
69
+ }
70
+ /** Marker so callers can opt into `Generated` columns later without importing kysely here. */
71
+ export type { Generated };
72
+ /**
73
+ * Build-tuning PRAGMAs, run raw before any table is created (`page_size`/`auto_vacuum` only take
74
+ * effect on an empty DB, and PRAGMA has no Kysely builder). The consumer execs this, then calls
75
+ * {@link initializeTIGERSchema} for the tables + indexes.
76
+ */
77
+ export declare const TIGER_PRAGMAS = "\nPRAGMA auto_vacuum = INCREMENTAL;\nPRAGMA page_size = 4096;\nPRAGMA cache_size = 10000;\nPRAGMA journal_mode = WAL;\n";
78
+ /**
79
+ * Create the TIGER tables + indexes via the Kysely schema-builder (the house idiom). Idempotent
80
+ * (`IF NOT EXISTS`). Pass a {@link DatabaseClient} (or any `Kysely`) over the TIGER DB; run
81
+ * {@link TIGER_PRAGMAS} first. `us_state`/`tract` aren't in {@link TIGERDatabase} (created here but
82
+ * not queried via Kysely) — `createTable` takes any table name, so that's fine.
83
+ *
84
+ * The `text(N)` length hints in the prior raw DDL were documentary only (SQLite uses TEXT affinity
85
+ * regardless); the lengths live on the {@link TIGERBlockTable} interface instead.
86
+ */
87
+ export declare function initializeTIGERSchema(db: Kysely<TIGERDatabase>): Promise<void>;
88
+ //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../sdk/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAEvC,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,wBAAwB,EAAE,MAAM,CAAA;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACb;AAED,iGAAiG;AACjG,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CACf;AAED,0FAA0F;AAC1F,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC7B,UAAU,EAAE,eAAe,CAAA;IAC3B,QAAQ,EAAE,YAAY,CAAA;IACtB,aAAa,EAAE,gBAAgB,CAAA;IAC/B,YAAY,EAAE,eAAe,CAAA;CAC7B;AAED,8FAA8F;AAC9F,YAAY,EAAE,SAAS,EAAE,CAAA;AAEzB,eAAO,MAAM,oBAAoB,kyFA8EhC,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../sdk/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAO,KAAK,SAAS,EAAE,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEzD,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACb;AAED,iGAAiG;AACjG,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CACf;AAED,0FAA0F;AAC1F,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC7B,UAAU,EAAE,eAAe,CAAA;IAC3B,QAAQ,EAAE,YAAY,CAAA;IACtB,aAAa,EAAE,gBAAgB,CAAA;IAC/B,YAAY,EAAE,eAAe,CAAA;CAC7B;AAED,8FAA8F;AAC9F,YAAY,EAAE,SAAS,EAAE,CAAA;AAEzB;;;;GAIG;AACH,eAAO,MAAM,aAAa,4HAKzB,CAAA;AAED;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGpF"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @copyright Sister Software.
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ *
6
+ * TIGER SQLite schema, as a string so it loads in both `tsx` source mode and the compiled CLI
7
+ * (`tsc` doesn't copy `.sql` assets into `out/`). Geometry is GeoJSON text — NOT SpatiaLite. The
8
+ * prior SpatiaLite path (`load_extension` of a hardcoded macOS dylib + WKB `GEOM` columns) never
9
+ * loaded on Linux; plain text keeps the build dependency-free and `node:sqlite`-native (read it
10
+ * back with `JSON.parse`).
11
+ */
12
+ import { sql } from "kysely";
13
+ /**
14
+ * Build-tuning PRAGMAs, run raw before any table is created (`page_size`/`auto_vacuum` only take
15
+ * effect on an empty DB, and PRAGMA has no Kysely builder). The consumer execs this, then calls
16
+ * {@link initializeTIGERSchema} for the tables + indexes.
17
+ */
18
+ export const TIGER_PRAGMAS = /* sql */ `
19
+ PRAGMA auto_vacuum = INCREMENTAL;
20
+ PRAGMA page_size = 4096;
21
+ PRAGMA cache_size = 10000;
22
+ PRAGMA journal_mode = WAL;
23
+ `;
24
+ /**
25
+ * Create the TIGER tables + indexes via the Kysely schema-builder (the house idiom). Idempotent
26
+ * (`IF NOT EXISTS`). Pass a {@link DatabaseClient} (or any `Kysely`) over the TIGER DB; run
27
+ * {@link TIGER_PRAGMAS} first. `us_state`/`tract` aren't in {@link TIGERDatabase} (created here but
28
+ * not queried via Kysely) — `createTable` takes any table name, so that's fine.
29
+ *
30
+ * The `text(N)` length hints in the prior raw DDL were documentary only (SQLite uses TEXT affinity
31
+ * regardless); the lengths live on the {@link TIGERBlockTable} interface instead.
32
+ */
33
+ export async function initializeTIGERSchema(db) {
34
+ await db.schema
35
+ .createTable("us_state")
36
+ .ifNotExists()
37
+ .addColumn("state_code", "text", (c) => c.primaryKey().notNull())
38
+ .addColumn("abbreviation", "text", (c) => c.notNull())
39
+ .addColumn("display_name", "text", (c) => c.notNull())
40
+ .addColumn("geometry", "text", (c) => c.notNull())
41
+ .execute();
42
+ await db.schema
43
+ .createTable("tract")
44
+ .ifNotExists()
45
+ .addColumn("GEOID", "text", (c) => c.primaryKey().notNull())
46
+ .addColumn("state_code", "text", (c) => c.notNull())
47
+ .addColumn("county_code", "text", (c) => c.notNull())
48
+ .addColumn("tract_code", "text", (c) => c.notNull())
49
+ .addColumn("geometry", "text", (c) => c.notNull())
50
+ .execute();
51
+ await db.schema
52
+ .createTable("tabblock20")
53
+ .ifNotExists()
54
+ .addColumn("GEOID", "text", (c) => c.primaryKey().notNull())
55
+ .addColumn("state_code", "text", (c) => c.notNull())
56
+ .addColumn("county_code", "text", (c) => c.notNull())
57
+ .addColumn("tract_code", "text", (c) => c.notNull())
58
+ .addColumn("block_group_code", "text", (c) => c.notNull())
59
+ .addColumn("block_code", "text", (c) => c.notNull())
60
+ .addColumn("urbanized_area_code", "text")
61
+ .addColumn("urban_rural_code", "text")
62
+ .addColumn("housing_unit_count", "integer", (c) => c.notNull())
63
+ .addColumn("land_area_sqm", "integer", (c) => c.notNull())
64
+ .addColumn("water_area_sqm", "integer", (c) => c.notNull())
65
+ .addColumn("population", "integer", (c) => c.notNull())
66
+ .addColumn("geometry", "text", (c) => c.notNull())
67
+ .execute();
68
+ // No index on GEOID alone — it's the PRIMARY KEY, which already carries a unique index. The prior
69
+ // schema's idx_tabblock20_geoid duplicated that for nothing (double insert cost, double footprint).
70
+ await db.schema.createIndex("idx_tabblock20_state_code").ifNotExists().on("tabblock20").column("state_code").execute();
71
+ await db.schema
72
+ .createIndex("idx_tabblock20_state_county")
73
+ .ifNotExists()
74
+ .on("tabblock20")
75
+ .columns(["state_code", "county_code"])
76
+ .execute();
77
+ await db.schema
78
+ .createIndex("idx_tabblock20_state_county_tract")
79
+ .ifNotExists()
80
+ .on("tabblock20")
81
+ .columns(["state_code", "county_code", "tract_code"])
82
+ .execute();
83
+ await db.schema.createIndex("idx_tabblock20_population").ifNotExists().on("tabblock20").column("population").execute();
84
+ await db.schema
85
+ .createTable("pl_block")
86
+ .ifNotExists()
87
+ .addColumn("GEOID", "text", (c) => c.primaryKey().notNull())
88
+ .addColumn("pop_total", "integer", (c) => c.notNull())
89
+ .addColumn("hispanic", "integer", (c) => c.notNull())
90
+ .addColumn("white", "integer", (c) => c.notNull())
91
+ .addColumn("black", "integer", (c) => c.notNull())
92
+ .addColumn("aian", "integer", (c) => c.notNull())
93
+ .addColumn("asian", "integer", (c) => c.notNull())
94
+ .addColumn("nhpi", "integer", (c) => c.notNull())
95
+ .addColumn("other", "integer", (c) => c.notNull())
96
+ .addColumn("multi", "integer", (c) => c.notNull())
97
+ // pl_block is small (no geometry) and always probed by its GEOID PK (1:1 join to tabblock20), so
98
+ // cluster it WITHOUT ROWID — one B-tree probe per join, no separate rowid + PK-index pair.
99
+ .modifyEnd(sql `without rowid`)
100
+ .execute();
101
+ await db.schema
102
+ .createTable("tiger_streets")
103
+ .ifNotExists()
104
+ .addColumn("linearid", "text", (c) => c.notNull())
105
+ .addColumn("fullname", "text", (c) => c.notNull())
106
+ .addColumn("zipl", "text")
107
+ .addColumn("zipr", "text")
108
+ .addColumn("statefp", "text", (c) => c.notNull())
109
+ .execute();
110
+ await db.schema.createIndex("idx_tiger_streets_statefp").ifNotExists().on("tiger_streets").column("statefp").execute();
111
+ await db.schema
112
+ .createIndex("idx_tiger_streets_linearid")
113
+ .ifNotExists()
114
+ .on("tiger_streets")
115
+ .column("linearid")
116
+ .execute();
117
+ await db.schema
118
+ .createTable("tiger_places")
119
+ .ifNotExists()
120
+ .addColumn("geoid", "text", (c) => c.notNull())
121
+ .addColumn("name", "text", (c) => c.notNull())
122
+ .addColumn("statefp", "text", (c) => c.notNull())
123
+ .addColumn("lsad", "text")
124
+ .addColumn("namelsad", "text")
125
+ .addColumn("classfp", "text")
126
+ .execute();
127
+ await db.schema.createIndex("idx_tiger_places_statefp").ifNotExists().on("tiger_places").column("statefp").execute();
128
+ await db.schema.createIndex("idx_tiger_places_geoid").ifNotExists().on("tiger_places").column("geoid").execute();
129
+ }
130
+ //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../sdk/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAsEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8E7C,CAAA"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../sdk/schema.ts"],"names":[],"mappings":"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"}
@@ -9,5 +9,5 @@ import { TIGERProperty } from "@mailwoman/tiger";
9
9
  *
10
10
  * @internal
11
11
  */
12
- export declare const TIGERTabulatedBlockEntitySelections: (TIGERProperty.GeoID | "urban_rural_code" | "urbanized_area_code" | "land_area_sqm" | "water_area_sqm" | "housing_unit_count" | "population")[];
12
+ export declare const TIGERTabulatedBlockEntitySelections: ("urban_rural_code" | "urbanized_area_code" | "land_area_sqm" | "water_area_sqm" | "housing_unit_count" | "population" | TIGERProperty.GeoID)[];
13
13
  //# sourceMappingURL=TIGERTabulatedBlockEntity.d.ts.map