is_record_start

Function is_record_start 

Source
pub fn is_record_start(line: &str) -> bool
Expand description

判断一行是否为 sqllog 的“记录起始行”。

判定规则(严格匹配当前实现):

  1. 要求时间戳严格位于行首(不允许前导空白);
  2. 行首的前 23 个字符必须正好是时间戳,格式为 YYYY-MM-DD HH:MM:SS.mmm(由 is_ts_millis 验证);
  3. 在时间戳之后必须存在一对圆括号 (...),括号内为元信息(元数据);
  4. 元信息中必须包含以下 7 个关键短语,且它们首次出现的顺序必须严格为: EP[ -> sess: -> thrd: -> user: -> trxid: -> stmt: -> appname:

输入/输出:

  • 输入:单行文本 line: &str(可以包含前导空白);
  • 输出:bool,若满足上述所有条件则返回 true,否则返回 false。

复杂度与性能:

  • 使用双数组 Aho-Corasick(daachorse)自动机一次扫描元信息(O(n + total_matches)),比多次子串查找更高效;
  • 该函数在最坏情况下仍然是线性相对输入长度的;
  • 适合在对大量日志行做快速分组时使用。

边界情况与注意事项:

  • 关键字必须出现在括号内部;若关键字在括号外出现则视为不匹配;
  • 关键字匹配是基于文本子串(大小写敏感);如果需要忽略大小写或支持更多变体,应在自动机构建时调整或归一化输入;
  • 只检查关键字的首次出现位置,以验证顺序;若关键字重复,只看第一次出现的位置;
  • 时间戳严格按字符位置校验,不尝试解析为日期/时间类型以节省分配与解析开销。