Skip to content

数据层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组织分析中间结果,通过对表格数据的封装提供行、列和区间级访问能力。该设计依赖现有数据处理库完成存储与查询,避免引入额外的数据管理组件,同时满足程序分析过程中对中间结果反复读写的需求。