@mailwoman/tiger 9.1.0 → 9.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{block-group.ts → lib/block-group.ts} +4 -4
- package/{class-code.ts → lib/class-code.ts} +1 -1
- package/{constants.ts → lib/constants.ts} +5 -5
- package/{county-subdivision.ts → lib/county-subdivision.ts} +4 -4
- package/{county.ts → lib/county.ts} +4 -4
- package/{files.ts → lib/files.ts} +1 -1
- package/{geoid.ts → lib/geoid.ts} +3 -4
- package/lib/index.ts +18 -0
- package/{sdk → lib/sdk}/download.ts +6 -30
- package/{sdk → lib/sdk}/fetch.ts +38 -59
- package/lib/sdk/index.ts +10 -0
- package/{sdk → lib/sdk}/redistricting.ts +91 -20
- package/{sdk → lib/sdk}/schema.ts +36 -0
- package/{sdk → lib/sdk}/state/TIGERTabulatedBlockEntity.ts +2 -1
- package/{sdk → lib/sdk}/state/TIGERTractEntity.ts +1 -1
- package/{sdk → lib/sdk}/state/block-operations.ts +3 -2
- package/lib/sdk/state/index.ts +9 -0
- package/{state.ts → lib/state.ts} +2 -2
- package/{tabulation-block.ts → lib/tabulation-block.ts} +2 -2
- package/lib/tools/index.ts +11 -0
- package/{tools → lib/tools}/race-dots-map.ts +5 -4
- package/{tools → lib/tools}/race-dots.ts +8 -9
- package/{tools → lib/tools}/serve-range.ts +20 -12
- package/{tract.ts → lib/tract.ts} +2 -2
- package/out/block-group.d.ts +4 -4
- package/out/block-group.d.ts.map +1 -1
- package/out/block-group.js.map +1 -1
- package/out/class-code.d.ts +1 -1
- package/out/class-code.d.ts.map +1 -1
- package/out/class-code.js +1 -1
- package/out/class-code.js.map +1 -1
- package/out/constants.d.ts +5 -5
- package/out/constants.d.ts.map +1 -1
- package/out/constants.js.map +1 -1
- package/out/county-subdivision.d.ts +4 -4
- package/out/county-subdivision.d.ts.map +1 -1
- package/out/county-subdivision.js.map +1 -1
- package/out/county.d.ts +4 -4
- package/out/county.d.ts.map +1 -1
- package/out/county.js.map +1 -1
- package/out/files.d.ts +1 -1
- package/out/files.d.ts.map +1 -1
- package/out/files.js.map +1 -1
- package/out/functional-status.d.ts.map +1 -1
- package/out/functional-status.js.map +1 -1
- package/out/geoid.d.ts +1 -2
- package/out/geoid.d.ts.map +1 -1
- package/out/geoid.js.map +1 -1
- package/out/index.d.ts +12 -12
- package/out/index.d.ts.map +1 -1
- package/out/index.js +12 -12
- package/out/index.js.map +1 -1
- package/out/legal-statistical-area.d.ts.map +1 -1
- package/out/legal-statistical-area.js.map +1 -1
- package/out/sdk/download.d.ts +0 -7
- package/out/sdk/download.d.ts.map +1 -1
- package/out/sdk/download.js +6 -25
- package/out/sdk/download.js.map +1 -1
- package/out/sdk/fetch.d.ts.map +1 -1
- package/out/sdk/fetch.js +25 -41
- package/out/sdk/fetch.js.map +1 -1
- package/out/sdk/index.d.ts +4 -4
- package/out/sdk/index.d.ts.map +1 -1
- package/out/sdk/index.js +4 -4
- package/out/sdk/index.js.map +1 -1
- package/out/sdk/redistricting.d.ts +29 -0
- package/out/sdk/redistricting.d.ts.map +1 -1
- package/out/sdk/redistricting.js +71 -19
- package/out/sdk/redistricting.js.map +1 -1
- package/out/sdk/schema.d.ts +12 -9
- package/out/sdk/schema.d.ts.map +1 -1
- package/out/sdk/schema.js +19 -0
- package/out/sdk/schema.js.map +1 -1
- package/out/sdk/state/TIGERTabulatedBlockEntity.d.ts.map +1 -1
- package/out/sdk/state/TIGERTabulatedBlockEntity.js +1 -1
- package/out/sdk/state/TIGERTabulatedBlockEntity.js.map +1 -1
- package/out/sdk/state/TIGERTractEntity.d.ts +1 -1
- package/out/sdk/state/TIGERTractEntity.d.ts.map +1 -1
- package/out/sdk/state/TIGERTractEntity.js.map +1 -1
- package/out/sdk/state/block-operations.d.ts +1 -1
- package/out/sdk/state/block-operations.d.ts.map +1 -1
- package/out/sdk/state/block-operations.js +1 -1
- package/out/sdk/state/block-operations.js.map +1 -1
- package/out/sdk/state/index.d.ts +3 -3
- package/out/sdk/state/index.d.ts.map +1 -1
- package/out/sdk/state/index.js +3 -3
- package/out/sdk/state/index.js.map +1 -1
- package/out/state.d.ts +2 -2
- package/out/state.d.ts.map +1 -1
- package/out/state.js.map +1 -1
- package/out/tabulation-block.d.ts +2 -2
- package/out/tabulation-block.d.ts.map +1 -1
- package/out/tabulation-block.js.map +1 -1
- package/out/tools/index.d.ts +4 -8
- package/out/tools/index.d.ts.map +1 -1
- package/out/tools/index.js +4 -8
- package/out/tools/index.js.map +1 -1
- package/out/tools/race-dots-map.d.ts.map +1 -1
- package/out/tools/race-dots-map.js +5 -4
- package/out/tools/race-dots-map.js.map +1 -1
- package/out/tools/race-dots.d.ts.map +1 -1
- package/out/tools/race-dots.js +7 -8
- package/out/tools/race-dots.js.map +1 -1
- package/out/tools/serve-range.d.ts +2 -3
- package/out/tools/serve-range.d.ts.map +1 -1
- package/out/tools/serve-range.js +17 -10
- package/out/tools/serve-range.js.map +1 -1
- package/out/tract.d.ts +2 -2
- package/out/tract.d.ts.map +1 -1
- package/out/tract.js.map +1 -1
- package/out/tsconfig.test.tsbuildinfo +1 -0
- package/package.json +53 -10
- package/index.ts +0 -18
- package/out/tsconfig.tsbuildinfo +0 -1
- package/sdk/index.ts +0 -10
- package/sdk/state/index.ts +0 -9
- package/tools/index.ts +0 -15
- /package/{functional-status.ts → lib/functional-status.ts} +0 -0
- /package/{legal-statistical-area.ts → lib/legal-statistical-area.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legal-statistical-area.js","sourceRoot":"","sources":["../legal-statistical-area.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"legal-statistical-area.js","sourceRoot":"","sources":["../lib/legal-statistical-area.ts"],"names":[],"mappings":"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"}
|
package/out/sdk/download.d.ts
CHANGED
|
@@ -13,13 +13,6 @@
|
|
|
13
13
|
* non-stream response type in memory. The primitive that fits a body this large is the one that
|
|
14
14
|
* never holds it: a web stream piped to a write stream.
|
|
15
15
|
*/
|
|
16
|
-
/**
|
|
17
|
-
* Run a command and resolve its stdout, rejecting with the captured stderr on a non-zero exit.
|
|
18
|
-
*
|
|
19
|
-
* Used for the `unzip -tq` integrity probe below — a shelled-out check rather than a library one because the archives
|
|
20
|
-
* are large and `unzip -t` streams them without materializing the contents.
|
|
21
|
-
*/
|
|
22
|
-
export declare function runCapture(cmd: string, args: string[]): Promise<string>;
|
|
23
16
|
/**
|
|
24
17
|
* Download `url` to `dest` unless a VALID copy is already there. Returns `true` when the cache was reused, `false` when
|
|
25
18
|
* a download happened.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../sdk/download.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../lib/sdk/download.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBlF"}
|
package/out/sdk/download.js
CHANGED
|
@@ -13,29 +13,10 @@
|
|
|
13
13
|
* non-stream response type in memory. The primitive that fits a body this large is the one that
|
|
14
14
|
* never holds it: a web stream piped to a write stream.
|
|
15
15
|
*/
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import { Readable } from "node:stream";
|
|
20
|
-
import { pipeline } from "node:stream/promises";
|
|
16
|
+
import { pathExists } from "@mailwoman/core/fs/readers";
|
|
17
|
+
import { openWriteStream, pipeline, Readable } from "@mailwoman/core/fs/streams";
|
|
18
|
+
import { movePath } from "@mailwoman/core/fs/writers";
|
|
21
19
|
import { verifyZipIntegrity } from "@mailwoman/core/fs/zip";
|
|
22
|
-
/**
|
|
23
|
-
* Run a command and resolve its stdout, rejecting with the captured stderr on a non-zero exit.
|
|
24
|
-
*
|
|
25
|
-
* Used for the `unzip -tq` integrity probe below — a shelled-out check rather than a library one because the archives
|
|
26
|
-
* are large and `unzip -t` streams them without materializing the contents.
|
|
27
|
-
*/
|
|
28
|
-
export function runCapture(cmd, args) {
|
|
29
|
-
return new Promise((resolve, reject) => {
|
|
30
|
-
const child = spawn(cmd, args);
|
|
31
|
-
let out = "";
|
|
32
|
-
let err = "";
|
|
33
|
-
child.stdout.on("data", (d) => (out += d));
|
|
34
|
-
child.stderr.on("data", (d) => (err += d));
|
|
35
|
-
child.on("error", reject);
|
|
36
|
-
child.on("close", (code) => code === 0 ? resolve(out) : reject(new Error(`${cmd} exited ${code}: ${err.slice(0, 500)}`)));
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
20
|
/**
|
|
40
21
|
* Download `url` to `dest` unless a VALID copy is already there. Returns `true` when the cache was reused, `false` when
|
|
41
22
|
* a download happened.
|
|
@@ -45,7 +26,7 @@ export function runCapture(cmd, args) {
|
|
|
45
26
|
* renames, so `dest` is never a partial archive.
|
|
46
27
|
*/
|
|
47
28
|
export async function downloadIfNeeded(url, dest) {
|
|
48
|
-
if (
|
|
29
|
+
if (await pathExists(dest)) {
|
|
49
30
|
try {
|
|
50
31
|
await verifyZipIntegrity(dest);
|
|
51
32
|
return true;
|
|
@@ -58,8 +39,8 @@ export async function downloadIfNeeded(url, dest) {
|
|
|
58
39
|
const res = await fetch(url, { redirect: "follow" });
|
|
59
40
|
if (!res.ok || !res.body)
|
|
60
41
|
throw new Error(`HTTP ${res.status} fetching ${url}`);
|
|
61
|
-
await pipeline(Readable.fromWeb(res.body),
|
|
62
|
-
await
|
|
42
|
+
await pipeline(Readable.fromWeb(res.body), openWriteStream(tmp));
|
|
43
|
+
await movePath(tmp, dest);
|
|
63
44
|
return false;
|
|
64
45
|
}
|
|
65
46
|
//# sourceMappingURL=download.js.map
|
package/out/sdk/download.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../sdk/download.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../lib/sdk/download.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAE3D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,IAAY;IAC/D,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACJ,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAA;YAE9B,OAAO,IAAI,CAAA;QACZ,CAAC;QAAC,MAAM,CAAC;YACR,8BAA8B;QAC/B,CAAC;IACF,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,MAAM,CAAA;IACzB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;IAEpD,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC,CAAA;IAC/E,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAA8C,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1G,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAEzB,OAAO,KAAK,CAAA;AACb,CAAC"}
|
package/out/sdk/fetch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../sdk/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../lib/sdk/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAiBH;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,OAAO,GAAG,UAAU,CAAA;AAcjE,MAAM,WAAW,iBAAiB;IACjC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,eAAe,GACxB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CAChB;AAyFD;;GAEG;AACH,wBAAuB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAAC,eAAe,EAAE,gBAAgB,CAAC,CA2H/G"}
|
package/out/sdk/fetch.js
CHANGED
|
@@ -23,20 +23,15 @@
|
|
|
23
23
|
* GeoJSONSeq` (mapping shapefile columns to the schema, WGS84 for geometry levels) → batched
|
|
24
24
|
* inserts. Re-running a state replaces its rows.
|
|
25
25
|
*/
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import { dirname, join } from "node:path";
|
|
30
|
-
import { DatabaseSync } from "node:sqlite";
|
|
31
|
-
import { Readable } from "node:stream";
|
|
32
|
-
import { pipeline } from "node:stream/promises";
|
|
26
|
+
import { APIClient, pluckResponseData } from "@mailwoman/core/api";
|
|
27
|
+
import { mailwomanDataRoot } from "@mailwoman/core/data-root";
|
|
28
|
+
import { makeDirectories } from "@mailwoman/core/fs/writers";
|
|
33
29
|
import { extractZipEntries } from "@mailwoman/core/fs/zip";
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import { initializeTIGERSchema, TIGER_PRAGMAS } from "./schema.js";
|
|
30
|
+
import { ogr2ogrGeoJSONSeq } from "@mailwoman/spatial/tools/ogr-stream";
|
|
31
|
+
import { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
32
|
+
import { dirname, join } from "path-ts";
|
|
33
|
+
import { downloadIfNeeded } from "#sdk/download";
|
|
34
|
+
import { initializeTIGERSchema, TIGER_PRAGMAS } from "#sdk/schema";
|
|
40
35
|
const CENSUS_HOST = "https://www2.census.gov";
|
|
41
36
|
const DEFAULT_DATA_ROOT = mailwomanDataRoot();
|
|
42
37
|
const LEVEL_DIR = {
|
|
@@ -113,10 +108,10 @@ function buildRow(level, p, geometry, state) {
|
|
|
113
108
|
* Scrape the ADDRFEAT directory listing for a state's county FIPS codes.
|
|
114
109
|
*/
|
|
115
110
|
async function discoverCounties(state, vintage) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
111
|
+
// The LISTING only — a small HTML index. The per-county archives below stay on raw `fetch`, streaming to disk.
|
|
112
|
+
const html = await new APIClient({ displayName: "tiger-listing", retry: true })
|
|
113
|
+
.fetch({ url: `${CENSUS_HOST}/geo/tiger/TIGER${vintage}/ADDRFEAT/`, responseType: "text" })
|
|
114
|
+
.then(pluckResponseData);
|
|
120
115
|
const re = new RegExp(`tl_${vintage}_${state}(\\d{3})_addrfeat\\.zip`, "g");
|
|
121
116
|
const counties = new Set();
|
|
122
117
|
for (let m = re.exec(html); m; m = re.exec(html)) {
|
|
@@ -140,17 +135,21 @@ export async function* fetchTIGER(options) {
|
|
|
140
135
|
// the per-table idempotent delete keeps a re-fetch (newer vintage) clean. The download CACHE stays
|
|
141
136
|
// vintage-partitioned below so zips don't collide across vintages.
|
|
142
137
|
const outPath = options.outPath ?? join(dataRoot, "tiger", "tiger.db");
|
|
143
|
-
await
|
|
144
|
-
await
|
|
138
|
+
await makeDirectories(cacheDir);
|
|
139
|
+
await makeDirectories(dirname(outPath));
|
|
145
140
|
// Source units: one (per-state) for block/place; one per county for addrfeat.
|
|
146
141
|
const geoCodes = level === "addrfeat" ? await discoverCounties(state, vintage) : [""];
|
|
147
142
|
if (level === "addrfeat" && !geoCodes.length) {
|
|
148
143
|
throw new Error(`No ADDRFEAT counties found for state ${state} vintage ${vintage}`);
|
|
149
144
|
}
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
const kdb = new DatabaseClient({ database: db });
|
|
145
|
+
const kdb = new DatabaseClient(outPath);
|
|
146
|
+
kdb.exec(TIGER_PRAGMAS);
|
|
153
147
|
await initializeTIGERSchema(kdb);
|
|
148
|
+
/**
|
|
149
|
+
* `level` picks the table AND the row shape, but nothing ties them at the type level: {@link buildRow} returns the
|
|
150
|
+
* union and Kysely needs the arm's concrete row. The narrowings below are sound only because `buildRow` switches on
|
|
151
|
+
* the SAME `level` — keep the two switches in step, or a row shape reaches the wrong table.
|
|
152
|
+
*/
|
|
154
153
|
const insertBatch = async (rows) => {
|
|
155
154
|
if (level === "tabblock20") {
|
|
156
155
|
await kdb
|
|
@@ -203,7 +202,7 @@ export async function* fetchTIGER(options) {
|
|
|
203
202
|
const layer = `tl_${vintage}_${unit}_${level}`;
|
|
204
203
|
const shpPath = join(cacheDir, layer + ".shp");
|
|
205
204
|
yield { phase: "extract", file: layer + ".shp" };
|
|
206
|
-
const
|
|
205
|
+
const args = [
|
|
207
206
|
"-f",
|
|
208
207
|
"GeoJSONSeq",
|
|
209
208
|
"-t_srs",
|
|
@@ -212,20 +211,8 @@ export async function* fetchTIGER(options) {
|
|
|
212
211
|
selectSQL(level, layer, options.county),
|
|
213
212
|
"/vsistdout/",
|
|
214
213
|
shpPath,
|
|
215
|
-
]
|
|
216
|
-
|
|
217
|
-
child.stderr.on("data", (d) => (stderr += d));
|
|
218
|
-
const exited = new Promise((resolve) => {
|
|
219
|
-
child.on("close", (code) => resolve(code ?? 0));
|
|
220
|
-
});
|
|
221
|
-
// GeoJSONSeq is line-delimited; per-line `tryParsingJSON` so a malformed record is
|
|
222
|
-
// tolerated (skipped), not thrown.
|
|
223
|
-
for await (const line of TextSpliterator.fromAsync(child.stdout)) {
|
|
224
|
-
if (!line)
|
|
225
|
-
continue;
|
|
226
|
-
const feat = tryParsingJSON(line);
|
|
227
|
-
if (!feat)
|
|
228
|
-
continue;
|
|
214
|
+
];
|
|
215
|
+
for await (const feat of ogr2ogrGeoJSONSeq(args, layer)) {
|
|
229
216
|
if (!feat.properties)
|
|
230
217
|
continue;
|
|
231
218
|
if (level === "tabblock20" && !feat.geometry)
|
|
@@ -237,12 +224,9 @@ export async function* fetchTIGER(options) {
|
|
|
237
224
|
}
|
|
238
225
|
}
|
|
239
226
|
await flush();
|
|
240
|
-
const code = await exited;
|
|
241
|
-
if (code !== 0)
|
|
242
|
-
throw new Error(`ogr2ogr exited ${code} on ${layer}: ${stderr.slice(0, 500)}`);
|
|
243
227
|
yield { phase: "load", inserted, total: 0 };
|
|
244
228
|
}
|
|
245
|
-
|
|
229
|
+
kdb.exec("PRAGMA wal_checkpoint(TRUNCATE);");
|
|
246
230
|
return { outPath, table, inserted };
|
|
247
231
|
}
|
|
248
232
|
finally {
|
package/out/sdk/fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../sdk/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../lib/sdk/fetch.ts"],"names":[],"mappings":"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"}
|
package/out/sdk/index.d.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*/
|
|
6
|
-
export * from "
|
|
7
|
-
export * from "
|
|
8
|
-
export * from "
|
|
9
|
-
export * from "
|
|
6
|
+
export * from "#sdk/fetch";
|
|
7
|
+
export * from "#sdk/redistricting";
|
|
8
|
+
export * from "#sdk/schema";
|
|
9
|
+
export * from "#sdk/state/index";
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
package/out/sdk/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../sdk/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/sdk/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA"}
|
package/out/sdk/index.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* @license AGPL-3.0
|
|
4
4
|
* @author Teffen Ellis, et al.
|
|
5
5
|
*/
|
|
6
|
-
export * from "
|
|
7
|
-
export * from "
|
|
8
|
-
export * from "
|
|
9
|
-
export * from "
|
|
6
|
+
export * from "#sdk/fetch";
|
|
7
|
+
export * from "#sdk/redistricting";
|
|
8
|
+
export * from "#sdk/schema";
|
|
9
|
+
export * from "#sdk/state/index";
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
package/out/sdk/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../sdk/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/sdk/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA"}
|
|
@@ -15,6 +15,35 @@
|
|
|
15
15
|
*
|
|
16
16
|
* https://www2.census.gov/programs-surveys/decennial/2020/data/01-Redistricting_File--PL_94-171/
|
|
17
17
|
*/
|
|
18
|
+
/**
|
|
19
|
+
* Segment 2: FILEID|STUSAB|CHARITER|CIFSN|LOGRECNO(4)| P3×71 | P4×73 | H1×3 — 152 fields, H1 at the tail. Verified
|
|
20
|
+
* against the real file: `ca000022020.pl`'s state row reads 14,392,140 / 13,475,623 / 916,517, the published CA 2020
|
|
21
|
+
* figures. `occupied + vacant === housing_units` is the invariant that distinguishes a correct offset from a plausible
|
|
22
|
+
* one, and {@link parseH1} refuses a row where it does not hold.
|
|
23
|
+
*/
|
|
24
|
+
export declare const SEG2_FIELD_COUNT = 152;
|
|
25
|
+
/**
|
|
26
|
+
* H0010001 — total housing units, the third-from-last field of a segment-2 row.
|
|
27
|
+
*/
|
|
28
|
+
export declare const H1_TOTAL: number;
|
|
29
|
+
/**
|
|
30
|
+
* H0010002 — occupied housing units, the second-from-last field.
|
|
31
|
+
*/
|
|
32
|
+
export declare const H1_OCCUPIED: number;
|
|
33
|
+
/**
|
|
34
|
+
* H0010003 — vacant housing units, the last field (and so the one that carries a CRLF file's trailing CR).
|
|
35
|
+
*/
|
|
36
|
+
export declare const H1_VACANT: number;
|
|
37
|
+
export interface H1Counts {
|
|
38
|
+
housing_units: number;
|
|
39
|
+
occupied: number;
|
|
40
|
+
vacant: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The three H1 counts from one segment-2 row. The last field carries CRLF's trailing CR when the file has one, so each
|
|
44
|
+
* field is trimmed before it is read as a number; a row whose counts do not add up is refused rather than stored.
|
|
45
|
+
*/
|
|
46
|
+
export declare function parseH1(fields: readonly string[]): H1Counts;
|
|
18
47
|
export interface FetchRedistrictingOptions {
|
|
19
48
|
/**
|
|
20
49
|
* Two-digit state FIPS, e.g. `"06"`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redistricting.d.ts","sourceRoot":"","sources":["../../sdk/redistricting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"redistricting.d.ts","sourceRoot":"","sources":["../../lib/sdk/redistricting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAgCH;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,MAAM,CAAA;AACnC;;GAEG;AACH,eAAO,MAAM,QAAQ,QAAuB,CAAA;AAC5C;;GAEG;AACH,eAAO,MAAM,WAAW,QAAuB,CAAA;AAC/C;;GAEG;AACH,eAAO,MAAM,SAAS,QAAuB,CAAA;AAE7C,MAAM,WAAW,QAAQ;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,CAsB3D;AAiBD,MAAM,WAAW,yBAAyB;IACzC;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,uBAAuB,GAChC;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GACpD;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAErD,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CAChB;AAcD;;GAEG;AACH,wBAAuB,kBAAkB,CACxC,OAAO,EAAE,yBAAyB,GAChC,cAAc,CAAC,uBAAuB,EAAE,wBAAwB,CAAC,CAkInE"}
|
package/out/sdk/redistricting.js
CHANGED
|
@@ -15,20 +15,15 @@
|
|
|
15
15
|
*
|
|
16
16
|
* https://www2.census.gov/programs-surveys/decennial/2020/data/01-Redistricting_File--PL_94-171/
|
|
17
17
|
*/
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import { mkdir, rename } from "node:fs/promises";
|
|
21
|
-
import { dirname, join } from "node:path";
|
|
22
|
-
import { DatabaseSync } from "node:sqlite";
|
|
23
|
-
import { Readable } from "node:stream";
|
|
24
|
-
import { pipeline } from "node:stream/promises";
|
|
18
|
+
import { mailwomanDataRoot } from "@mailwoman/core/data-root";
|
|
19
|
+
import { makeDirectories } from "@mailwoman/core/fs/writers";
|
|
25
20
|
import { extractZipEntries } from "@mailwoman/core/fs/zip";
|
|
26
|
-
import { DatabaseClient } from "@mailwoman/
|
|
27
|
-
import {
|
|
21
|
+
import { DatabaseClient } from "@mailwoman/sqlite/client";
|
|
22
|
+
import { dirname, join } from "path-ts";
|
|
28
23
|
import { TextSpliterator } from "spliterator";
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
24
|
+
import { downloadIfNeeded } from "#sdk/download";
|
|
25
|
+
import { initializeTIGERSchema, TIGER_PRAGMAS } from "#sdk/schema";
|
|
26
|
+
import { AdminLevel1CodeToAbbreviation, StateName } from "#state";
|
|
32
27
|
const REDISTRICTING_BASE = "https://www2.census.gov/programs-surveys/decennial/2020/data/01-Redistricting_File--PL_94-171";
|
|
33
28
|
const DEFAULT_DATA_ROOT = mailwomanDataRoot();
|
|
34
29
|
/**
|
|
@@ -44,6 +39,46 @@ const GEO_GEOCODE = 9;
|
|
|
44
39
|
*/
|
|
45
40
|
const SEG_LOGRECNO = 4;
|
|
46
41
|
const P2 = (fieldNo) => 76 + (fieldNo - 1);
|
|
42
|
+
/**
|
|
43
|
+
* Segment 2: FILEID|STUSAB|CHARITER|CIFSN|LOGRECNO(4)| P3×71 | P4×73 | H1×3 — 152 fields, H1 at the tail. Verified
|
|
44
|
+
* against the real file: `ca000022020.pl`'s state row reads 14,392,140 / 13,475,623 / 916,517, the published CA 2020
|
|
45
|
+
* figures. `occupied + vacant === housing_units` is the invariant that distinguishes a correct offset from a plausible
|
|
46
|
+
* one, and {@link parseH1} refuses a row where it does not hold.
|
|
47
|
+
*/
|
|
48
|
+
export const SEG2_FIELD_COUNT = 152;
|
|
49
|
+
/**
|
|
50
|
+
* H0010001 — total housing units, the third-from-last field of a segment-2 row.
|
|
51
|
+
*/
|
|
52
|
+
export const H1_TOTAL = SEG2_FIELD_COUNT - 3;
|
|
53
|
+
/**
|
|
54
|
+
* H0010002 — occupied housing units, the second-from-last field.
|
|
55
|
+
*/
|
|
56
|
+
export const H1_OCCUPIED = SEG2_FIELD_COUNT - 2;
|
|
57
|
+
/**
|
|
58
|
+
* H0010003 — vacant housing units, the last field (and so the one that carries a CRLF file's trailing CR).
|
|
59
|
+
*/
|
|
60
|
+
export const H1_VACANT = SEG2_FIELD_COUNT - 1;
|
|
61
|
+
/**
|
|
62
|
+
* The three H1 counts from one segment-2 row. The last field carries CRLF's trailing CR when the file has one, so each
|
|
63
|
+
* field is trimmed before it is read as a number; a row whose counts do not add up is refused rather than stored.
|
|
64
|
+
*/
|
|
65
|
+
export function parseH1(fields) {
|
|
66
|
+
if (fields.length !== SEG2_FIELD_COUNT) {
|
|
67
|
+
throw new Error(`segment 2 row has ${fields.length} fields, expected ${SEG2_FIELD_COUNT}`);
|
|
68
|
+
}
|
|
69
|
+
const counts = {
|
|
70
|
+
housing_units: Number(fields[H1_TOTAL].trim()),
|
|
71
|
+
occupied: Number(fields[H1_OCCUPIED].trim()),
|
|
72
|
+
vacant: Number(fields[H1_VACANT].trim()),
|
|
73
|
+
};
|
|
74
|
+
if (![counts.housing_units, counts.occupied, counts.vacant].every(Number.isInteger)) {
|
|
75
|
+
throw new Error(`segment 2 row carries a non-integer H1 count: ${fields.slice(H1_TOTAL).join("|")}`);
|
|
76
|
+
}
|
|
77
|
+
if (counts.occupied + counts.vacant !== counts.housing_units) {
|
|
78
|
+
throw new Error(`segment 2 row breaks the H1 invariant: occupied ${counts.occupied} + vacant ${counts.vacant} != housing_units ${counts.housing_units} (LOGRECNO ${fields[SEG_LOGRECNO]})`);
|
|
79
|
+
}
|
|
80
|
+
return counts;
|
|
81
|
+
}
|
|
47
82
|
/**
|
|
48
83
|
* The eight P2 categories that partition the total (P0020001), in `pl_block` column order.
|
|
49
84
|
*/
|
|
@@ -86,8 +121,8 @@ export async function* fetchRedistricting(options) {
|
|
|
86
121
|
const cacheDir = join(dataRoot, "census", "redistricting", String(vintage), state);
|
|
87
122
|
// Same stable `tiger.db` default as fetchTIGER — pl_block lives alongside tabblock20 in one DB.
|
|
88
123
|
const outPath = options.outPath ?? join(dataRoot, "tiger", "tiger.db");
|
|
89
|
-
await
|
|
90
|
-
await
|
|
124
|
+
await makeDirectories(cacheDir);
|
|
125
|
+
await makeDirectories(dirname(outPath));
|
|
91
126
|
const zipName = `${fileAbbr}${vintage}.pl.zip`;
|
|
92
127
|
const zipPath = join(cacheDir, zipName);
|
|
93
128
|
const url = `${REDISTRICTING_BASE}/${dirName}/${zipName}`;
|
|
@@ -96,6 +131,7 @@ export async function* fetchRedistricting(options) {
|
|
|
96
131
|
await extractZipEntries(zipPath, cacheDir);
|
|
97
132
|
const geoPath = join(cacheDir, `${fileAbbr}geo${vintage}.pl`);
|
|
98
133
|
const seg1Path = join(cacheDir, `${fileAbbr}00001${vintage}.pl`);
|
|
134
|
+
const seg2Path = join(cacheDir, `${fileAbbr}00002${vintage}.pl`);
|
|
99
135
|
yield { phase: "extract", file: `${fileAbbr}geo${vintage}.pl` };
|
|
100
136
|
// Pass 1: header → LOGRECNO → GEOID for the blocks we want.
|
|
101
137
|
const prefix = options.county ? state + options.county : state;
|
|
@@ -111,9 +147,19 @@ export async function* fetchRedistricting(options) {
|
|
|
111
147
|
});
|
|
112
148
|
const total = logToGeoid.size;
|
|
113
149
|
yield { phase: "header", blocks: total };
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const
|
|
150
|
+
// Pass 1b: segment 2 → H1 housing counts for the mapped LOGRECNOs. Read before segment 1 so a block's P2 and H1
|
|
151
|
+
// land in one row; a mapped block with no segment-2 row is a data defect the load refuses, never a zero.
|
|
152
|
+
const h1ByLogrecno = new Map();
|
|
153
|
+
await eachLine(seg2Path, (line) => {
|
|
154
|
+
const f = line.split("|");
|
|
155
|
+
const logrecno = f[SEG_LOGRECNO] ?? "";
|
|
156
|
+
if (!logToGeoid.has(logrecno))
|
|
157
|
+
return;
|
|
158
|
+
h1ByLogrecno.set(logrecno, parseH1(f));
|
|
159
|
+
});
|
|
160
|
+
yield { phase: "extract", file: `${fileAbbr}00002${vintage}.pl` };
|
|
161
|
+
const kdb = new DatabaseClient(outPath);
|
|
162
|
+
kdb.exec(TIGER_PRAGMAS);
|
|
117
163
|
await initializeTIGERSchema(kdb);
|
|
118
164
|
try {
|
|
119
165
|
// Idempotent re-run: drop the rows we're about to (re)load.
|
|
@@ -136,11 +182,17 @@ export async function* fetchRedistricting(options) {
|
|
|
136
182
|
if (!line)
|
|
137
183
|
continue;
|
|
138
184
|
const f = line.split("|");
|
|
139
|
-
const
|
|
185
|
+
const logrecno = f[SEG_LOGRECNO] ?? "";
|
|
186
|
+
const geoid = logToGeoid.get(logrecno);
|
|
140
187
|
if (!geoid)
|
|
141
188
|
continue;
|
|
189
|
+
const h1 = h1ByLogrecno.get(logrecno);
|
|
190
|
+
if (!h1) {
|
|
191
|
+
throw new Error(`block ${geoid} (LOGRECNO ${logrecno}) has a segment-1 row and no segment-2 row`);
|
|
192
|
+
}
|
|
142
193
|
batch.push({
|
|
143
194
|
GEOID: geoid,
|
|
195
|
+
...h1,
|
|
144
196
|
pop_total: Number(f[CATEGORY_INDEX.pop_total] ?? 0),
|
|
145
197
|
hispanic: Number(f[CATEGORY_INDEX.hispanic] ?? 0),
|
|
146
198
|
white: Number(f[CATEGORY_INDEX.white] ?? 0),
|
|
@@ -158,7 +210,7 @@ export async function* fetchRedistricting(options) {
|
|
|
158
210
|
}
|
|
159
211
|
await flush();
|
|
160
212
|
yield { phase: "load", inserted, total };
|
|
161
|
-
|
|
213
|
+
kdb.exec("PRAGMA wal_checkpoint(TRUNCATE);");
|
|
162
214
|
return { outPath, table: "pl_block", inserted };
|
|
163
215
|
}
|
|
164
216
|
finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redistricting.js","sourceRoot":"","sources":["../../sdk/redistricting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"redistricting.js","sourceRoot":"","sources":["../../lib/sdk/redistricting.ts"],"names":[],"mappings":"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"}
|
package/out/sdk/schema.d.ts
CHANGED
|
@@ -42,6 +42,18 @@ export interface PLBlockTable {
|
|
|
42
42
|
nhpi: number;
|
|
43
43
|
other: number;
|
|
44
44
|
multi: number;
|
|
45
|
+
/**
|
|
46
|
+
* P.L. 94-171 table H1 — total housing units in the block.
|
|
47
|
+
*/
|
|
48
|
+
housing_units: number;
|
|
49
|
+
/**
|
|
50
|
+
* H1 occupied. `occupied + vacant === housing_units` by construction; the reader refuses a row where it is not.
|
|
51
|
+
*/
|
|
52
|
+
occupied: number;
|
|
53
|
+
/**
|
|
54
|
+
* H1 vacant.
|
|
55
|
+
*/
|
|
56
|
+
vacant: number;
|
|
45
57
|
}
|
|
46
58
|
/**
|
|
47
59
|
* Kysely row type for `tiger_streets` (ADDRFEAT — named street segments + ZIPs, per county).
|
|
@@ -82,14 +94,5 @@ export interface TIGERDatabase {
|
|
|
82
94
|
* indexes.
|
|
83
95
|
*/
|
|
84
96
|
export declare const TIGER_PRAGMAS = "\nPRAGMA auto_vacuum = INCREMENTAL;\nPRAGMA page_size = 4096;\nPRAGMA cache_size = 10000;\nPRAGMA journal_mode = WAL;\n";
|
|
85
|
-
/**
|
|
86
|
-
* Create the TIGER tables + indexes via the Kysely schema-builder (the house idiom). Idempotent (`IF NOT EXISTS`). Pass
|
|
87
|
-
* a {@link DatabaseClient} (or any `Kysely`) over the TIGER DB; run {@link TIGER_PRAGMAS} first. `us_state`/`tract`
|
|
88
|
-
* aren't in {@link TIGERDatabase} (created here but not queried via Kysely) — `createTable` takes any table name, so
|
|
89
|
-
* that's fine.
|
|
90
|
-
*
|
|
91
|
-
* The `text(N)` length hints in the prior raw DDL were documentary only (SQLite uses TEXT affinity regardless); the
|
|
92
|
-
* lengths live on the {@link TIGERBlockTable} interface instead.
|
|
93
|
-
*/
|
|
94
97
|
export declare function initializeTIGERSchema(db: Kysely<TIGERDatabase>): Promise<void>;
|
|
95
98
|
//# 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,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEzC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAA;AAEvC,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;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../lib/sdk/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAEzC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAA;AAEvC,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;IACb;;OAEG;IACH,aAAa,EAAE,MAAM,CAAA;IACrB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;CACd;AAED;;GAEG;AACH,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;;GAEG;AACH,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;;GAEG;AACH,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;;GAEG;AAEH;;;;GAIG;AACH,eAAO,MAAM,aAAa,4HAKzB,CAAA;AA8BD,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiHpF"}
|
package/out/sdk/schema.js
CHANGED
|
@@ -34,6 +34,21 @@ PRAGMA journal_mode = WAL;
|
|
|
34
34
|
* The `text(N)` length hints in the prior raw DDL were documentary only (SQLite uses TEXT affinity regardless); the
|
|
35
35
|
* lengths live on the {@link TIGERBlockTable} interface instead.
|
|
36
36
|
*/
|
|
37
|
+
/**
|
|
38
|
+
* Refuse a `pl_block` built before the H1 columns existed. `createTable(...).ifNotExists()` leaves an older table as it
|
|
39
|
+
* is, and the next load would fail on the first insert with a message about a column, not about the cause. The table is
|
|
40
|
+
* derived (the redistricting command reloads it state by state), so the remedy is a rebuild: drop it and re-run
|
|
41
|
+
* `mailwoman tiger redistricting` for each state you hold. Databases are never patched in place.
|
|
42
|
+
*/
|
|
43
|
+
async function assertPLBlockShape(db) {
|
|
44
|
+
const columns = await sql `select name from pragma_table_info('pl_block')`.execute(db);
|
|
45
|
+
const names = new Set(columns.rows.map((row) => row.name));
|
|
46
|
+
for (const required of ["housing_units", "occupied", "vacant"]) {
|
|
47
|
+
if (!names.has(required)) {
|
|
48
|
+
throw new Error(`pl_block predates its H1 columns (missing ${required}). It is a derived table: drop it and re-run \`mailwoman tiger redistricting\` for each state, which reloads P2 and H1 together.`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
37
52
|
export async function initializeTIGERSchema(db) {
|
|
38
53
|
await db.schema
|
|
39
54
|
.createTable("us_state")
|
|
@@ -98,10 +113,14 @@ export async function initializeTIGERSchema(db) {
|
|
|
98
113
|
.addColumn("nhpi", "integer", (c) => c.notNull())
|
|
99
114
|
.addColumn("other", "integer", (c) => c.notNull())
|
|
100
115
|
.addColumn("multi", "integer", (c) => c.notNull())
|
|
116
|
+
.addColumn("housing_units", "integer", (c) => c.notNull())
|
|
117
|
+
.addColumn("occupied", "integer", (c) => c.notNull())
|
|
118
|
+
.addColumn("vacant", "integer", (c) => c.notNull())
|
|
101
119
|
// pl_block is small (no geometry) and always probed by its GEOID PK (1:1 join to tabblock20), so
|
|
102
120
|
// cluster it WITHOUT ROWID — one B-tree probe per join, no separate rowid + PK-index pair.
|
|
103
121
|
.modifyEnd(sql `without rowid`)
|
|
104
122
|
.execute();
|
|
123
|
+
await assertPLBlockShape(db);
|
|
105
124
|
await db.schema
|
|
106
125
|
.createTable("tiger_streets")
|
|
107
126
|
.ifNotExists()
|