oak-domain/lib/store/relation.js

75 lines
2.6 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.judgeRelation = void 0;
const tslib_1 = require("tslib");
const assert_1 = tslib_1.__importDefault(require("assert"));
const Demand_1 = require("../types/Demand");
const Entity_1 = require("../types/Entity");
/**
* 判断对象和属性之间的关系
* @param schema
* @param entity
* @param attr
* @param row
* @returns
*/
function judgeRelation(schema, entity, attr, allowUnrecognized) {
const { [entity]: { attributes } } = schema;
if (attr.startsWith(Demand_1.EXPRESSION_PREFIX) || attr.startsWith('#')) {
// 表达式属性或者metadata
return 0;
}
if (attributes.hasOwnProperty(attr) || Entity_1.initinctiveAttributes.includes(attr)) {
// 原生属性
return 1;
}
if (attr.includes('$')) {
const firstDelimiter = attr.indexOf('$');
const entity2 = attr.slice(0, firstDelimiter);
(0, assert_1.default)(schema.hasOwnProperty(entity2));
const secondDelimiter = attr.indexOf('$', firstDelimiter + 1);
const foreignKey = attr.slice(firstDelimiter + 1, secondDelimiter > 0 ? secondDelimiter : attr.length);
const { [entity2]: { attributes: attributes2 } } = schema;
if (foreignKey === 'entity') {
// 基于反指对象的反向关联
return [entity2];
}
else if (attributes2.hasOwnProperty(`${foreignKey}Id`)
&& attributes2[`${foreignKey}Id`].type === 'ref'
&& attributes2[`${foreignKey}Id`].ref === entity) {
// 基于外键的反向关联
return [entity2, `${foreignKey}Id`];
}
else {
// 这种情况应该不会跑到
(0, assert_1.default)(false, `非法的属性名:[${attr}]`);
}
}
else if ((attributes.hasOwnProperty(`${attr}Id`))) {
const { type, ref } = attributes[`${attr}Id`];
if (type === 'ref') {
return ref;
}
return 1;
}
else if (attributes.hasOwnProperty('entity')
&& attributes.hasOwnProperty('entityId')
&& schema.hasOwnProperty(attr)) {
(0, assert_1.default)(attributes.entity.ref.includes(attr), '不应当出现的case');
// 反向指针的外键
return 2;
}
else {
if (Entity_1.initinctiveAttributes.includes(attr)) {
return 1;
}
else if (allowUnrecognized) {
return -1;
}
else {
throw new Error(`${entity}对象中的${attr}属性找不到`);
}
}
}
exports.judgeRelation = judgeRelation;