数据层Data Model¶
数据层用于保存和操作程序分析过程中产生的中间结果,为各分析阶段提供稳定的数据读写接口。该层不参与具体分析逻辑,仅负责数据的组织、访问、更新和序列化。
当前实现以表格数据为主要形式,通过对pandas.DataFrame的封装管理分析结果。
1 数据模型(util/data_model.py)¶
1-1 DataModel¶
DataModel表示一张分析结果表,内部维护一个pandas.DataFrame实例,并在其上提供针对程序分析场景的访问接口。
支持的操作包括:
- 由
DataFrame、原始数据或已有DataModel构造实例; - 按行索引、索引集合或布尔条件访问数据;
- 按列名读取或更新列数据;
- 行、列切片与数据追加;
- 分析过程中的原地修改。
为减少重复扫描,DataModel维护以下内部结构:
_schema:列名到列下标的映射;_rows:行数据的NumPy表示缓存;_column_indexer:针对特定列建立的等值索引。
当数据发生变更时,这些结构会被标记失效并按需重建。
1-2 Row¶
Row表示表中的一行数据,是对底层NumPy行数组的封装,支持以下操作:
- 通过属性名访问对应字段;
- 将行数据转换为字典形式;
- 在保持列结构不变的情况下复制行对象;
- 在分析阶段直接修改字段值。
每个Row记录其在原表中的行号,用于定位对应的语句或分析实体。
1-3 Column¶
Column继承自pandas.Series,表示单列数据视图。
除基础序列操作外,Column支持基于等值条件的快速过滤。相关索引由DataModel统一维护,在需要时构建并缓存。
2 数据访问方式¶
DataModel提供多种访问粒度,以适配不同分析阶段的使用方式:
- 行访问:通过行号或行号集合获取
Row; - 列访问:通过列名获取
Column; - 条件过滤:基于索引或布尔条件得到子表;
- 区间读取:按
stmt_id读取连续语句范围,用于语句级分析。
这些接口在语义分析、状态流构建和后续数据传播过程中被反复使用。
3 数据更新¶
数据层允许在已有结果上进行修改,包括:
- 更新单元值或整行数据;
- 批量修改列内容;
- 列重命名;
- 删除满足条件的行。
所有更新操作都会使相关缓存失效,以保证后续访问结果与实际数据一致。
4 数据持久化¶
DataModel支持将当前表以Feather格式写入文件,并在后续阶段重新加载。保存时可选择是否重置行索引,以保证序列化结果的可复现性。
该机制主要用于分析阶段之间的结果传递和离线检查中间状态。
5 总结¶
数据层围绕DataModel组织分析中间结果,通过对表格数据的封装提供行、列和区间级访问能力。该设计依赖现有数据处理库完成存储与查询,避免引入额外的数据管理组件,同时满足程序分析过程中对中间结果反复读写的需求。