校验树
FlexTree是基于左右值算法的树结构,其树结构的完整性严格依赖于数据库中每一个节点的leftValue和rightValue值的正确性。
但是如果因为一些异常错误操作导致了树结构的leftValue和rightValue值不正确,那么将导致树结构被破坏。
FlexTreeManager提供了verify校验方法来检查树结构的完整性。
ts
import type { FlexTreeOptions, IFlexTreeNode } from 'flextree'
import { FlexTreeManager,FlexTree, FlexTreeVerifyError } from 'flextree'
import SqliteAdapter from 'flextree-sqlite-adapter'
const sqliteDriver = new SqliteAdapter()
await sqliteDriver.open()
const tree = new FlexTree('tree', {
adapter: sqliteDriver,
})
await tree.load()
// 校验树结构是否正确
tree.verify() // true/false说明
verify方法会检查树结构的完整性,如果树结构完整则返回true,否则返回false。- 如果树结构不完整,将抛出
FlexTreeVerifyError异常,异常中包含了校验失败的节点信息。 verify方法不会对树结构进行修复,只是检查树结构的完整性。
校验机制
verify基于纯SQL实现校验,无需将所有节点加载到内存,适合大规模树的校验。其内部依次执行以下检查,任一不通过即抛出FlexTreeVerifyError:
| 检查项 | 说明 |
|---|---|
| 节点总数 | 根节点rightValue / 2应等于树的实际节点总数 |
| 值完整性 | 所有leftValue/rightValue的并集恰好为{1, 2, ..., 2n},无缺失值 |
| 基本关系 | 每个节点的rightValue必须大于leftValue |
| 唯一性 | leftValue与rightValue各自不出现重复值 |
| 层级关系 | 根节点level为0,且任意父子节点的level差值必须为1 |
提示
如果verify校验失败,说明树结构已被破坏,可以使用修复功能重建树结构。