Riutilizzo del codice con estensioni

Si tratta di un argomento avanzato che presuppone che il lettore abbia una solida conoscenza di LookML.

Panoramica

Man mano che il modello LookML aumenta per dimensioni e complessità, diventa sempre più utile riutilizzarlo in più posizioni. Il parametro extends consente di riutilizzare il codice, il che ti consente di effettuare le seguenti operazioni:

  • Scrivi il codice DRY (non'non ripeterlo) per definire gli elementi in un unico posto, rendendo il codice più coerente e più veloce da modificare
  • Gestire insiemi di campi diversi per utenti diversi
  • Condividere pattern di progettazione in diverse parti del tuo progetto
  • Riutilizza insiemi di join, dimensioni o misure in un progetto

Per estendere un oggetto LookML, devi creare un nuovo oggetto LookML e poi aggiungere il parametro extends per indicare che il nuovo oggetto è un'estensione di un oggetto esistente. Di conseguenza, il progetto avrà due versioni dell'oggetto LookML. In caso di conflitti, l'oggetto che verrà esteso avrà la precedenza e avrà la precedenza sulle impostazioni dell'oggetto che viene esteso. Per informazioni dettagliate, consulta la sezione Dettagli di implementazione per extends più avanti in questa pagina.

Scopri i perfezionamenti di LookML.
L'estensione di una vista o di un'esplorazione è ideale per gli scenari in cui vuoi avere più versioni della vista o dell'esplorazione. Tuttavia, se il tuo obiettivo è semplicemente modificare una vista o un'esplorazione senza modificare il file LookML che lo contiene, puoi utilizzare un perfezionamento. Puoi anche utilizzare un parametro extends all'interno di un perfezionamento. Per ulteriori informazioni e casi d'uso, consulta la pagina della documentazione relativa ai perfezionamenti LookML.

Puoi estendere le dashboard di visualizzazioni, esplorazioni e LookML:

I modelli non possono essere estesi e non puoi includere un file modello in un altro file modello. Se vuoi riutilizzare o estendere le esplorazioni di più modelli, puoi crearne uno separato e poi includerlo in un file del modello.

Leggi i seguenti esempi di estensione di un'esplorazione ed estensione di una dashboard LookML.

Estendere un'esplorazione

Di seguito è riportato un esempio di estensione di un'area di esplorazione:

explore: customer {
  persist_for: "12 hours"
}

explore: transaction {
  extends: [customer]
  persist_for: "5 minutes"
}

In questo esempio abbiamo un'esplorazione denominata Cliente e abbiamo creato una seconda esplorazione denominata Transazione che la estende. Tutto ciò che è presente in Cliente, come i relativi join, sarà incluso in Transazione. Tutto ciò che è in Transazione rimarrà in Transazione.

Tuttavia, tieni presente che c'è un conflitto: la funzionalità Esplorazione cliente afferma che l'impostazione persist_for deve durare 12 ore, mentre la sezione Esplora transazioni afferma che il tempo previsto è di 5 minuti. Per l'esplorazione Transazione, verrà utilizzata l'impostazione persist_for: "5 minutes" perché sovrascrive l'impostazione dall'estensione di Esplora.

Estensione di una dashboard LookML

Per estendere una dashboard di LookML, sia la dashboard estesa sia quella estesa devono essere incluse nel file modello. Se una dashboard che utilizza il parametro extends è inclusa in un file modello senza che la dashboard di base si estenda, verrà visualizzato un errore di convalida LookML che non è possibile trovare nella dashboard di base (tra gli altri errori).

Ecco un file di dashboard di esempio:

File: faa.dashboard.lookml

- dashboard: faa
  title: FAA Dashboard
  layout: newspaper
  elements:
  - title: Aircraft Location
    name: Aircraft Location
    model: e_faa
    explore: aircraft
    type: looker_map
    fields:
    - aircraft.zip
    - aircraft.count
    sorts:
    - aircraft.count desc
    limit: 500
    query_timezone: America/Los_Angeles
    series_types: {}
    row: 0
    col: 0
    width: 8
    height: 6

Possiamo creare un nuovo file di dashboard LookML ed estendere la dashboard FAA aggiungendo un nuovo riquadro:

File: faa_additional.dashboard.lookml

- dashboard: faa_additional
  title: FAA Additional
  extends: faa
  elements:
  - title: Elevation Count
    name: Elevation Count
    model: e_faa
    explore: airports
    type: looker_scatter
    fields:
    - airports.elevation
    - airports.count
    sorts:
    - airports.count desc
    limit: 500
    query_timezone: America/Los_Angeles
    row: 0
    col: 8
    width: 8
    height: 6

Poiché estende la dashboard FAA, la dashboard FAA aggiuntiva includerà tutti i riquadri definiti nel file faa.dashboard.lookml. Inoltre, la dashboard FAA aggiuntiva avrà tutti i riquadri definiti nel proprio file faa_additional.dashboard.lookml.

Il modo più semplice per creare una dashboard LookML è recuperare il LookML da una dashboard definita dall'utente. Puoi inoltre utilizzare questa tecnica per ottenere il LookML per i singoli riquadri della dashboard. Se utilizzi questo metodo, assicurati che le posizioni dei riquadri non si sovrappongano. Nell'esempio precedente, i riquadri sono entrambi nella riga superiore della dashboard, indicata da row: 0:

File: faa.dashboard.lookml


    row: 0
    col: 0
    width: 8
    height: 6

Tuttavia, il nuovo riquadro che stiamo aggiungendo alla dashboard FAA aggiuntivo è in col: 8, per cui viene visualizzato accanto al riquadro della dashboard estesa:

File: faa_additional.dashboard.lookml


    row: 0
    col: 8
    width: 8
    height: 6

Si tratta di una cosa facile da perdere, poiché questi elementi si trovano in file di dashboard diversi. Quindi, se stai aggiungendo riquadri a una dashboard estesa, assicurati di verificare la presenza di conflitti di posizionamento tra i riquadri nella dashboard estesa e i riquadri della dashboard.

Richiesta dell'estensione in corso...

Puoi utilizzare il parametro extension: required per segnalare che un oggetto LookML richiede un'estensione, il che significa che l'oggetto non può essere utilizzato da solo. Un oggetto con extension: required non è visibile da solo agli utenti; è destinato esclusivamente ad agire come punto di partenza per essere esteso da un altro oggetto LookML. Il parametro extension è supportato per le esplorazioni, le visualizzazioni e le dashboard LookML.

Un explore con extension: required non può essere utilizzato come explore_source per un test dei dati. Lo strumento di convalida LookML genera un errore che indica che non è stato possibile trovare il explore_source.

Utilizzo dei metadati per visualizzare le estensioni per un oggetto

Puoi fare clic su un parametro explore o view nell'IDE di Looker e utilizzare il riquadro dei metadati per visualizzare le estensioni nell'oggetto o per vedere quale oggetto si estende. Per informazioni, consulta la pagina della documentazione Metadati per oggetti LookML.

Dettagli di implementazione per extends

Di seguito sono riportati i passaggi descritti da Looker per l'estensione di un oggetto LookML:

  1. Copia l'oggetto in fase di ampliamento: Looker crea una copia della dashboard LookML per la vista, Explore o LookML in fase di ampliamento. Questa nuova copia è l'oggetto di estensioneing.
  2. Unisci il LookML delle due copie: Looker unisce il LookML dell'oggetto estendeed nell'oggetto estendeing.
  3. Risolvere i conflitti tra le copie: nella maggior parte dei casi, se un elemento LookML viene definito sia nell'oggetto esteso ed che nell'oggettoing, viene utilizzata la versione nell'oggetto esteso. In altri casi, tuttavia, le estensioni combinano i valori dei parametri anziché eseguire l'override dei valori. Per ulteriori informazioni, consulta la sezione Combinazione di parametri in questa pagina.
  4. Applica il LookML: una volta risolti tutti i conflitti, Looker interpreta il LookML risultante utilizzando la logica standard. In altre parole, Looker utilizzerà tutte le impostazioni predefinite e le ipotesi standard come in qualsiasi altra dashboard view, Explore o LookML.

Le sezioni seguenti mostrano le specifiche di questi passaggi, estendendo l'esempio a una visualizzazione. Ecco la LookML per la nostra vista di base, la vista User:

view: user {
  suggestions: yes

  dimension: name {
    sql: ${TABLE}.name ;;

  }
  dimension: status {
    sql: ${TABLE}.status ;;
    type: number
  }
}

Ecco il LookML per la vista User with Age Extensions, che estende la visualizzazione User:

include: "/views/user.view"

view: user_with_age_extensions {
  extends: [user]
  suggestions: no

  dimension: age {
    type: number
    sql: ${TABLE}.age ;;
  }

  dimension: status {
    type: string
  }
}

Passaggio 1: copia il LookML

In questo caso, la vista user è stata estesa nella vista user_with_age_extensions. Poiché user è la vista in fase di estensione, ne viene creata una copia prima dell'unione. Il fatto che una copia sia stata creata non è particolarmente importante da sapere; il fatto che la vista originale user sia invariata e possa essere utilizzata come di consueto è importante sapere.

Passaggio 2: unisci le copie

Il passaggio successivo consiste nell'unione di tutti i LookML dalla vista estendeed (user) nell'estensioneing (user_with_age_extensions. È importante capire la natura di questa unione In pratica, significa che tutti i LookML scritti esplicitamente vengono uniti, ma i valori LookML predefiniti che non hai annotato don't vengono uniti. In un certo senso, è davvero solo il testo del LookML che viene messo insieme, e nessuno del significato di quel testo.

Passaggio 3: risolvi i conflitti

Il terzo passaggio consiste nel risolvere eventuali conflitti tra le viste unite.

Nella maggior parte dei casi, se un elemento LookML viene definito sia nell'oggetto extended e nell'oggetto ing, viene utilizzata la versione nell'oggetto che si estende. In altri casi, tuttavia, le estensioni combinano i valori dei parametri anziché eseguire l'override dei valori. Per ulteriori informazioni, consulta la sezione Combinazione di parametri in questa pagina.

Nel caso dell'esempio user_with_age_extensions, nessuno dei parametri è additivo, né vengono specificate opzioni di elenco speciali o sql parole chiave, quindi i valori dei parametri nella vista estesa sostituiranno i valori parametro nella vista estesa:

  • L'estensioneing nome visualizzazione (user_with_age_extensions) sostituisce l'estensioneed nome visualizzazione (user).
  • Il valoreing dell'estensione di suggestions: no sostituisce il valore suggestions: yes esteso .
  • L'estensioneing visualizzazione ha una dimensione denominata age, che non esiste nella vistaed di estensione (nessun conflitto).
  • L'estensioneed visualizzazione ha una dimensione denominata name, che non esiste nella vistaing di estensione (nessun conflitto).
  • Il valore status della dimensione type: string nell'estensione ing sovrascrive il valore type: number nell'estensioneed visualizzazione.
  • La dimensione status ha un parametro sql che non esiste nella vista di estensione ing (nessun conflitto).

Il fatto che i valori LookML predefiniti non siano ancora considerati importanti, perché non bisogna commettere l'errore di pensare che i conflitti tra valori predefiniti vengano risolti. In realtà, vengono ignorati in questo passaggio. Per questo motivo, dobbiamo aggiungere esplicitamente parametri aggiuntivi quando estendiamo gli oggetti:

In questo particolare esempio non abbiamo aggiunto sql_table_name alla vista Utente, causando alcuni problemi nel passaggio successivo.

Passaggio 4: interpreta il codice LookML come di consueto

Nel passaggio finale, il codice LookML risultante viene interpretato normalmente, inclusi tutti i valori predefiniti. In questo particolare esempio abbiamo ottenuto un codice LookML che include view: user_with_age_extensions, ma nessun parametro sql_table_name. Di conseguenza, Looker presumerà che il valore di sql_table_name sia uguale al nome della vista:

Il problema è che probabilmente non esiste una tabella nel nostro database chiamata user_with_age_extensions. Ecco perché dobbiamo aggiungere un parametro sql_table_name a qualsiasi vista che verrà estesa. L'aggiunta di view_name e view_label alle esplorazioni che verranno estese evita problemi simili.

Combinazione di estensioni

Esistono diversi modi per utilizzare gli oggetti LookML con le estensioni:

Per un esempio di caso d'uso avanzato e leggere suggerimenti per la risoluzione dei problemi, consulta l'articolo del Centro assistenza Risolvere un esempio di caso d'uso avanzato di extends.

Estensione di più di un oggetto contemporaneamente

È possibile estendere più di una dashboard, visualizzazione o esplorazioni contemporaneamente. Ad esempio:

explore: orders {
  extends: [user_info, marketing_info]
}
# Also works for dashboards and views

La procedura di estensione funziona esattamente come descritto nell'esempio di implementazione, ma esiste una regola aggiuntiva su come vengono risolti i conflitti. In caso di conflitti tra i diversi elementi elencati nel parametro extends, viene data la priorità agli elementi elencati per ultimi. Pertanto, nell'esempio precedente, se si sono verificati conflitti tra user_info e marketing_info, risulta utile l'esplorazione di marketing_info.

Concatenare più estensioni

Puoi anche concatenare tutte le estensioni che vuoi. Ad esempio:

explore: orders {
  extends: [user_info]
  ...
}
explore: user_info {
  extends: [marketing_info]
  ...
}

Anche in questo caso, il processo di estensione funziona esattamente come descritto nell'esempio di implementazione, con un'ulteriore regola sulla risoluzione dei conflitti. In caso di conflitti, viene data la priorità all'ultimo elemento della catena di estensioni. In questo esempio:

  • orders avrà la priorità sia su user_info che su marketing_info.
  • user_info avrà la priorità su marketing_info.

Combinazione dei parametri

Nella maggior parte dei casi, se un elemento LookML viene definito sia nell'oggetto extended e nell'oggetto ing, viene utilizzata la versione nell'oggetto che si estende. Questa situazione si verifica nell'esempio di implementazione di questa pagina.

Tuttavia, nei seguenti casi, le estensioni combineranno i valori dei parametri anziché sostituirli:

Alcuni parametri sono additivi

In molti casi, se l'oggetto estendente contiene lo stesso parametro dell'oggetto che viene esteso, i valori dell'oggetto esteso sostituiranno i valori del parametro dell'oggetto esteso. Tuttavia, le estensioni possono essere additive per alcuni parametri, il che significa che i valori dell'oggetto che estende vengono utilizzati insieme ai valori dell'oggetto esteso.

I seguenti parametri sono additivi:

Nell'esempio seguente, la vista carriers ha una dimensione name con un parametro link:

view: carriers {
  sql_table_name: flightstats.carriers ;;

  dimension: name {
    sql: ${TABLE}.name ;;
    type: string
    link: {
      label: "Google {{ value }}"
      url: "http://www.google.com/search?q={{ value }}"
      icon_url: "http://google.com/favicon.ico"
    }
  }
}

Questa è la vista carriers_extended, che estende la visualizzazione carriers. La vista carriers_extended ha anche una dimensione name con diverse impostazioni nel parametro link:


include: "/views/carriers.view.lkml"

view: carriers_extended {
  extends: [carriers]

  dimension: name {
    sql: ${TABLE}.name ;;
    type: string
    link: {
      label: "Dashboard for {{ value }}"
      url: "https://docsexamples.dev.looker.com/dashboards/307?Carrier={{ value }}"
      icon_url: "https://www.looker.com/favicon.ico"
    }
  }
}

Nella vista carriers_extended, i due parametri link sono cumulative, quindi la dimensione name avrà entrambi i link. In Esplora, la dimensione è simile a questa:

Opzioni aggiuntive con gli elenchi

Quando lavori con gli elenchi, puoi scegliere di combinarli, invece di vincere l'elenco degli oggetti estesi. Considera questa semplice estensione con un elenco in conflitto denominato animals:

view: pets {
  extends: fish
  set: animals {
    fields: [dog, cat]
  }
}
view: fish {
  set: animals {
    fields: [goldfish, guppy]
  }
}

In questo caso, la vista pets esegue l'estensione e, di conseguenza, vince, rendendo animals contenente [dog, cat]. Tuttavia, utilizzando la serie speciale EXTENDED* puoi combinare gli elenchi:

view: pets {
  extends: fish
  set: animals {
    fields: [dog, cat, EXTENDED*]
  }
}
view: fish {
  set: animals {
    fields: [goldfish, guppy]
  }
}

Ora l'elenco animals conterrà [dog, cat, goldfish, guppy].

Combinazione anziché sostituzione durante la risoluzione dei conflitti

Nella maggior parte dei casi, se ci sono conflitti durante l'estensione, vince l'oggetto che si estende. Ad esempio, prendi questa semplice estensione:

view: product_short_descriptions {
  extends: products
  dimension: description {
    sql: ${TABLE}.short_description ;;
  }
}
view: products {
  dimension: description {
    sql: ${TABLE}.full_description ;;
  }
}

Puoi notare un conflitto del parametro sql all'interno della dimensione description. In genere, la definizione di product_short_descriptions sovrascriverà semplicemente la definizione di products perché sta estendendo questa definizione.

Tuttavia, se vuoi, puoi anche scegliere di combinare le definizioni. A questo scopo, utilizza la parola chiave ${EXTENDED} nel seguente modo:

view: product_short_descriptions {
  extends: products
  dimension: description {
    sql: LEFT(${EXTENDED}, 50) ;;
  }
}
view: products {
  dimension: description {
    sql: ${TABLE}.full_description ;;
  }
}

Ora il conflitto del parametro sql verrà gestito in modo diverso. Al posto della definizione product_short_descriptions vincente, prenderà la definizione di products e la inserirà dove ${EXTENDED} viene utilizzato. La definizione risultante per description in questo caso sarà: LEFT(${TABLE}.full_description, 50).

Aspetti da considerare

Progetti con localizzazione

Quando estendi un oggetto, tieni presente che le regole di localizzazione si applicano anche alle estensioni. Se estendi un oggetto e poi definisci nuove etichette o descrizioni, devi fornire le definizioni di localizzazione nei file delle stringhe locali del progetto. Per ulteriori informazioni, consulta la pagina Localizzazione del modello LookML.