pub fn is_record_start(line: &str) -> boolExpand description
判断一行是否为 sqllog 的“记录起始行”。
判定规则(严格匹配当前实现):
- 要求时间戳严格位于行首(不允许前导空白);
- 行首的前 23 个字符必须正好是时间戳,格式为
YYYY-MM-DD HH:MM:SS.mmm(由is_ts_millis验证); - 在时间戳之后必须存在一对圆括号
(...),括号内为元信息(元数据); - 元信息中必须包含以下 7 个关键短语,且它们首次出现的顺序必须严格为: EP[ -> sess: -> thrd: -> user: -> trxid: -> stmt: -> appname:
输入/输出:
- 输入:单行文本
line: &str(可以包含前导空白); - 输出:bool,若满足上述所有条件则返回 true,否则返回 false。
复杂度与性能:
- 使用双数组 Aho-Corasick(daachorse)自动机一次扫描元信息(O(n + total_matches)),比多次子串查找更高效;
- 该函数在最坏情况下仍然是线性相对输入长度的;
- 适合在对大量日志行做快速分组时使用。
边界情况与注意事项:
- 关键字必须出现在括号内部;若关键字在括号外出现则视为不匹配;
- 关键字匹配是基于文本子串(大小写敏感);如果需要忽略大小写或支持更多变体,应在自动机构建时调整或归一化输入;
- 只检查关键字的首次出现位置,以验证顺序;若关键字重复,只看第一次出现的位置;
- 时间戳严格按字符位置校验,不尝试解析为日期/时间类型以节省分配与解析开销。