Looker Liquid 구문 파서

Looker 21.6에서 새로운 Liquid 구문 파서가 출시되었습니다. 새로운 Looker Liquid 구문 파서가 LookML 검증 중에 사용되며 Liquid 구문 오류를 노출합니다. 이 파서는 자동 실패를 방지하고, Liquid 문법을 훨씬 더 쉽게 디버깅하고, 사용자 속성 참조와 결과 캐싱의 보안을 개선하고, 동적 필드 참조를 보다 효과적으로 감지하기 위한 것입니다. 이 파서는 유효한 Liquid 구문에 대한 새로운 검사를 도입하므로 기존 Liquid 구문에 대한 새로운 유효성 검사 메시지가 표시될 수 있습니다.

22.2 이전의 Looker 버전의 경우 파서가 구문 허용 액체라는 기존 기능에 의해 제어되었습니다. 이 기존 기능은 파서 자체의 사용에는 영향을 미치지 않았으며, 대신 파서가 표시하는 오류 수준에 영향을 미쳤습니다. 구문 내결함성의 레거시 기능을 사용 설정한 경우 모든 오류가 정보성으로 분류되었습니다. Looker 22.2부터 구문 내결함성 기능이 완전히 삭제되었습니다. 자세한 내용은 기존 기능 지원 중단 일정을 참고하세요.

새로운 Liquid 파서는 모든 오류가 경고로 분류되며, 프로젝트의 Code Quality 구성에 따라 코드 커밋에 영향을 미칠 수 있습니다.

Liquid 파서는 현재 쿼리를 실행할 때 Liquid를 렌더링하지 않습니다. 향후 출시 노트에서 이 업데이트를 찾아보세요.

액체 구문 경고 해석

새 유동 구문 경고는 장황하며 다음 정보를 명시적으로 포함합니다.

  • 문제가 있는 입력 다음에 Lquid 블록 내 입력의 행 및 색인 번호 입력
  • 관련 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-replace64e0256d4f034cc88f4430f8e7715295moonrise-replace

이 오류는 LookML 파일의 60번째 줄에서 시작되는 측정기준 foo의 정의에 기반합니다.

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

이 경고는 {{moonrise-replace701a3c7a5e2b4d4da484d48b12bfe6d5moonrise-replace 입력이 1번 줄의 moonrise-replace0a281c3c4daf4a71bd45b4c5efbcdfe5moonrise-replacemoonrise-replace959545a5d3704c98b6fb81b179ea9a9emoonrise-replacemoonrise-replace75b0fe5e72f84b8185daac6cda355e36moonrise-replace 태그 내와 view_name의 60번 줄에서 Liquid 블록의 색인 16에 부적절하게 사용되고 있음을 나타냅니다. Liquid에는 이러한 맥락에서 허용되는 입력이 있으며, 이러한 입력은 다음과 같습니다.

moonrise-replace3f876285ccfe4ebf9d65939c09a39184moonrise-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-replace9e5942dc6c01473aa053082e437a6df1moonrise-replace

value 주변의 moonrise-replaceb9b18f8ced6a447ab2e12268bcc7fbc7moonrise-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}}
      ;;
}

필요한 문자(이 경우 닫는 괄호 ))를 추가하여 경고를 해결해야 합니다.