@dpkit/table
Version:
Data Package implementation in TypeScript.
28 lines • 5.32 kB
JavaScript
import { col, lit } from "nodejs-polars";
import { stringifyField } from "../field/index.js";
import { getPolarsSchema } from "../schema/index.js";
const HEAD_ROWS = 100;
export async function denormalizeTable(table, schema, options) {
const head = await table.head(HEAD_ROWS).collect();
const polarsSchema = getPolarsSchema(head.schema);
return table.select(Object.values(denormalizeFields(schema, polarsSchema, options)));
}
export function denormalizeFields(schema, polarsSchema, options) {
const { nativeTypes } = options ?? {};
const exprs = {};
for (const field of schema.fields) {
const polarsField = polarsSchema.fields.find(f => f.name === field.name);
let expr = lit(null).alias(field.name);
if (polarsField) {
expr = col(polarsField.name).alias(field.name);
if (!nativeTypes?.includes(field.type ?? "any")) {
const missingValues = field.missingValues ?? schema.missingValues;
const mergedField = { ...field, missingValues };
expr = stringifyField(mergedField, expr);
}
}
exprs[field.name] = expr;
}
return exprs;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVub3JtYWxpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9kZW5vcm1hbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUV4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFFbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBR3BELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQTtBQU1yQixNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxLQUFZLEVBQ1osTUFBYyxFQUNkLE9BQWlDO0lBRWpDLE1BQU0sSUFBSSxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUNsRCxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRWpELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQ2hFLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixNQUFjLEVBQ2QsWUFBMEIsRUFDMUIsT0FBaUM7SUFFakMsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUE7SUFDckMsTUFBTSxLQUFLLEdBQXlCLEVBQUUsQ0FBQTtJQUV0QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3hFLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXRDLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUU5QyxJQUFJLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2hELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQTtnQkFDakUsTUFBTSxXQUFXLEdBQUcsRUFBRSxHQUFHLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQTtnQkFDL0MsSUFBSSxHQUFHLGNBQWMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUE7WUFDMUMsQ0FBQztRQUNILENBQUM7UUFFRCxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQTtJQUMxQixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBGaWVsZCwgU2NoZW1hIH0gZnJvbSBcIkBkcGtpdC9jb3JlXCJcbmltcG9ydCB7IGNvbCwgbGl0IH0gZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHR5cGUgeyBFeHByIH0gZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgc3RyaW5naWZ5RmllbGQgfSBmcm9tIFwiLi4vZmllbGQvaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBQb2xhcnNTY2hlbWEgfSBmcm9tIFwiLi4vc2NoZW1hL2luZGV4LnRzXCJcbmltcG9ydCB7IGdldFBvbGFyc1NjaGVtYSB9IGZyb20gXCIuLi9zY2hlbWEvaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBUYWJsZSB9IGZyb20gXCIuL1RhYmxlLnRzXCJcblxuY29uc3QgSEVBRF9ST1dTID0gMTAwXG5cbnR5cGUgRGVub3JtYWxpemVUYWJsZU9wdGlvbnMgPSB7XG4gIG5hdGl2ZVR5cGVzPzogRXhjbHVkZTxGaWVsZFtcInR5cGVcIl0sIHVuZGVmaW5lZD5bXVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVub3JtYWxpemVUYWJsZShcbiAgdGFibGU6IFRhYmxlLFxuICBzY2hlbWE6IFNjaGVtYSxcbiAgb3B0aW9ucz86IERlbm9ybWFsaXplVGFibGVPcHRpb25zLFxuKSB7XG4gIGNvbnN0IGhlYWQgPSBhd2FpdCB0YWJsZS5oZWFkKEhFQURfUk9XUykuY29sbGVjdCgpXG4gIGNvbnN0IHBvbGFyc1NjaGVtYSA9IGdldFBvbGFyc1NjaGVtYShoZWFkLnNjaGVtYSlcblxuICByZXR1cm4gdGFibGUuc2VsZWN0KFxuICAgIE9iamVjdC52YWx1ZXMoZGVub3JtYWxpemVGaWVsZHMoc2NoZW1hLCBwb2xhcnNTY2hlbWEsIG9wdGlvbnMpKSxcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVub3JtYWxpemVGaWVsZHMoXG4gIHNjaGVtYTogU2NoZW1hLFxuICBwb2xhcnNTY2hlbWE6IFBvbGFyc1NjaGVtYSxcbiAgb3B0aW9ucz86IERlbm9ybWFsaXplVGFibGVPcHRpb25zLFxuKSB7XG4gIGNvbnN0IHsgbmF0aXZlVHlwZXMgfSA9IG9wdGlvbnMgPz8ge31cbiAgY29uc3QgZXhwcnM6IFJlY29yZDxzdHJpbmcsIEV4cHI+ID0ge31cblxuICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNjaGVtYS5maWVsZHMpIHtcbiAgICBjb25zdCBwb2xhcnNGaWVsZCA9IHBvbGFyc1NjaGVtYS5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGQubmFtZSlcbiAgICBsZXQgZXhwciA9IGxpdChudWxsKS5hbGlhcyhmaWVsZC5uYW1lKVxuXG4gICAgaWYgKHBvbGFyc0ZpZWxkKSB7XG4gICAgICBleHByID0gY29sKHBvbGFyc0ZpZWxkLm5hbWUpLmFsaWFzKGZpZWxkLm5hbWUpXG5cbiAgICAgIGlmICghbmF0aXZlVHlwZXM/LmluY2x1ZGVzKGZpZWxkLnR5cGUgPz8gXCJhbnlcIikpIHtcbiAgICAgICAgY29uc3QgbWlzc2luZ1ZhbHVlcyA9IGZpZWxkLm1pc3NpbmdWYWx1ZXMgPz8gc2NoZW1hLm1pc3NpbmdWYWx1ZXNcbiAgICAgICAgY29uc3QgbWVyZ2VkRmllbGQgPSB7IC4uLmZpZWxkLCBtaXNzaW5nVmFsdWVzIH1cbiAgICAgICAgZXhwciA9IHN0cmluZ2lmeUZpZWxkKG1lcmdlZEZpZWxkLCBleHByKVxuICAgICAgfVxuICAgIH1cblxuICAgIGV4cHJzW2ZpZWxkLm5hbWVdID0gZXhwclxuICB9XG5cbiAgcmV0dXJuIGV4cHJzXG59XG4iXX0=