@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.
- package/out/sdk/fetch.d.ts +72 -0
- package/out/sdk/fetch.d.ts.map +1 -1
- package/out/sdk/fetch.js +267 -0
- package/out/sdk/fetch.js.map +1 -1
- package/out/sdk/index.d.ts +3 -0
- package/out/sdk/index.d.ts.map +1 -1
- package/out/sdk/index.js +3 -0
- package/out/sdk/index.js.map +1 -1
- package/out/sdk/redistricting.d.ts +57 -0
- package/out/sdk/redistricting.d.ts.map +1 -1
- package/out/sdk/redistricting.js +184 -0
- package/out/sdk/redistricting.js.map +1 -1
- package/out/sdk/schema.d.ts +88 -0
- package/out/sdk/schema.d.ts.map +1 -1
- package/out/sdk/schema.js +130 -0
- package/out/sdk/schema.js.map +1 -1
- package/out/sdk/state/TIGERTabulatedBlockEntity.d.ts +1 -1
- package/out/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -3
- package/sdk/fetch.ts +323 -0
- package/sdk/index.ts +3 -0
- package/sdk/redistricting.ts +223 -0
- package/sdk/schema.ts +203 -0
- package/sdk/initialize.sql +0 -161
|
@@ -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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,6BAA6B,EAAE,SAAS,EAAwB,MAAM,aAAa,CAAA;AAC5F,OAAO,EAAE,
|
|
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
|
package/out/sdk/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../sdk/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,
|
|
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
|
package/out/sdk/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../sdk/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
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: (
|
|
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
|