Analizador de sintaxis de Looker Liquid

Looker lanzó un nuevo analizador de sintaxis líquida en Looker 21.6. El nuevo analizador de sintaxis de Looker para líquidos se usa durante la validación de LookML y expone los errores de sintaxis de Liquid. Este analizador está diseñado para prevenir fallas silenciosas, facilitar la depuración de la sintaxis líquida, mejorar la seguridad de las referencias de atributos de usuario y el almacenamiento en caché de los resultados, y detectar referencias de campos dinámicos con mayor eficacia. Debido a que este analizador presenta nuevas comprobaciones de la sintaxis de Liquid válida, es posible que veas mensajes de validación nuevos para la sintaxis de Liquid existente.

En las versiones de Looker anteriores a la 22.2, el analizador era controlado por una función heredada llamada líquido tolerante a la sintaxis. Esta función heredada no afectó el uso del analizador en sí, sino que afectó el nivel de errores que expuso el analizador. Cuando se activó la función heredada Líquido tolerante a la sintaxis, se garantizó que todos los errores se clasificaran como informativos. A partir de Looker 22.2, se quitó por completo la función Líquido tolerante a la sintaxis. Consulte el programa de baja de funciones heredadas para obtener más detalles.

Con el nuevo analizador de líquidos, todos los errores se categorizan como advertencias, lo que puede tener implicaciones para las confirmaciones de código, según la configuración de Calidad de código del proyecto.

En este momento, el analizador de líquidos no procesa Liquid en consultas en ejecución. Busca esta actualización en futuras notas de la versión.

Interpretación de advertencias de sintaxis líquida

Las nuevas advertencias de sintaxis líquida son detalladas y contienen la siguiente información:

  • Entrada problemática seguida de la línea y el número de índice de la entrada dentro del bloque Líquido
  • Un vínculo a la línea de código y al archivo de vista de LookML relevantes

Toma el ejemplo del siguiente error:

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-replace1d6a36b47897482ca5ea17bacc87e140moonrise-replace

Este error se basa en la definición de la dimensión foo, que comienza en la línea 60 del archivo LookML:

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

Esta advertencia hace referencia a que la entrada {{moonrise-replace25d4266775ef4c6784d1bf2d2a64cba4moonrise-replace se usa de forma inapropiada en las etiquetas moonrise-replace6745250539e645959c9647cbb981079amoonrise-replacemoonrise-replacee028585c85604178970b80489d65f9damoonrise-replacemoonrise-replace537e24128e9a4b479ba699a26d39fc0bmoonrise-replace de la línea 1 y en el índice 16 del bloque Líquido en la línea 60 de view_name. El líquido tiene reglas para las entradas permitidas en este contexto, y esas entradas se enumeran de la siguiente manera:

moonrise-replace74d7c2e24820402b8fe1b451d1be2623moonrise-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-replace1b8d75532df542cfb83998027ae2f39dmoonrise-replace.

Si se quita el moonrise-replace861d52b3e37b49a6930bdcb5d0bbcd13moonrise-replace{{...}} alrededor de value, se debe analizar el líquido correctamente.

Aunque las nuevas advertencias siguen un patrón estructural, habrá variaciones en los mensajes específicos. A continuación, se muestran ejemplos de otras variaciones, así como algunas sugerencias de alto nivel para solucionar problemas.

Ejemplo 1

Advertencia:

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

Se puede mostrar cuando se usa un token inesperado, como #:

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

Si quitas el token inesperado, #, en este caso, debería resolver la advertencia.

Ejemplo 2

Advertencia:

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

Esto se puede arrojar cuando las funciones se encadenan junto con el token | dentro de un condicional if:

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

Asignar la salida de la cadena de funciones a una variable e incluirla en el condicional if debería resolver la advertencia.

Ejemplo 3

Advertencia:

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

Esta advertencia se puede mostrar cuando falta un carácter necesario, como el paréntesis de cierre en la línea {% assign var = (true and false %} del siguiente ejemplo:

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

Agregar el carácter necesario, un paréntesis de cierre ) en este caso, debería resolver la advertencia.