跳到主要内容

buildVersionedDomain()

function buildVersionedDomain(entities): VersionedDomain;

Defined in: packages/rxdb-plugin-working-tree/src/working-tree/versioned-domain.ts:397

从实体登记算出版本化域

Parameters​

ParameterTypeDescription
entitiesreadonly VersionedDomainEntityInput[]全部已登记实体;不会被修改

Returns​

VersionedDomain

一份与输入顺序无关、可重复构造出逐项相等结果的域视图

Throws​

RxDBError 某条登记报不出任何物理表名时

Remarks​

纯函数:同一份输入构造两次,两份清单逐项相等,且传进来的数组与其中的对象都不被改动—— 下游判定拿到的是域的视图,域自己在构造之后也不再变。

表名在这里统一归一化成小写,于是「归一化」这件事在整条链上只有两处:域构造(对登记) 与 raw 判定(对语句)。交给六个适配器各自归一化的话,它们只需要有一份写松,整条防线就有洞。

每张 tracked 表的可寻址名字由适配器报(见 VersionedDomainEntityInput.physicalTableNames), 通常两个:逻辑名与 SQLite 家族的物理名。域不猜、判定也不猜——判定那一侧没有命名空间可比对, 只能按前缀猜,猜宽了误伤 FTS 影子表,猜窄了就是那个洞;而域这边猜出来的是第二份规则, 原件改了它不会报错,只会开始算错。

一条登记报不出任何名字时抛,见 normalizePhysicalTableNames。

登记按身份(namespace:entityName)索引,另建一份裸名索引供只有实体名的调用点用 (RxDBAdapter.upsertMany() 这一层的契约里没有命名空间)。裸名撞车时不挑一条当代表—— 挑哪条都得靠登记顺序,而顺序是 config.entities 的书写顺序,改一行无关代码就会换答案。 撞车交由判定那一侧显式按「全体一致才作数」处理。

Example​

const domain = buildVersionedDomain([
{ entityName: 'Post', namespace: 'public', physicalTableNames: ['post', 'public$post'],
syncType: SyncType.Full, derivedIndexColumns: ['title_norm'] },
{ entityName: 'ProductCache', namespace: 'public', physicalTableNames: ['productcache'],
syncType: SyncType.QueryCache }
]);

domain.classifyEntity('Post'); // 'tracked'
domain.classifyEntity('ProductCache'); // 'untracked'
domain.classifyEntity('Post', 'shop'); // 'tracked' —— 没这条登记,按默认值
domain.hasEntity('Post', 'shop'); // false —— 与上一行的区别就在这里
domain.isUntrackedField('Post', 'title_norm'); // true —— 登记过的派生列
domain.isUntrackedField('Comment', 'title_norm'); // false —— 别的表的同名列不跟着豁免