UNPKG

@dpkit/table

Version:

Data Package implementation in TypeScript.

24 lines 3.81 kB
import { col, concatList } from "nodejs-polars"; // TODO: fold is not available so we use a tricky way to eliminate list nulls // TODO: Using comma as separator might rarely clash with comma in field names export function checkRowUnique(schema, errorTable) { const uniqueKeys = schema.uniqueKeys ?? []; if (schema.primaryKey) { uniqueKeys.push(schema.primaryKey); } for (const uniqueKey of uniqueKeys) { const targetNames = uniqueKey.map(field => `target:${field}`); const errorName = `error:row/unique:${uniqueKey.join(",")}`; errorTable = errorTable .withColumn(concatList(targetNames).alias(errorName)) .withColumn(col(errorName) .lst.min() .isNull() .not() .and(col(errorName).isFirstDistinct().not()) .alias(errorName)) .withColumn(col("error").or(col(errorName)).alias("error")); } return errorTable; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcm93L2NoZWNrcy91bmlxdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFHL0MsNkVBQTZFO0FBQzdFLDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQWMsRUFBRSxVQUFpQjtJQUM5RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQTtJQUUxQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBRUQsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQzdELE1BQU0sU0FBUyxHQUFHLG9CQUFvQixTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUE7UUFFM0QsVUFBVSxHQUFHLFVBQVU7YUFDcEIsVUFBVSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDcEQsVUFBVSxDQUNULEdBQUcsQ0FBQyxTQUFTLENBQUM7YUFDWCxHQUFHLENBQUMsR0FBRyxFQUFFO2FBQ1QsTUFBTSxFQUFFO2FBQ1IsR0FBRyxFQUFFO2FBQ0wsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUMzQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQ3BCO2FBQ0EsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFBO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNjaGVtYSB9IGZyb20gXCJAZHBraXQvY29yZVwiXG5pbXBvcnQgeyBjb2wsIGNvbmNhdExpc3QgfSBmcm9tIFwibm9kZWpzLXBvbGFyc1wiXG5pbXBvcnQgdHlwZSB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3RhYmxlL1RhYmxlLnRzXCJcblxuLy8gVE9ETzogZm9sZCBpcyBub3QgYXZhaWxhYmxlIHNvIHdlIHVzZSBhIHRyaWNreSB3YXkgdG8gZWxpbWluYXRlIGxpc3QgbnVsbHNcbi8vIFRPRE86IFVzaW5nIGNvbW1hIGFzIHNlcGFyYXRvciBtaWdodCByYXJlbHkgY2xhc2ggd2l0aCBjb21tYSBpbiBmaWVsZCBuYW1lc1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUm93VW5pcXVlKHNjaGVtYTogU2NoZW1hLCBlcnJvclRhYmxlOiBUYWJsZSkge1xuICBjb25zdCB1bmlxdWVLZXlzID0gc2NoZW1hLnVuaXF1ZUtleXMgPz8gW11cblxuICBpZiAoc2NoZW1hLnByaW1hcnlLZXkpIHtcbiAgICB1bmlxdWVLZXlzLnB1c2goc2NoZW1hLnByaW1hcnlLZXkpXG4gIH1cblxuICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgY29uc3QgdGFyZ2V0TmFtZXMgPSB1bmlxdWVLZXkubWFwKGZpZWxkID0+IGB0YXJnZXQ6JHtmaWVsZH1gKVxuICAgIGNvbnN0IGVycm9yTmFtZSA9IGBlcnJvcjpyb3cvdW5pcXVlOiR7dW5pcXVlS2V5LmpvaW4oXCIsXCIpfWBcblxuICAgIGVycm9yVGFibGUgPSBlcnJvclRhYmxlXG4gICAgICAud2l0aENvbHVtbihjb25jYXRMaXN0KHRhcmdldE5hbWVzKS5hbGlhcyhlcnJvck5hbWUpKVxuICAgICAgLndpdGhDb2x1bW4oXG4gICAgICAgIGNvbChlcnJvck5hbWUpXG4gICAgICAgICAgLmxzdC5taW4oKVxuICAgICAgICAgIC5pc051bGwoKVxuICAgICAgICAgIC5ub3QoKVxuICAgICAgICAgIC5hbmQoY29sKGVycm9yTmFtZSkuaXNGaXJzdERpc3RpbmN0KCkubm90KCkpXG4gICAgICAgICAgLmFsaWFzKGVycm9yTmFtZSksXG4gICAgICApXG4gICAgICAud2l0aENvbHVtbihjb2woXCJlcnJvclwiKS5vcihjb2woZXJyb3JOYW1lKSkuYWxpYXMoXCJlcnJvclwiKSlcbiAgfVxuXG4gIHJldHVybiBlcnJvclRhYmxlXG59XG4iXX0=