Analizzatore di sintassi Liquid di Looker

Looker ha lanciato un nuovo analizzatore sintattico di sintassi Liquid in Looker 21.6. Il nuovo analizzatore sintattico di sintassi Liquid di Looker viene utilizzato durante la convalida di LookML ed espone gli errori di sintassi Liquid. Lo strumento di analisi ha lo scopo di prevenire gli errori silenziosi, semplificare molto la sintassi di debug per Liquid, migliorare la sicurezza dei riferimenti degli attributi dell'utente e della memorizzazione nella cache dei risultati, nonché rilevare più efficacemente i riferimenti ai campi dinamici. Poiché questo analizzatore sintattico introduce nuovi controlli per la sintassi Liquid valida, potresti visualizzare nuovi messaggi di convalida per la sintassi Liquid esistente.

Per le versioni di Looker precedenti alla 22.2, l'analizzatore sintattico era controllato da una funzionalità precedente chiamata Sintassi Tolerant Liquid. Questa funzionalità precedente non ha influito sull'utilizzo dell'analizzatore sintattico in sé, ma ha influito sul livello di errori esposto dall'analizzatore sintattico. Quando la funzionalità legacy Liquid tollerante per sintassi era attiva, assicurava che tutti gli errori fossero classificati come informativi. A partire dalla versione 22.2 di Looker, la funzionalità Liquid tollerante per la sintassi è stata rimossa completamente. Per maggiori dettagli, consulta il calendario del ritiro delle funzionalità precedenti.

Con il nuovo analizzatore sintattico Liquid, tutti gli errori vengono classificati come avvisi, il che può avere implicazioni per i commit di codice, a seconda della configurazione della qualità del codice del progetto.

L'analizzatore sintattico Liquid al momento non esegue il rendering di Liquid nelle query in esecuzione. Cerca questo aggiornamento nelle note di rilascio future.

Interpretare gli avvisi relativi alla sintassi Liquid

Gli avvisi di nuova sintassi Liquid sono dettagliati e includono esplicitamente le seguenti informazioni:

  • L'input problematico seguito dalla riga e dal numero di indice all'interno del blocco Liquid.
  • Un link al file e alla riga di codice LookML pertinenti.

Prendiamo l'esempio del seguente errore:

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)
sostituisci-la-luna-55d7fa73daef4327954aa7c16cbaa8dbmoonrise-replace

Questo errore si basa sulla definizione della dimensione foo, che inizia alla riga 60 del file LookML:

sostituisci-la-luna-50b06a79a0e64bcdb3717193f746793emoonrise-replace
dimension: foo {
  type: number
  sql: ${TABLE}.bar ;;
  html:
      moonrise-replace5e25f90f68924183af7030b0c7388391moonrise-replace
      {{var}}
    ;;
}

Questo avviso fa riferimento all'utilizzo dell'input {{moonrise-replace053e3030070d41048c5edec44d278a7emoonrise-replace all'interno dei tag moonrise-replaceed88040fbf9146378427b1d7bda060e8moonrise-replacemoonrise-replace108ce57045ec4dc5a1a54b0da7b11e25moonrise-replacemoonrise-replace90265a22f70548368a1f05d73ec0b80dmoonrise-replace nella riga 1 e nell'indice 16 del blocco Liquido sulla riga 60 di view_name. Liquid prevede regole per gli input consentiti in questo contesto, che vengono elencati come segue:

moonrise-replacefa595b9a09e54fcbbbbeb266afc4b99amoonrise-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-replace6de75687574d4ea4b498129ba4d517afmoonrise-replace

Se il moonrise-replace4e6d2f0655a9473382f2958e75152414moonrise-replace{{...}} attorno a value viene rimosso, il Liquido deve essere analizzato correttamente.

Anche se i nuovi avvisi seguono uno schema strutturale, ci saranno delle variazioni nelle specifiche dei messaggi. Di seguito sono riportati alcuni esempi di altre varianti, oltre ad alcuni suggerimenti avanzati per risolvere i problemi.

Esempio 1

Avviso:

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

Può essere restituito quando viene utilizzato un token imprevisto, ad esempio #:

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

La rimozione del token imprevisto, # in questo caso, dovrebbe risolvere l'avviso.

Esempio 2

Avviso:

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

Può essere generato quando le funzioni sono concatenate con il token | all'interno di una condizione condizionale if:

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

L'assegnazione dell'output della catena funzionale a una variabile e l'inclusione della variabile nella condizione condizionale if dovrebbero risolvere l'avviso.

Esempio 3

Avviso:

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

Questo avviso può essere visualizzato quando manca un carattere necessario, ad esempio la parentesi di chiusura nella riga {% assign var = (true and false %} dell'esempio seguente:

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

L'aggiunta del carattere necessario (in questo caso una parentesi di chiusura )) dovrebbe risolvere l'avviso.