chronaxis.execution.groups
源码基线:8904c2f744951857659abd40aaa3535d57faf53c
1"""定义现役记录流一次交付的完整同刻组,不执行磁盘回放或排序。"""2from dataclasses import dataclass3from ..timebase.conversion import require_int64_ns4from .record_sample import RecordSample5from .history_records import HistorySample67@dataclass(frozen=True)8class DecodedTimeGroup:9 """保存一个session在同一整数ns的全部更新;来源和原sequence仍独立。"""1011 time_ns: int # 完整组的共同纳秒坐标。12 samples: tuple[HistorySample | RecordSample, ...] # 同组全部原观测,不套用last_by_sequence策略。1314 def __post_init__(self) -> None:15 """检查同刻、同会话和唯一原身份,不执行绑定或表达式。1617 参数: 无;读取time_ns/samples。返回: None。18 异常: TypeError/ValueError/OverflowError为结构或身份错误。19 """20 require_int64_ns(self.time_ns)21 if type(self.samples) is not tuple or not self.samples or any(type(item) not in (HistorySample,RecordSample) for item in self.samples):22 raise TypeError('完整时间组需要非空的HistorySample或RecordSample tuple')23 if any(item.time_ns != self.time_ns for item in self.samples) or len({item.source_ref.session_id for item in self.samples}) != 1:24 raise ValueError('时间组不能混用时间或session')25 # 每别名原来源/sequence定位唯一,同原行不同列仍各自保留。26 identities = {(item.source_ref, item.name, item.sequence) for item in self.samples}27 if len(identities) != len(self.samples):28 raise ValueError('完整时间组重复原观测')29