/** * GADM Database — reads the parquet database and provides row-based lookups. * Uses hyparquet for zero-native-dep parquet reading. */ import { parquetReadObjects } from 'hyparquet'; import { readFileSync } from 'fs'; import { resolve, dirname } from 'path'; import { fileURLToPath } from 'url'; // ---------- types ---------- export const NAME_COLS = ['NAME_0', 'NAME_1', 'NAME_2', 'NAME_3', 'NAME_4', 'NAME_5']; export const GID_COLS = ['GID_0', 'GID_1', 'GID_2', 'GID_3', 'GID_4', 'GID_5']; // ---------- paths ---------- const __filename_ = fileURLToPath(import.meta.url); const __dirname_ = dirname(__filename_); /** Path to the parquet database (local copy from pygadm) */ const PARQUET_PATH = resolve(__dirname_, '../data/gadm_database.parquet'); // ---------- lazy cache ---------- let _rows = null; function readFile() { const buffer = readFileSync(PARQUET_PATH); return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength); } /** The data columns we care about (exclude pandas index) */ const DATA_COLUMNS = [ 'GID_0', 'GID_1', 'GID_2', 'GID_3', 'GID_4', 'GID_5', 'NAME_0', 'NAME_1', 'NAME_2', 'NAME_3', 'NAME_4', 'NAME_5', ]; /** * Load the GADM parquet database into memory (lazy, cached). * Returns an array of plain objects keyed by column name. */ export async function loadDatabase() { if (_rows) return _rows; const file = readFile(); // parquetReadObjects returns proper keyed objects with decoded strings const rawObjects = await parquetReadObjects({ file, columns: DATA_COLUMNS, }); // Normalize all values to strings (empty string for null/undefined) _rows = rawObjects.map(obj => { const row = {}; for (const col of DATA_COLUMNS) { const v = obj[col]; row[col] = v != null ? String(v) : ''; } return row; }); return _rows; } /** * Get column names. */ export function getColumns() { return [...DATA_COLUMNS]; } /** * Reset the cache (useful for testing). */ export function resetCache() { _rows = null; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBQ0gsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUVwQyw4QkFBOEI7QUFFOUIsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQVUsQ0FBQztBQUMvRixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBVSxDQUFDO0FBSXhGLDhCQUE4QjtBQUU5QixNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNuRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFeEMsNERBQTREO0FBQzVELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FDeEIsVUFBVSxFQUNWLCtCQUErQixDQUNsQyxDQUFDO0FBRUYsbUNBQW1DO0FBRW5DLElBQUksS0FBSyxHQUFxQixJQUFJLENBQUM7QUFFbkMsU0FBUyxRQUFRO0lBQ2IsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ3RCLE1BQU0sQ0FBQyxVQUFVLEVBQ2pCLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FDeEMsQ0FBQztBQUNOLENBQUM7QUFFRCw0REFBNEQ7QUFDNUQsTUFBTSxZQUFZLEdBQUc7SUFDakIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPO0lBQ3BELFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUTtDQUM3RCxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZO0lBQzlCLElBQUksS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXhCLE1BQU0sSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFDO0lBRXhCLHVFQUF1RTtJQUN2RSxNQUFNLFVBQVUsR0FBRyxNQUFNLGtCQUFrQixDQUFDO1FBQ3hDLElBQUk7UUFDSixPQUFPLEVBQUUsWUFBWTtLQUN4QixDQUEwQixDQUFDO0lBRTVCLG9FQUFvRTtJQUNwRSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN6QixNQUFNLEdBQUcsR0FBWSxFQUFFLENBQUM7UUFDeEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUM3QixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVU7SUFDdEIsT0FBTyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVU7SUFDdEIsS0FBSyxHQUFHLElBQUksQ0FBQztBQUNqQixDQUFDIn0=