@dpkit/table
Version:
Data Package implementation in TypeScript.
24 lines • 3.81 kB
JavaScript
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=