UNPKG

@forestadmin/datasource-toolkit

Version:
92 lines 9.54 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const branch_1 = __importDefault(require("./nodes/branch")); const leaf_1 = __importDefault(require("./nodes/leaf")); const record_1 = __importDefault(require("../../../utils/record")); const schema_1 = __importDefault(require("../../../utils/schema")); class ConditionTreeFactory { static matchRecords(schema, records) { const ids = records.map(r => record_1.default.getPrimaryKey(schema, r)); return ConditionTreeFactory.matchIds(schema, ids); } static matchIds(schema, ids) { const primaryKeyNames = schema_1.default.getPrimaryKeys(schema); if (primaryKeyNames.length === 0) { throw new Error('Collection must have at least one primary key'); } for (const name of primaryKeyNames) { const operators = schema_1.default.getColumn(schema, name).filterOperators; if (!operators?.has('Equal') || !operators?.has('In')) { throw new Error(`Field '${name}' must support operators: ['Equal', 'In']`); } } return ConditionTreeFactory.matchFields(primaryKeyNames, ids); } static union(...trees) { if (trees.length === 1) return trees[0]; return ConditionTreeFactory.group('Or', trees); } static intersect(...trees) { const result = ConditionTreeFactory.group('And', trees); const isEmptyAnd = result instanceof branch_1.default && result.aggregator === 'And' && result.conditions.length === 0; return isEmptyAnd ? null : result; } static fromPlainObject(json) { if (json === null) return null; if (ConditionTreeFactory.isLeaf(json)) { return new leaf_1.default(json.field, json.operator, json.value); } if (ConditionTreeFactory.isBranch(json)) { const branch = new branch_1.default(json.aggregator, json.conditions.map(subTree => ConditionTreeFactory.fromPlainObject(subTree))); return branch.conditions.length !== 1 ? branch : branch.conditions[0]; } throw new Error('Failed to instantiate condition tree from json'); } static matchFields(fields, values) { if (values.length === 0) return ConditionTreeFactory.MatchNone; if (fields.length === 1) { const fieldValues = values.map(tuple => tuple[0]); return fieldValues.length > 1 ? new leaf_1.default(fields[0], 'In', fieldValues) : new leaf_1.default(fields[0], 'Equal', fieldValues[0]); } const [firstField, ...otherFields] = fields; const groups = new Map(); for (const [firstValue, ...otherValues] of values) { if (groups.has(firstValue)) groups.get(firstValue).push(otherValues); else groups.set(firstValue, [otherValues]); } return ConditionTreeFactory.union(...[...groups.entries()].map(([firstValue, subValues]) => ConditionTreeFactory.intersect(ConditionTreeFactory.matchFields([firstField], [[firstValue]]), ConditionTreeFactory.matchFields(otherFields, subValues)))); } static group(aggregator, trees) { const conditions = trees .filter(Boolean) .reduce((currentConditions, tree) => tree instanceof branch_1.default && tree.aggregator === aggregator ? [...currentConditions, ...tree.conditions] : [...currentConditions, tree], []); if (conditions.length === 1) { return conditions[0]; } return new branch_1.default(aggregator, conditions); } static isLeaf(raw) { return typeof raw === 'object' && 'field' in raw && 'operator' in raw; } static isBranch(raw) { return typeof raw === 'object' && 'aggregator' in raw && 'conditions' in raw; } } exports.default = ConditionTreeFactory; ConditionTreeFactory.MatchNone = new branch_1.default('Or', []); ConditionTreeFactory.MatchAll = null; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL3F1ZXJ5L2NvbmRpdGlvbi10cmVlL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSw0REFBaUU7QUFDakUsd0RBQTZDO0FBRTdDLG1FQUFnRDtBQUNoRCxtRUFBZ0Q7QUFRaEQsTUFBcUIsb0JBQW9CO0lBSXZDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBd0IsRUFBRSxPQUFxQjtRQUNqRSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkUsT0FBTyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQXdCLEVBQUUsR0FBa0I7UUFDMUQsTUFBTSxlQUFlLEdBQUcsZ0JBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFM0QsSUFBSSxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7U0FDbEU7UUFFRCxLQUFLLE1BQU0sSUFBSSxJQUFJLGVBQWUsRUFBRTtZQUNsQyxNQUFNLFNBQVMsR0FBRyxnQkFBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDO1lBRXRFLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksMkNBQTJDLENBQUMsQ0FBQzthQUM1RTtTQUNGO1FBRUQsT0FBTyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBc0I7UUFDcEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV4QyxPQUFPLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFzQjtRQUN4QyxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELE1BQU0sVUFBVSxHQUNkLE1BQU0sWUFBWSxnQkFBbUI7WUFDckMsTUFBTSxDQUFDLFVBQVUsS0FBSyxLQUFLO1lBQzNCLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztRQUVqQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDcEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBaUI7UUFDdEMsSUFBSSxJQUFJLEtBQUssSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBRS9CLElBQUksb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sSUFBSSxjQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQW9CLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2pGO1FBRUQsSUFBSSxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxnQkFBbUIsQ0FDcEMsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUM5RSxDQUFDO1lBRUYsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2RTtRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFnQixFQUFFLE1BQW1CO1FBQzlELElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxvQkFBb0IsQ0FBQyxTQUFTLENBQUM7UUFFL0QsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbEQsT0FBTyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxJQUFJLGNBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLENBQUM7Z0JBQ3JELENBQUMsQ0FBQyxJQUFJLGNBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvRDtRQUVELE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxXQUFXLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFFL0MsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFLEdBQUcsV0FBVyxDQUFDLElBQUksTUFBTSxFQUFFO1lBQ2pELElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0JBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7O2dCQUNoRSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFFRCxPQUFPLG9CQUFvQixDQUFDLEtBQUssQ0FDL0IsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFnQixDQUFDLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FDdEUsb0JBQW9CLENBQUMsU0FBUyxDQUM1QixvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUM5RCxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUN6RCxDQUNGLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQXNCLEVBQUUsS0FBc0I7UUFDakUsTUFBTSxVQUFVLEdBQUcsS0FBSzthQUNyQixNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsTUFBTSxDQUNMLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FDMUIsSUFBSSxZQUFZLGdCQUFtQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVTtZQUNuRSxDQUFDLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUM1QyxDQUFDLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixFQUFFLElBQUksQ0FBQyxFQUNsQyxFQUFxQixDQUN0QixDQUFDO1FBRUosSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMzQixPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QjtRQUVELE9BQU8sSUFBSSxnQkFBbUIsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxNQUFNLENBQ25CLEdBQVk7UUFFWixPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxPQUFPLElBQUksR0FBRyxJQUFJLFVBQVUsSUFBSSxHQUFHLENBQUM7SUFDeEUsQ0FBQztJQUVPLE1BQU0sQ0FBQyxRQUFRLENBQ3JCLEdBQVk7UUFFWixPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxZQUFZLElBQUksR0FBRyxJQUFJLFlBQVksSUFBSSxHQUFHLENBQUM7SUFDL0UsQ0FBQzs7QUF4SEgsdUNBeUhDO0FBeEhRLDhCQUFTLEdBQWtCLElBQUksZ0JBQW1CLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzdELDZCQUFRLEdBQWtCLElBQUksQ0FBQyJ9