@dpkit/table
Version:
Data Package implementation in TypeScript.
29 lines • 5.49 kB
JavaScript
import { col, lit } from "nodejs-polars";
import { denormalizeField } 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);
// TODO: Move this logic to denormalizeField?
if (!nativeTypes?.includes(field.type ?? "any")) {
const missingValues = field.missingValues ?? schema.missingValues;
const mergedField = { ...field, missingValues };
expr = denormalizeField(mergedField, expr);
}
}
exprs[field.name] = expr;
}
return exprs;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVub3JtYWxpemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90YWJsZS9kZW5vcm1hbGl6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUV4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFHcEQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFBO0FBTXJCLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQ3BDLEtBQVksRUFDWixNQUFjLEVBQ2QsT0FBaUM7SUFFakMsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQ2xELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFakQsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUNqQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUNuRSxDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsTUFBYyxFQUNkLFlBQTBCLEVBQzFCLE9BQWlDO0lBRWpDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLElBQUksRUFBRSxDQUFBO0lBQ3JDLE1BQU0sS0FBSyxHQUF5QixFQUFFLENBQUE7SUFFdEMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN4RSxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUV0QyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7WUFFOUMsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFBO2dCQUNqRSxNQUFNLFdBQVcsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFBO2dCQUMvQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFBO1lBQzVDLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUE7SUFDMUIsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgRmllbGQsIFNjaGVtYSB9IGZyb20gXCJAZHBraXQvY29yZVwiXG5pbXBvcnQgeyBjb2wsIGxpdCB9IGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB0eXBlIHsgRXhwciB9IGZyb20gXCJub2RlanMtcG9sYXJzXCJcbmltcG9ydCB7IGRlbm9ybWFsaXplRmllbGQgfSBmcm9tIFwiLi4vZmllbGQvaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBQb2xhcnNTY2hlbWEgfSBmcm9tIFwiLi4vc2NoZW1hL2luZGV4LnRzXCJcbmltcG9ydCB7IGdldFBvbGFyc1NjaGVtYSB9IGZyb20gXCIuLi9zY2hlbWEvaW5kZXgudHNcIlxuaW1wb3J0IHR5cGUgeyBUYWJsZSB9IGZyb20gXCIuL1RhYmxlLnRzXCJcblxuY29uc3QgSEVBRF9ST1dTID0gMTAwXG5cbnR5cGUgRGVub3JtYWxpemVUYWJsZU9wdGlvbnMgPSB7XG4gIG5hdGl2ZVR5cGVzPzogRXhjbHVkZTxGaWVsZFtcInR5cGVcIl0sIHVuZGVmaW5lZD5bXVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVub3JtYWxpemVUYWJsZShcbiAgdGFibGU6IFRhYmxlLFxuICBzY2hlbWE6IFNjaGVtYSxcbiAgb3B0aW9ucz86IERlbm9ybWFsaXplVGFibGVPcHRpb25zLFxuKSB7XG4gIGNvbnN0IGhlYWQgPSBhd2FpdCB0YWJsZS5oZWFkKEhFQURfUk9XUykuY29sbGVjdCgpXG4gIGNvbnN0IHBvbGFyc1NjaGVtYSA9IGdldFBvbGFyc1NjaGVtYShoZWFkLnNjaGVtYSlcblxuICByZXR1cm4gdGFibGUuc2VsZWN0KFxuICAgIC4uLk9iamVjdC52YWx1ZXMoZGVub3JtYWxpemVGaWVsZHMoc2NoZW1hLCBwb2xhcnNTY2hlbWEsIG9wdGlvbnMpKSxcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVub3JtYWxpemVGaWVsZHMoXG4gIHNjaGVtYTogU2NoZW1hLFxuICBwb2xhcnNTY2hlbWE6IFBvbGFyc1NjaGVtYSxcbiAgb3B0aW9ucz86IERlbm9ybWFsaXplVGFibGVPcHRpb25zLFxuKSB7XG4gIGNvbnN0IHsgbmF0aXZlVHlwZXMgfSA9IG9wdGlvbnMgPz8ge31cbiAgY29uc3QgZXhwcnM6IFJlY29yZDxzdHJpbmcsIEV4cHI+ID0ge31cblxuICBmb3IgKGNvbnN0IGZpZWxkIG9mIHNjaGVtYS5maWVsZHMpIHtcbiAgICBjb25zdCBwb2xhcnNGaWVsZCA9IHBvbGFyc1NjaGVtYS5maWVsZHMuZmluZChmID0+IGYubmFtZSA9PT0gZmllbGQubmFtZSlcbiAgICBsZXQgZXhwciA9IGxpdChudWxsKS5hbGlhcyhmaWVsZC5uYW1lKVxuXG4gICAgaWYgKHBvbGFyc0ZpZWxkKSB7XG4gICAgICBleHByID0gY29sKHBvbGFyc0ZpZWxkLm5hbWUpLmFsaWFzKGZpZWxkLm5hbWUpXG5cbiAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyBsb2dpYyB0byBkZW5vcm1hbGl6ZUZpZWxkP1xuICAgICAgaWYgKCFuYXRpdmVUeXBlcz8uaW5jbHVkZXMoZmllbGQudHlwZSA/PyBcImFueVwiKSkge1xuICAgICAgICBjb25zdCBtaXNzaW5nVmFsdWVzID0gZmllbGQubWlzc2luZ1ZhbHVlcyA/PyBzY2hlbWEubWlzc2luZ1ZhbHVlc1xuICAgICAgICBjb25zdCBtZXJnZWRGaWVsZCA9IHsgLi4uZmllbGQsIG1pc3NpbmdWYWx1ZXMgfVxuICAgICAgICBleHByID0gZGVub3JtYWxpemVGaWVsZChtZXJnZWRGaWVsZCwgZXhwcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBleHByc1tmaWVsZC5uYW1lXSA9IGV4cHJcbiAgfVxuXG4gIHJldHVybiBleHByc1xufVxuIl19