Riutilizzo del codice con extends

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

Panoramica

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

  • Scrivi codice DRY (don't repeat yourself, non ripeterti), in modo da poter definire le cose 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 parti diverse del progetto
  • Riutilizzare insiemi di unioni, dimensioni o misure in un progetto

Per estendere un oggetto LookML, crea un nuovo oggetto LookML e poi aggiungi il parametro extends per indicare che il nuovo oggetto è un'estensione di un oggetto esistente. Ciò significa che il progetto avrà due versioni dell'oggetto LookML. In caso di conflitti, l'oggetto che esegue l'estensione avrà la precedenza e sostituirà le impostazioni dell'oggetto che viene esteso. Per maggiori dettagli, consulta la sezione Dettagli sull'implementazione per extends più avanti in questa pagina.

Dai un'occhiata ai perfezionamenti di LookML:l'estensione di una visualizzazione o di un'esplorazione è ideale per gli scenari in cui vuoi avere più versioni della visualizzazione o dell'esplorazione. Tuttavia, se il tuo obiettivo è semplicemente modificare una vista o un'esplorazione senza modificare il file LookML che la contiene, ti consigliamo di 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 di LookML.

Puoi estendere le visualizzazioni, le esplorazioni e le dashboard di LookML:

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

Consulta gli esempi seguenti di estensione di un'esplorazione e di estensione di una dashboard LookML.

Estendere un'esplorazione

Ecco un esempio di estensione di un'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 è in Cliente, ad esempio le unioni, verrà incluso in Transazione. Tutto ciò che si trova in Transazione rimarrà in Transazione.

Tuttavia, tieni presente che esiste un conflitto: l'esplorazione Cliente indica che l'impostazione persist_for deve essere di 12 ore, ma l'esplorazione Transazioni indica che deve essere di 5 minuti. Per l'esplorazione Transazioni, verrà utilizzata l'impostazione persist_for: "5 minutes", perché sovrascrive l'impostazione dell'esplorazione che sta estendendo.

Estensione di una dashboard LookML

Per estendere una dashboard LookML, le dashboard estese e quelle che le estendono devono essere incluse nel file del modello. Se una dashboard che utilizza il parametro extends è inclusa in un file del modello senza la dashboard di base che espande, verrà visualizzato un errore di convalida di LookML che indica che non è possibile trovare la dashboard di base (tra gli altri errori).

Ecco un esempio di file della dashboard:

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 della dashboard di 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 Additional conterrà tutti i riquadri definiti nel proprio file faa_additional.dashboard.lookml.

Il modo più semplice per creare una dashboard LookML è ottenere il codice LookML da una dashboard definita dall'utente. Puoi utilizzare questa tecnica anche per ottenere il codice LookML per i singoli riquadri della dashboard. Se utilizzi questo metodo, assicurati che le posizioni dei riquadri non si sovrappongano. Negli esempi faa.dashboard.lookml e faa_additional.dashboard.lookml, i riquadri si trovano 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 Additional è in col: 8, quindi viene visualizzato accanto al riquadro della dashboard estesa:

File: faa_additional.dashboard.lookml


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

È facile non accorgersene, poiché questi elementi si trovano in file della dashboard diversi. Pertanto, se aggiungi riquadri a una dashboard estesa, assicurati di verificare la presenza di conflitti di posizionamento tra i riquadri della dashboard estesa e quelli della dashboard di estensione.

Richiesta di estensione

Puoi utilizzare il parametro extension: required per contrassegnare un oggetto LookML come che richiede un'estensione, il che significa che l'oggetto non può essere utilizzato da solo. Un oggetto con extension: required non è visibile agli utenti da solo; ha lo scopo di fungere da punto di partenza da estendere con un altro oggetto LookML. Il parametro extension è supportato per esplorazioni, visualizzazioni e dashboard di LookML.

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

Utilizzare i metadati per visualizzare le estensioni di un oggetto

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

Dettagli di implementazione per extends

Di seguito sono riportati i passaggi eseguiti da Looker per estendere un oggetto LookML:

  1. Copia l'oggetto da estendere: Looker crea una copia del LookML per la visualizzazione, l'esplorazione o la dashboard di LookML da estendere. Questa nuova copia è l'oggetto ing.
  2. Unisci il LookML delle due copie: Looker unisce il LookML dell'oggetto esteso all'oggetto di estensione.
  3. Risolvi i conflitti tra le copie: nella maggior parte dei casi, se un elemento LookML è definito sia nell'oggetto esteso sia nell'oggetto che estende, viene utilizzata la versione nell'oggetto che estende. Tuttavia, in altri casi, le estensioni combinano i valori dei parametri anziché sostituirli. Per 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 per qualsiasi altra visualizzazione, esplorazione o dashboard LookML.

Le sezioni seguenti mostrano le specifiche di questi passaggi, estendendo una visualizzazione come esempio. Ecco il codice LookML per la nostra visualizzazione di base, la visualizzazione Utente:

view: user {
  suggestions: yes

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

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

Ecco il codice LookML per la visualizzazione Utente con estensioni di età, che estende la visualizzazione Utente:

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 codice LookML

In questo caso, la visualizzazione user viene estesa alla visualizzazione user_with_age_extensions. Poiché user è la visualizzazione che viene estesa, ne viene creata una copia prima dell'unione. Il fatto che venga creata una copia non è particolarmente importante da sapere; è importante sapere che la visualizzazione user originale viene lasciata invariata ed è utilizzabile normalmente.

Passaggio 2: unisci le copie

Il passaggio successivo consiste nell'unire tutto il codice LookML della vista estesa (user) alla vista in espansione (user_with_age_extensions). È importante comprendere la natura di questa unione, che è semplicemente un'unione di oggetti LookML. In pratica, ciò significa che qualsiasi codice LookML scritto esplicitamente viene unito, ma i valori di LookML predefiniti che non hai scritto non vengono uniti. In un certo senso, viene assemblato solo il testo di LookML, senza tener conto del significato del testo.

Passaggio 3: risolvi i conflitti

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

Per la maggior parte, se un elemento LookML è definito sia nell'oggetto esteso sia nell'oggetto di estensione, viene utilizzata la versione nell'oggetto di estensione. Tuttavia, in altri casi, le estensioni combinano i valori dei parametri anziché sostituirli. Per informazioni, consulta la sezione Combinazione di parametri in questa pagina.

Nel caso dell'esempio user_with_age_extensions, nessuno dei parametri è additivo e non sono specificate opzioni di elenco o parole chiave sql speciali, pertanto i valori dei parametri nella visualizzazione estesa sostituiranno i valori dei parametri nella visualizzazione estesa:

  • Il nome della vista in espansione (user_with_age_extensions) sostituisce il nome della vista estesa (user).
  • Il valore di espansione per suggestions: no sostituisce il valore di espansione suggestions: yes.
  • La visualizzazione di espansione ha una dimensione denominata age, che non esiste nella visualizzazione estesa (nessun conflitto).
  • La visualizzazione estesa ha una dimensione denominata name, che non esiste nella visualizzazione di espansione (nessun conflitto).
  • Il valore type: string della dimensione status nella visualizzazione in espansione sostituisce il valore type: number nella visualizzazione espansa.
  • La dimensione status ha un parametro sql che non esiste nella visualizzazione estesa (nessun conflitto).

Il fatto che i valori LookML predefiniti non siano ancora presi in considerazione è importante, perché non devi commettere l'errore di pensare che i conflitti tra i valori predefiniti vengano risolti. In realtà, in questo passaggio vengono semplicemente ignorati. Ecco perché dobbiamo aggiungere esplicitamente parametri aggiuntivi quando estendiamo gli oggetti:

In questo esempio specifico, non abbiamo aggiunto sql_table_name alla visualizzazione Utente, il che causerà 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 esempio specifico, il codice LookML della visualizzazione risultante verrebbe interpretato nel seguente modo:

include: "/views/user.view"

view: user_with_age_extensions {
  suggestions: no

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

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

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

Tieni presente che il codice LookML risultante include view: user_with_age_extensions, ma non il 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 denominata user_with_age_extensions. Per questo motivo, dobbiamo aggiungere un parametro sql_table_name a qualsiasi visualizzazione 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 extends:

Per vedere un esempio di caso d'uso avanzato e leggere suggerimenti per la risoluzione dei problemi, consulta la pagina Best practice per la risoluzione dei problemi di un esempio di caso d'uso avanzato extends.

Estensione di più oggetti contemporaneamente

È possibile estendere più di una dashboard, vista o esplorazione 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 vari elementi elencati nel parametro extends, viene data la priorità agli elementi elencati per ultimi. Pertanto, nell'esempio precedente, se esistessero conflitti tra user_info e marketing_info, prevarrebbe l'esplorazione marketing_info.

Concatenamento di più estensioni

Puoi anche concatenare tutti gli estensioni che vuoi. Ad esempio:

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

Anche in questo caso, la procedura di estensione funziona esattamente come descritto nell'esempio di implementazione, con una regola aggiuntiva sulla risoluzione dei conflitti. In caso di conflitti, la priorità viene assegnata all'ultimo elemento della catena di estensioni. In questo esempio:

  • orders avrà la priorità su user_info e marketing_info.
  • user_info avrà la priorità su marketing_info.

Parametri combinati

Per la maggior parte, se un elemento LookML è definito sia nell'oggetto esteso sia nell'oggetto di estensione, viene utilizzata la versione nell'oggetto di estensione. È il caso dell'esempio di implementazione in 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 che estende contiene lo stesso parametro dell'oggetto esteso, i valori dell'oggetto che estende 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:

Nel seguente esempio, 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"
    }
  }
}

Ed ecco la visualizzazione carriers_extended, che estende la visualizzazione carriers. La visualizzazione carriers_extended ha anche una dimensione name con impostazioni diverse 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 visualizzazione carriers_extended, i due parametri link sono additivi, pertanto la dimensione name mostrerà entrambi i link.

Opzioni aggiuntive con gli elenchi

Quando lavori con gli elenchi, puoi scegliere di combinarli, anziché avere l'elenco dell'oggetto che si estende come vincitore. Prendi in considerazione 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 visualizzazione pets eseguirà l'estensione e vincerà, facendo in modo che animals contenga [dog, cat]. Tuttavia, utilizzando l'insieme 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 si verificano conflitti durante l'estensione, l'oggetto che esegue l'estensione ha la precedenza. 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 vedere che esiste 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é è quella che esegue l'estensione.

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à risolto in modo diverso. Invece di utilizzare la definizione di product_short_descriptions, verrà utilizzata la definizione di products e inserita dove viene utilizzato ${EXTENDED}. In questo caso, la definizione risultante per description 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 di stringhe internazionali del progetto. Per ulteriori informazioni, consulta la pagina della documentazione Localizzazione del modello LookML.