Syntax-Parser für Looker Liquid

Looker hat in Looker 21.6 einen neuen Liquid-Syntax-Parser eingeführt. Der neue Syntax-Parser von Looker Liquid wird während der LookML-Validierung verwendet und gibt Liquid-Syntaxfehler zurück. Mit diesem Parser lassen sich stille Fehler verhindern, die Fehlerbehebung bei Liquid-Syntax wird wesentlich einfacher, die Sicherheit von Nutzerattribut-Referenzen und das Caching von Ergebnissen wird verbessert und dynamische Feldverweise werden effektiver erkannt. Da dieser Parser neue Prüfungen auf gültige Liquid-Syntax einführt, sehen Sie möglicherweise neue Validierungsmeldungen für vorhandene Liquid-Syntax.

Bei Looker-Versionen vor 22.2 wurde der Parser durch eine alte Funktion namens Syntax Tolerant Liquid gesteuert. Diese Legacy-Funktion hat sich nicht auf die Verwendung des Parsers selbst ausgewirkt, hat aber stattdessen die Ebene der Fehler beeinflusst, die der Parser bekannt gemacht hat. Wenn die Legacy-Funktion Syntax Tolerant Liquid aktiviert wurde, wurden alle Fehler als Information kategorisiert. Mit Looker 22.2 wurde die Funktion Syntax Tolerant Liquid vollständig entfernt. Weitere Informationen finden Sie im Zeitplan für die Einstellung von alten Funktionen.

Mit dem neuen Liquid-Parser werden alle Fehler als Warnungen kategorisiert. Dies kann abhängig von der Codequalität des Projekts Auswirkungen auf Code-Commits haben.

Der Liquid-Parser rendert Liquid derzeit nicht in laufenden Abfragen. Dieses Update wird in den Versionshinweisen veröffentlicht.

Warnungen zur Flüssigkeitssyntax interpretieren

Neue Warnungen zur Flüssigkeitssyntax sind ausführlich und enthalten explizit die folgenden Informationen:

  • Die problematische Eingabe gefolgt von der Zeilen- und Indexnummer der Eingabe innerhalb des Liquid-Blocks.
  • Ein Link zur relevanten Datei und der Codezeile für die LookML-Ansicht

Hier ein Beispiel für den folgenden Fehler:

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

Dieser Fehler basiert auf der Definition der Dimension foo, die in Zeile 60 der LookML-Datei beginnt:

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

Diese Warnung bezieht sich auf die Verwendung der {{moonrise-replace3df17c7267504b3dbabab84abbc81ff0moonrise-replace-Eingabe, die innerhalb der moonrise-replaceecea8da5b08045368c863da5bdd0c20fmoonrise-replacemoonrise-replace557f18f7f64c4e9b851c8409f766b743moonrise-replacemoonrise-replacea53ab597339a4a8c81b0c7ea95607b59moonrise-replace-Tags in Zeile 1 und bei Index 16 der Liquid-Blockierung in Zeile 60 von view_name auf unangemessene Weise verwendet wird. In Liquid gibt es Regeln für zulässige Eingaben in diesem Kontext. Diese sind so aufgeführt:

moonrise-replace0e52ca973f3f4062b59d5c8465228e6amoonrise-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-replaceeb9fc9895e644360b0c4a9d4637c884bmoonrise-replace

Wenn der moonrise-replace0583b1e117604efb9cb91e8b8daac866moonrise-replace{{...}} um value entfernt wird, sollte die Flüssigkeit erfolgreich geparst werden.

Obwohl die neuen Warnungen einem strukturellen Muster folgen, gibt es Unterschiede bei den nachrichtenspezifischen Details. Im Folgenden finden Sie Beispiele für andere Varianten sowie allgemeine Hinweise zur Fehlerbehebung.

Beispiel 1

Warnung:

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

Dieser kann ausgegeben werden, wenn ein unerwartetes Token wie # verwendet wird:

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

Durch Entfernen des unerwarteten Tokens (in diesem Fall #) sollte die Warnung behoben werden.

Beispiel 2

Warnung:

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

Dieser kann ausgegeben werden, wenn Funktionen mit dem Token | innerhalb einer Bedingung vom Typ if verkettet sind:

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

Wenn Sie die Ausgabe der Funktionskette einer Variablen zuweisen und die Variable in die Bedingung if einschließen möchten, sollte die Warnung behoben werden.

Beispiel 3

Warnung:

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

Diese Warnung kann ausgegeben werden, wenn ein erforderliches Zeichen fehlt, wie im folgenden Beispiel die schließende Klammer {% assign var = (true and false %}:

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

Durch Hinzufügen des erforderlichen Zeichens und einer schließenden Klammer ) sollte die Warnung behoben werden.