Looker Liquid 语法解析器

Looker 在 Looker 21.6 中推出了新的 Liquid 语法解析器。新的 Looker Liquid 语法解析器在 LookML 验证期间使用,并显示 Liquid 语法错误。此解析器旨在防止静默故障、更轻松地调试 Liquid 语法、提高用户属性引用和结果缓存的安全性,以及更有效地检测动态字段引用。由于此解析器引入了针对有效 Liquid 语法的新检查,因此您可能会看到现有 Liquid 语法的新验证消息。

对于 22.2 之前的 Looker 版本,解析器由一项称为语法容忍液旧版功能控制。这项旧版功能并不会影响解析器本身的使用,只会影响解析器提供的错误级别。启用语法容忍度旧版功能后,系统会确保所有错误都会归类为信息类。从 Looker 22.2 开始,语法容忍液体功能已被完全移除。如需了解详情,请参阅旧版功能弃用时间表

在新的 Liquid 解析器中,所有错误都会归类为警告,这可能会影响代码提交次数,具体取决于项目的代码质量配置。

Liquid 解析器目前没有在运行查询时渲染 Liquid。请在未来的版本说明中查看此更新。

解读 Liquid 语法警告

新的 Liquid 语法警告将详细列出并明确包含以下信息:

  • 有问题的输入内容,后跟液体块中输入内容的行号和索引号
  • 指向相关 LookML 视图文件和代码行的链接

请看以下错误示例:

Error parsing liquid: Liquid parse exception: parser error "extraneous input '{{' expecting {Str, '(', '[', DoubleNum, LongNum, 'capture', 'endcapture', 'comment'
'endcomment', RawStart, 'if ', 'elsif', 'endif', 'unless ', 'endunless', 'else ', 'contains', 'case', 'endcase', 'when', 'cycle', 'for', 'endfor', 'in ', 'and', 'or'
'tablerow', 'endtablerow', 'assign', 'true', 'false', Nil, 'include', 'with ', 'empty','blank', EndId, Id, RawEnd}" on line 1, index 16
view_name.view:60 (project_name:view_name)
moonrise-replaced23ac48244204484819fdf839d37823cmoonrise-replace

此错误基于维度 foo 的定义(从 LookML 文件的第 60 行开始):

moonrise-replacea61436bdc2b744c4872f314b2f90231amoonrise-replace
dimension: foo {
  type: number
  sql: ${TABLE}.bar ;;
  html:
      moonrise-replace9bad339b09c84188a3102d13582482c0moonrise-replace
      {{var}}
    ;;
}

该警告是指 {{moonrise-replace9a70c647a7b042dcabec4ee7d738584bmoonrise-replace 输入不当使用的第 1 行第 1 行的 moonrise-replace3f070a8bbb4545f68f00afeea57e01f5moonrise-replacemoonrise-replacefe1ffdb31a2c48489f286baf2e791fdcmoonrise-replacemoonrise-replace0c43d53dc9504ac0bcad762f9ea4102emoonrise-replace 标记和第 60 行第 60 行的液体块的索引。在这种情况下,Liquid 对允许的输入有相应规则,这些输入如下:

moonrise-replacee46cef9ea89947d3b66f1e48ea395620moonrise-replace
{Str ,'(' ,'[' , DoubleNum , LongNum ,'capture' ,'endcapture' ,'comment' ,'endcomment' ,RawStart ,'if' ,'elsif' ,'endif' ,'unless' ,'endunless' ,'else' ,'contains'
'case' , 'endcase' ,'when' , 'cycle' ,'for' ,'endfor' ,'in' ,'and' ,'or' ,'tablerow' ,'endtablerow' ,'assign' ,'true' ,'false' , Nil,'include' ,'with' ,'empty' ,'blank' , EndId, Id, RawEnd}.
moonrise-replace6f6905a5f36d41f7b20238a83b2a4efdmoonrise-replace

如果移除了 value 周围的 moonrise-replacec5fb981e4ff6403c93fab2cb89a4f196moonrise-replace{{...}},则应能够成功解析 Liquid。

虽然新警告遵循一定的结构模式,但具体的邮件内容会有所不同。以下是其他变体的示例,以及一些有关如何对这些变体进行问题排查的简要提示。

示例 1

警告

  Error  parsing liquid: Liquid parse exception: lexer error  \ "token recognition error at: '(token)'\" on line x, index y

使用意外令牌(例如 #)时,可能会抛出此错误:

dimension: foo {
  type: number
  sql: ${TABLE}.bar ;;
  html:
      {% assign var = #value %}
      {{var}}
    ;;
}

移除意外的令牌(在本例中为 #)应该能够解决警告问题。

示例 2

警告

Error  parsing liquid: Liquid parse exception: parser error  \ "mismatched input (input)|' expecting {TagEnd, '.', NEq, '==', '>=', '>', '<=', '<', '[', '?','contains', 'and', 'or'}\" on line x, index y

当函数与使用 if 条件中的 | 令牌链接在一起时,可能会抛出此代码:

dimension: foo {
  type: number
  sql: ${TABLE}.bar ;;
  html:
      {% dynamic if 20 |divided_by(7) |times(1.0) >= 2 %}
        hello world
      {% dynamic endif %}
    ;;
}

为函数链的输出赋值给某个变量,并在 if 条件中包含该变量后,该警告应该就会解决。

示例 3

警告

Error parsing liquid: Liquid parse exception: parser error "missing '(character)' at '%}'" on line x, index y

当缺少必要的字符(例如下面示例行中 {% assign var = (true and false %} 行中的右圆括号)时,可能会抛出此警告:

dimension: foo {
    type: number
    sql: ${TABLE}.bar ;;
    html:
        {% assign var = (true and false %}
        {{var}}
      ;;
}

添加必要的字符(在本例中为右圆括号 ))应可以消除警告。