Analyseur de syntaxe Looker Liquid

Looker a lancé un nouvel analyseur de syntaxe Liquid dans Looker 21.6. Le nouvel analyseur de syntaxe Liquid de Looker est utilisé lors de la validation LookML et expose les erreurs de syntaxe Liquid. Cet analyseur vise à éviter les défaillances silencieuses, à faciliter le débogage de la syntaxe Liquid, à améliorer la sécurité des références d'attributs utilisateur et à la mise en cache des résultats, et à détecter plus efficacement les références de champs dynamiques. Étant donné que cet analyseur introduit de nouvelles vérifications de la syntaxe Liquid valide, vous pouvez voir de nouveaux messages de validation pour la syntaxe Liquid existante.

Pour les versions de Looker antérieures à la version 22.2, l'analyseur était contrôlé par une ancienne fonctionnalité appelée liquide de tolérance à la syntaxe. Cette ancienne fonctionnalité n'a pas affecté l'utilisation de l'analyseur lui-même, mais a affecté le niveau d'erreurs exposé par l'analyseur. Le fait que l'ancienne fonctionnalité Syntaxe Tolerant Liquid ait été activée a permis de s'assurer que toutes les erreurs étaient classées comme étant informatives. Depuis la version 22.2 de Looker, la fonctionnalité de liquide de tolérance à la syntaxe a été entièrement supprimée. Pour en savoir plus, consultez le planning d'abandon des anciennes fonctionnalités.

Avec le nouvel analyseur Liquid, toutes les erreurs sont classées comme des avertissements, ce qui peut avoir des conséquences pour les commits de code, en fonction de la configuration de la qualité du code du projet.

L'analyseur Liquid n'affiche actuellement pas de liquide dans les requêtes en cours d'exécution. Cette mise à jour sera disponible dans les prochaines notes de version.

Interpréter les avertissements de syntaxe Liquid

Les nouveaux avertissements de syntaxe Liquid sont détaillés et incluent explicitement les informations suivantes:

  • Entrée problématique suivie de la ligne et du numéro d'index de l'entrée dans le bloc Liquid
  • Lien vers le fichier de vue LookML et la ligne de code pertinents

Prenons l'exemple de l'erreur suivante:

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

Cette erreur est basée sur la définition de la dimension foo, qui commence à la ligne 60 du fichier LookML:

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

Cet avertissement fait référence à l'utilisation inappropriée de l'entrée {{moonrise-replacebb9017a170b34b48bf8399e347693572moonrise-replace dans les balises moonrise-replacebc8dd310f8c04f02be80f093b40b1beamoonrise-replacemoonrise-replace96bd8bf0d0cb41758ae2eab2b677a41dmoonrise-replacemoonrise-replace263a5b794f2242f5b6f2153543391169moonrise-replace à la ligne 1 et à l'index 16 du bloc Liquid à la ligne 60 de view_name. Liquid dispose de règles pour les entrées autorisées dans ce contexte. Ces entrées sont répertoriées comme suit:

moonrise-replace4c97cbb346ca4a328ac7f96e69460874moonrise-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-replace65737ef89e924789b39864dd6d310212moonrise-replace

Si l'élément moonrise-replace148304bab59942f091e3138b902d032fmoonrise-replace{{...}} autour de value est supprimé, le liquide doit être analysé correctement.

Bien que les nouveaux avertissements suivent une structure, les messages ne seront pas les mêmes. Vous trouverez ci-dessous des exemples de variantes, ainsi que des indications générales pour les résoudre.

Exemple 1

Avertissement :

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

Cette erreur peut être levée lorsqu'un jeton inattendu, tel que #, est utilisé:

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

La suppression du jeton inattendu # dans ce cas devrait résoudre l'avertissement.

Exemple 2

Avertissement :

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

Cette erreur peut être levée lorsque des fonctions sont enchaînées avec le jeton | dans une condition if:

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

Le fait d'attribuer la sortie de la chaîne de fonctions à une variable et d'inclure cette variable dans la condition if devrait résoudre l'avertissement.

Exemple 3

Avertissement :

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

Cet avertissement peut être envoyé s'il manque un caractère nécessaire, tel que la parenthèse fermante à la ligne {% assign var = (true and false %} dans l'exemple suivant:

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

L'ajout du caractère nécessaire, une parenthèse fermante ) dans ce cas, devrait permettre de résoudre l'avertissement.