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
| Parameter | Type | Description |
|---|---|---|
entityName | string | 实体名 |
namespace? | string | 已知时按身份精确匹配;省略时按裸名匹配(见 remarks) |
Returns
登记为 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
与其他守卫互不影响的新实例
Remarks
每次调用都给新实例:守卫持有的是某一个事务的已见类别,共享一个实例会让一个事务的 混用污染下一个。
hasEntity()
hasEntity(entityName, namespace?): boolean;
Defined in: packages/rxdb-plugin-working-tree/src/working-tree/versioned-domain.ts:180
这个库登记过这个实体吗
Parameters
| Parameter | Type | Description |
|---|---|---|
entityName | string | 实体名 |
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
| Parameter | Type | Description |
|---|---|---|
entityName | string | 实体名 |
field | string | 实体属性名 |
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
| Parameter | Type | Description |
|---|---|---|
table | string | 表名;大小写不敏感 |
Returns
ReadonlySet<string>
该表的全域簿记字段 ∪ 它自己登记的派生索引列