@forestadmin/datasource-toolkit
Version:
92 lines • 9.54 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9pbnRlcmZhY2VzL3F1ZXJ5L2NvbmRpdGlvbi10cmVlL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSw0REFBaUU7QUFDakUsd0RBQTZDO0FBRTdDLG1FQUFnRDtBQUNoRCxtRUFBZ0Q7QUFRaEQsTUFBcUIsb0JBQW9CO0lBSXZDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBd0IsRUFBRSxPQUFxQjtRQUNqRSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFbkUsT0FBTyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQXdCLEVBQUUsR0FBa0I7UUFDMUQsTUFBTSxlQUFlLEdBQUcsZ0JBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFM0QsSUFBSSxlQUFlLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7U0FDbEU7UUFFRCxLQUFLLE1BQU0sSUFBSSxJQUFJLGVBQWUsRUFBRTtZQUNsQyxNQUFNLFNBQVMsR0FBRyxnQkFBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsZUFBZSxDQUFDO1lBRXRFLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksMkNBQTJDLENBQUMsQ0FBQzthQUM1RTtT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
;