跳到主要内容

VersionedDomain

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

版本化域的完整视图:表 / 列平面(继承自 VersionedDomainView)加上实体平面

Remarks​

继承而不是并列两个接口:两者形状分叉时,把 VersionedDomain 当 VersionedDomainView 传的那一行先编译失败,而不是等到有人在 raw 判定那边照抄出第二份清单。

Extends​

Properties​

versionedTables​

readonly versionedTables: ReadonlySet<string>;

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

全部 tracked 实体的可寻址表名集合,小写、无引号、无点号 schema 限定

Remarks​

放实体名的话,UPDATE post 永远命不中 Post,整条 raw 防线静默失效。

名字来自适配器(VersionedDomainEntityInput.physicalTableNames),一张表通常有两个: 逻辑表名(post)与 SQLite 家族折叠命名空间之后的物理表名(public$post)。两个都要, 因为 6 个 v1 后端分两种物理形态——PGlite 有真 schema,表引用是 "public"."post",判定切掉 点号限定之后回到 post;另外 5 个 SQLite 家族后端没有 schema,命名空间被折进名字本身, 而那是它们唯一能用的表名。只登记逻辑名的话,raw 门禁在 5/6 的后端上整条失效:用户用后端 唯一可用的表名就能把版本化业务表写穿,捕获链一无所知,冷重放从此对不上。

登记别名而不是让判定按 $ 切一刀:_fts_public$post(rxdb-plugin-search 的影子表, spec.md 明列的域外目标)切完正好等于 post,于是一条本该放行的写开始报错。 判定那一侧继续只做集合成员判定,多一种物理形态由写表的那个适配器多报一个名字。

Inherited from​

VersionedDomainView.versionedTables

Methods​

classifyEntity()​

classifyEntity(entityName, namespace?): VersionedEntityClass;

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

这个实体进不进版本控制

Parameters​

ParameterTypeDescription
entityNamestring实体名
namespace?string已知时按身份精确匹配;省略时按裸名匹配(见 remarks)

Returns​

VersionedEntityClass

登记为 SyncType.QueryCache 时为 'untracked',其余一律 'tracked'

Remarks​

未登记的实体是 'tracked'——这是「没有第四类」的落地形态。命名空间对不上也算未登记, 不退回裸名那一条:退回去等于把 namespace 降格成提示,于是另一个命名空间下的同名实体 会继承一份与它毫无关系的归类。

裸名(挂载点 4 只有实体名,RxDBAdapter.upsertMany() 的契约里就没有命名空间)撞上多条 登记时,只有它们一致才作数;给出不同答案就回落到 'tracked'。含糊时判 untracked 会让其中那张业务表静默退出版本控制,而 tracked 是可发现、可修的那个方向。


createTransactionGuard()​

createTransactionGuard(): VersionedTransactionGuard;

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

开一个事务级的混用守卫

Returns​

VersionedTransactionGuard

与其他守卫互不影响的新实例

Remarks​

每次调用都给新实例:守卫持有的是某一个事务的已见类别,共享一个实例会让一个事务的 混用污染下一个。


hasEntity()​

hasEntity(entityName, namespace?): boolean;

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

这个库登记过这个实体吗

Parameters​

ParameterTypeDescription
entityNamestring实体名
namespace?string已知时按身份精确匹配;省略时按裸名匹配任意一条登记

Returns​

boolean

至少命中一条登记时为 true

Remarks​

与 classifyEntity 分开一个成员,是因为两者回答的不是同一个问题:归类对未登记的 实体给的是默认值('tracked'),分辨不出「登记过且是 tracked」与「压根没登记」。 而捕获那一侧恰恰要靠这个差别判系统表——域认得的名字必定是业务实体(建域时系统表已被摘出去), 于是「域里有」本身就是「它不是系统表」的证明,系统表名单只对域不认得的名字才有发言权。


isUntrackedField()​

isUntrackedField(
entityName,
field,
namespace?
): boolean;

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

这个字段的变化构不构成业务净变化

Parameters​

ParameterTypeDescription
entityNamestring实体名
fieldstring实体属性名
namespace?string已知时按身份精确匹配;省略时按裸名匹配,口径同 classifyEntity

Returns​

boolean

命中三类 untracked 中任意一类时为 true


untrackedFieldsOf()​

untrackedFieldsOf(table): ReadonlySet<string>;

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

取某张表上不构成业务净变化的列集合

Parameters​

ParameterTypeDescription
tablestring表名;大小写不敏感

Returns​

ReadonlySet<string>

该表的全域簿记字段 ∪ 它自己登记的派生索引列

Inherited from​

VersionedDomainView.untrackedFieldsOf