ModuForge 数据模型 (moduforge-model)
moduforge-model 是 ModuForge 生态系统的核心数据模型模块,提供了完整的文档数据结构和类型系统。该模块基于不可变数据结构设计,支持高性能的文档操作、类型验证和内容匹配。
🏗️ 架构概述
ModuForge 数据模型采用分层架构设计,每个组件都有明确的职责:
┌─────────────────────────────────────────────────────────────┐
│ Tree │
│ (文档树 + 分片存储 + 缓存优化) │
├─────────────────────────────────────────────────────────────┤
│ NodePool │
│ (节点池 + 内存管理 + 并发安全) │
├─────────────────────────────────────────────────────────────┤
│ Node │
│ (节点定义 + 属性 + 标记) │
├─────────────────────────────────────────────────────────────┤
│ Schema │
│ (模式定义 + 类型验证 + 约束检查) │
├─────────────────────────────────────────────────────────────┤
│ ContentMatch │
│ (内容匹配 + 语法解析 + 状态机) │
└─────────────────────────────────────────────────────────────┘
🧩 核心组件
1. Tree
文件: src/tree.rs
职责: 文档树管理和分片存储
- 分片存储: 基于哈希分片的高性能节点存储
- LRU 缓存: 智能的节点ID到分片索引缓存
- 并发安全: 使用不可变数据结构确保线程安全
- 批量操作: 优化的批量节点操作
核心特性:
分片优化:
2. Node
文件: src/node.rs
职责: 基础节点定义
- 不可变设计: 基于
im::Vector的不可变数据结构 - 序列化优化: 紧凑的 JSON 序列化格式
- 类型安全: 完整的类型定义和验证
节点结构:
3. NodeType
文件: src/node_type.rs
职责: 节点类型定义和验证
- 类型规范: 完整的节点类型定义
- 内容验证: 基于内容匹配规则的类型验证
- 属性约束: 属性定义和默认值管理
- 标记支持: 支持的标记类型定义
类型定义:
节点规范:
4. Schema
文件: src/schema.rs
职责: 文档模式管理
- 模式编译: 从规范定义编译为可用的模式
- 类型管理: 节点类型和标记类型的统一管理
- 缓存机制: 全局缓存支持
- 验证规则: 完整的文档结构验证
模式定义:
5. ContentMatch
文件: src/content.rs
职责: 内容匹配和语法解析
- 语法解析: 支持复杂的内容表达式语法
- 状态机: 基于 NFA/DFA 的高效匹配
- 内容验证: 实时内容结构验证
- 智能填充: 根据规则自动填充缺失内容
匹配规则:
语法支持:
*- 零个或多个+- 一个或多个?- 零个或一个|- 选择()- 分组{n,m}- 范围
6. Attrs
文件: src/attrs.rs
职责: 属性系统
- 类型安全: 类型安全的属性访问
- 不可变设计: 基于
im::HashMap的不可变属性 - 序列化优化: 高效的 JSON 序列化
- 索引支持: 支持索引访问和修改
属性定义:
使用示例:
let mut attrs = default;
attrs = json!;
attrs = json!;
// 类型安全访问
let value: String = attrs.get_value.unwrap;
7. Mark
文件: src/mark.rs
职责: 标记系统
- 格式化支持: 文本格式化和样式标记
- 属性扩展: 支持标记属性
- 类型定义: 完整的标记类型系统
标记定义:
🔧 技术栈
核心依赖
[]
# 不可变数据结构
= { = true }
# 序列化
= { = true }
= { = true }
# 并发和同步
= { = true }
= { = true }
= { = true }
# 缓存和性能
= { = true }
= "1.19"
# 异步支持
= { = true }
= { = true }
# 日志和监控
= { = true }
= { = true }
= { = true }
# 工具库
= "0.4.0"
= "1.0"
= "0.8"
= { = true }
核心技术
- 不可变数据结构: 基于 im-rs 的高性能不可变集合
- 分片存储: 智能的哈希分片存储策略
- LRU 缓存: 高效的缓存管理
- 类型系统: 完整的类型定义和验证
- 内容匹配: 基于状态机的内容验证
🚀 快速开始
基本使用
use ;
use json;
// 1. 创建节点
let attrs = from;
let node = new;
// 2. 创建文档树
let tree = new;
// 3. 添加子节点
let child_node = new;
let node_enum = NodeEnum;
tree.add?;
// 4. 查询节点
let node = tree.get_node;
let children = tree.children;
模式定义
use ;
use HashMap;
// 1. 定义节点规范
let mut nodes = new;
nodes.insert;
// 2. 定义标记规范
let mut marks = new;
marks.insert;
// 3. 创建模式规范
let schema_spec = SchemaSpec ;
// 4. 编译模式
let schema = compile?;
内容匹配
use ContentMatch;
use NodeType;
// 1. 解析内容表达式
let content_match = parse;
// 2. 验证内容
let nodes = vec!;
if let Some = content_match.match_fragment
// 3. 智能填充
if let Some = content_match.fill
属性操作
use Attrs;
use json;
// 1. 创建属性
let mut attrs = default;
attrs = json!;
attrs = json!;
// 2. 类型安全访问
let color: String = attrs.get_value.unwrap;
let size: i32 = attrs.get_value.unwrap;
// 3. 更新属性
let new_values = .into_iter.collect;
let updated_attrs = attrs.update;
📊 性能特性
分片存储优化
// 自动分片计算
let shard_index = tree.get_shard_index;
// 批量分片操作
let shard_indices = tree.get_shard_index_batch;
// 缓存管理
clear_shard_cache;
内存管理
- 不可变数据结构: 减少内存分配和复制
- 智能缓存: LRU 缓存优化访问性能
- 分片存储: 减少锁竞争和内存碎片
- 对象池: 复用昂贵的对象实例
并发安全
- 无锁设计: 基于不可变数据结构的无锁操作
- 原子操作: 支持原子性的批量操作
- 线程安全: 完整的线程安全保证
🔒 错误处理
错误类型
错误处理示例
use ;
🧪 测试
测试覆盖
# 运行所有测试
# 运行特定模块测试
# 运行性能测试
测试示例
🔧 配置选项
分片配置
// 自定义分片数量
let num_shards = max;
// 缓存大小配置
static SHARD_INDEX_CACHE: =
new;
性能调优
// 批量操作优化
let shard_indices = tree.get_shard_index_batch;
// 缓存清理
clear_shard_cache;
// 内存优化
let compact_tree = tree.compact;
📈 性能优化
内存优化
- 不可变数据结构: 减少内存分配
- 分片存储: 减少内存碎片
- 智能缓存: 优化访问模式
- 对象复用: 减少 GC 压力
并发优化
- 无锁设计: 基于不可变数据结构
- 分片隔离: 减少锁竞争
- 批量操作: 提高吞吐量
- 异步支持: 非阻塞操作
算法优化
- 哈希分片: O(1) 平均访问时间
- LRU 缓存: 优化热点数据访问
- 状态机: 高效的内容匹配
- 批量处理: 减少系统调用
📚 相关文档
🤝 贡献指南
欢迎贡献代码!请确保:
- 遵循 Rust 编码规范
- 添加适当的测试
- 更新相关文档
- 通过所有 CI 检查
- 性能测试通过
📄 许可证
本项目采用 MIT 许可证 - 详见 LICENSE 文件。