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)
此错误基于维度 foo
的定义(从 LookML 文件的第 60 行开始):
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 对允许的输入有相应规则,这些输入如下:
{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}.
如果移除了 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}} ;; }
添加必要的字符(在本例中为右圆括号 )
)应可以消除警告。