Il s'agit d'un sujet avancé qui suppose que le lecteur possède une bonne connaissance de LookML.
Présentation
À mesure que votre modèle LookML augmente en taille et en complexité, il devient de plus en plus utile de le réutiliser à plusieurs endroits. Le paramètre extends
vous permet de réutiliser du code, ce qui vous aide à effectuer les opérations suivantes:
- Écrivez du code DRY (don't repeat yourself, ne vous répétez pas) afin de pouvoir définir des éléments en un seul et même endroit, ce qui rend votre code plus cohérent et plus rapide à modifier.
- Gérer différents ensembles de champs pour différents utilisateurs
- Partager des modèles de conception dans différentes parties de votre projet
- Réutiliser des ensembles de jointures, de dimensions ou de mesures dans un projet
Pour étendre un objet LookML, vous devez créer un objet LookML, puis ajouter le paramètre extends
pour indiquer qu'il s'agit d'une extension d'un objet existant. Cela signifie que votre projet comportera deux versions de l'objet LookML. En cas de conflit, l'objet étendu prévaut et remplace les paramètres de l'objet étendu. Pour en savoir plus, consultez la section Détails de l'implémentation de extends
plus loin sur cette page.
Découvrez les améliorations de LookML:étendre une vue ou une exploration est idéal lorsque vous souhaitez disposer de plusieurs versions de la vue ou de l'exploration. Toutefois, si votre objectif est simplement de modifier une vue ou une exploration sans modifier le fichier LookML qui la contient, vous pouvez utiliser un affinement à la place. Vous pouvez également utiliser un paramètre
extends
dans un affinement. Pour en savoir plus et découvrir des cas d'utilisation, consultez la page de documentation Améliorations de LookML.
Vous pouvez étendre les vues, les explorations et les tableaux de bord LookML :
Les modèles ne peuvent pas être étendus, et vous ne pouvez pas inclure un fichier de modèle dans un autre fichier de modèle. Si vous souhaitez réutiliser ou étendre des explorations dans plusieurs modèles, vous pouvez créer un fichier d'exploration distinct, puis l'inclure dans un fichier de modèle.
Consultez les exemples suivants d'extension d'une exploration et d'extension d'un tableau de bord LookML.
Prolonger une exploration
Voici un exemple d'extension d'une exploration:
explore: customer {
persist_for: "12 hours"
}
explore: transaction {
extends: [customer]
persist_for: "5 minutes"
}
Dans cet exemple, nous avons une exploration appelée Client et nous avons créé une deuxième exploration appelée Transaction qui l'étend. Tout ce qui se trouve dans Client, comme ses associations, sera inclus dans Transaction. Tout ce qui se trouve dans Transaction restera dans Transaction.
Notez toutefois qu'il existe un conflit: l'exploration Client indique que le paramètre persist_for
doit être de 12 heures, tandis que l'exploration Transaction indique qu'il doit être de 5 minutes. Pour l'exploration Transaction, le paramètre persist_for: "5 minutes"
est utilisé, car il écrase le paramètre de l'exploration qu'il étend.
Étendre un tableau de bord LookML
Pour étendre un tableau de bord LookML, les tableaux de bord étendus et étendus doivent tous être inclus dans le fichier de modèle. Si un tableau de bord utilisant le paramètre extends
est inclus dans un fichier de modèle sans le tableau de bord de base qu'il étend, vous recevrez une erreur de validation LookML indiquant que le tableau de bord de base ne peut pas être trouvé (entre autres erreurs).
Voici un exemple de fichier de tableau de bord:
Fichier: 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
Nous pouvons créer un fichier de tableau de bord LookML et étendre le tableau de bord FAA en ajoutant une carte:
Fichier: 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
Étant donné qu'il étend le tableau de bord FAA, le tableau de bord FAA Additional inclut toutes les cartes définies dans le fichier faa.dashboard.lookml
. De plus, le tableau de bord FAA Additional (FAA supplémentaire) contient toutes les cartes définies dans son propre fichier faa_additional.dashboard.lookml
.
Le moyen le plus simple de créer un tableau de bord LookML consiste à extraire le code LookML d'un tableau de bord défini par l'utilisateur. Vous pouvez également utiliser cette technique pour obtenir le code LookML de chaque carte de tableau de bord. Si vous utilisez cette méthode, assurez-vous que les positions de vos cartes ne se chevauchent pas. Dans les exemples faa.dashboard.lookml
et faa_additional.dashboard.lookml
, les cartes se trouvent toutes les deux dans la première ligne du tableau de bord, ce qui est indiqué par row: 0
:
Fichier: faa.dashboard.lookml
row: 0
col: 0
width: 8
height: 6
Toutefois, la nouvelle vignette que nous ajoutons dans le tableau de bord FAA Additional se trouve dans col: 8
. Elle s'affiche donc à côté de la vignette du tableau de bord étendu:
Fichier: faa_additional.dashboard.lookml
row: 0
col: 8
width: 8
height: 6
Il est facile de passer à côté de ce point, car ces éléments se trouvent dans différents fichiers de tableau de bord. Par conséquent, si vous ajoutez des cartes à un tableau de bord étendu, vérifiez qu'il n'y a pas de conflit de positionnement entre les cartes du tableau de bord étendu et celles du tableau de bord étendu.
Demande d'extension
Vous pouvez utiliser le paramètre extension: required
pour indiquer qu'un objet LookML nécessite une extension, ce qui signifie qu'il ne peut pas être utilisé seul. Un objet avec extension: required
n'est pas visible par les utilisateurs en soi. Il ne sert qu'à servir de point de départ à un autre objet LookML. Le paramètre extension
est compatible avec les explorations, les vues et les tableaux de bord LookML.
Un explore
avec extension: required
ne peut pas être utilisé comme explore_source
pour un test de données. Le validateur LookML génère une erreur indiquant que l'explore_source
est introuvable.
Afficher les extensions d'un objet à l'aide des métadonnées
Vous pouvez cliquer sur un paramètre explore
ou view
dans l'IDE Looker, puis utiliser le panneau des métadonnées pour afficher les extensions de l'objet ou l'objet qu'il étend. Pour en savoir plus, consultez la page de documentation Métadonnées des objets LookML.
Détails d'implémentation pour extends
Voici les étapes suivies par Looker pour étendre un objet LookML:
- Copier l'objet étendu: Looker crée une copie du code LookML pour la vue, l'exploration ou le tableau de bord LookML étendu. Cette nouvelle copie est l'objet étendu.
- Fusionner le code LookML des deux copies: Looker fusionne le code LookML de l'objet étendu dans l'objet étendu.
- Résoudre les conflits entre les copies: dans la plupart des cas, si un élément LookML est défini à la fois dans l'objet étendu et dans l'objet étendu, la version de l'objet étendu est utilisée. Toutefois, dans d'autres cas, les extensions combinent les valeurs de paramètre au lieu de les remplacer. Pour en savoir plus, consultez la section Combiner des paramètres de cette page.
- Appliquer le code LookML: une fois tous les conflits résolus, Looker interprète le code LookML obtenu à l'aide de la logique standard. En d'autres termes, Looker utilisera toutes les valeurs par défaut et les hypothèses standards, comme pour toute autre vue, exploration ou tableau de bord LookML.
Les sections suivantes présentent les détails de ces étapes, en prenant l'exemple de l'extension d'une vue. Voici le code LookML de notre vue de base, la vue Utilisateur:
view: user {
suggestions: yes
dimension: name {
sql: ${TABLE}.name ;;
}
dimension: status {
sql: ${TABLE}.status ;;
type: number
}
}
Voici le code LookML de la vue Utilisateur avec extensions d'âge, qui étend la vue Utilisateur:
include: "/views/user.view"
view: user_with_age_extensions {
extends: [user]
suggestions: no
dimension: age {
type: number
sql: ${TABLE}.age ;;
}
dimension: status {
type: string
}
}
Étape 1: Copiez le code LookML
Dans ce cas, la vue user
est étendue dans la vue user_with_age_extensions
. Étant donné que user
est la vue étendue, une copie en est créée avant la fusion. Le fait qu'une copie soit créée n'est pas particulièrement important à connaître ici. En revanche, il est important de savoir que la vue user
d'origine reste inchangée et utilisable normalement.
Étape 2: Fusionner les copies
L'étape suivante consiste à fusionner tout le code LookML de la vue étendue (user
) dans la vue d'extension (user_with_age_extensions
). Il est important de comprendre la nature de cette fusion, qui n'est qu'une fusion d'objets LookML. En pratique, cela signifie que tout code LookML écrit explicitement est fusionné, mais que les valeurs LookML par défaut que vous n'avez pas écrites ne sont pas fusionnées. En un sens, c'est uniquement le texte du code LookML qui est mis en forme, et non la signification de ce texte.
Étape 3: Résoudre les conflits
La troisième étape consiste à résoudre les conflits entre les vues fusionnées.
Dans la plupart des cas, si un élément LookML est défini à la fois dans l'objet étendu et dans l'objet étendu, la version de l'objet étendu est utilisée. Toutefois, dans d'autres cas, les extensions combinent les valeurs de paramètre au lieu de les remplacer. Pour en savoir plus, consultez la section Combiner des paramètres de cette page.
Dans l'exemple user_with_age_extensions
, aucun des paramètres n'est additif, et aucune option de liste ni mot clé sql
spéciale n'est spécifiée. Par conséquent, les valeurs de paramètre dans la vue étendue remplacent les valeurs de paramètre dans la vue étendue:
- Le nom de la vue étendue (
user_with_age_extensions
) remplace le nom de la vue étendue (user
). - La valeur extending (extension) de
suggestions: no
remplace la valeur extended (étendue)suggestions: yes
. - La vue étendue comporte une dimension appelée
age
, qui n'existe pas dans la vue étendue (pas de conflit). - La vue étendue comporte une dimension appelée
name
, qui n'existe pas dans la vue étendante (pas de conflit). - La valeur
type: string
de la dimensionstatus
dans la vue étendue remplace la valeurtype: number
dans la vue étendue. - La dimension
status
comporte un paramètresql
, qui n'existe pas dans la vue étendue (pas de conflit).
Il est important de noter que les valeurs LookML par défaut ne sont pas encore prises en compte, car vous ne devez pas faire l'erreur de penser que les conflits entre les valeurs par défaut sont résolus. En réalité, ils sont simplement ignorés à ce stade. C'est pourquoi nous devons ajouter explicitement des paramètres supplémentaires lorsque nous étendons des objets:
- Lorsque vous étendez une vue, vous ajoutez les paramètres
sql_table_name
etinclude
. - Lorsque vous étendez une exploration, vous ajoutez les paramètres
view_name
etview_label
.
Dans cet exemple, nous n'avons pas ajouté sql_table_name
à la vue Utilisateur, ce qui va poser des problèmes à l'étape suivante.
Étape 4: Interprétez le code LookML comme d'habitude
À l'étape finale, le code LookML obtenu est interprété normalement, y compris toutes les valeurs par défaut. Dans cet exemple, le code LookML de la vue générée sera interprété comme suit:
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
}
}
Notez que le code LookML généré inclut view: user_with_age_extensions
, mais pas de paramètre sql_table_name
. Par conséquent, Looker supposera que la valeur de sql_table_name
est égale au nom de la vue.
Le problème est qu'il n'y a probablement pas de table appelée user_with_age_extensions
dans notre base de données. C'est pourquoi nous devons ajouter un paramètre sql_table_name
à toute vue qui sera étendue. Ajouter view_name
et view_label
aux explorations qui seront étendues permet d'éviter des problèmes similaires.
Combiner des extensions
Vous pouvez exploiter les objets LookML avec des extensions de plusieurs façons:
- Un objet peut étendre plusieurs autres objets.
- Un objet extensible peut lui-même être étendu.
- Les extensions peuvent être utilisées dans les perfectionnements (pour en savoir plus, consultez la page de documentation Perfectionnements LookML).
Pour voir un exemple de cas d'utilisation avancé et obtenir des conseils de dépannage, consultez la page Bonnes pratiques pour résoudre les problèmes d'un exemple de cas d'utilisation avancé de
extends
.
Étendre plusieurs objets en même temps
Vous pouvez étendre plusieurs tableaux de bord, vues ou explorations à la fois. Exemple :
explore: orders {
extends: [user_info, marketing_info]
}
# Also works for dashboards and views
Le processus d'extension fonctionne exactement comme décrit dans l'exemple d'implémentation, mais il existe une règle supplémentaire concernant la résolution des conflits. En cas de conflit entre les différents éléments listés dans le paramètre extends
, la priorité est donnée aux éléments listés en dernier. Par conséquent, dans l'exemple précédent, en cas de conflit entre user_info
et marketing_info
, l'exploration marketing_info
l'emporterait.
Enchaîner plusieurs extensions
Vous pouvez également enchaîner autant d'extensions que vous le souhaitez. Exemple :
explore: orders {
extends: [user_info]
...
}
explore: user_info {
extends: [marketing_info]
...
}
Encore une fois, le processus d'extension fonctionne exactement comme décrit dans l'exemple d'implémentation, avec une règle supplémentaire concernant la résolution des conflits. En cas de conflit, la priorité est donnée au dernier élément de la chaîne d'extensions. Dans cet exemple :
orders
aurait la priorité suruser_info
etmarketing_info
.user_info
a la priorité surmarketing_info
.
Combiner des paramètres
Dans la plupart des cas, si un élément LookML est défini à la fois dans l'objet étendu et dans l'objet étendu, la version de l'objet étendu est utilisée. C'était le cas dans l'exemple d'implémentation de cette page.
Toutefois, dans les cas suivants, les extensions combinent les valeurs de paramètre au lieu de les remplacer:
- Pour les paramètres additifs
- Avec le mot clé de liste
EXTENDED*
- Avec le mot clé
${EXTENDED}
pour le paramètresql
Certains paramètres sont additifs
Dans de nombreux cas, si l'objet étendu contient le même paramètre que l'objet étendu, les valeurs de l'objet étendu remplacent les valeurs de paramètre de l'objet étendu. Toutefois, les extensions peuvent être additives pour certains paramètres, ce qui signifie que les valeurs de l'objet étendu sont utilisées conjointement avec celles de l'objet étendu.
Les paramètres suivants sont additifs:
Pour les dimensions et les mesures:
Pour les paramètres:
Pour les tables dérivées:
Pour les vues:
Pour les explorations:
Dans l'exemple suivant, la vue carriers
comporte une dimension name
avec un paramètre 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"
}
}
}
Voici la vue carriers_extended
, qui étend la vue carriers
. La vue carriers_extended
comporte également une dimension name
avec différents paramètres dans le paramètre 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"
}
}
}
Dans la vue carriers_extended
, les deux paramètres link
sont additifs. La dimension name
affiche donc les deux liens.
Autres options avec les listes
Lorsque vous travaillez avec des listes, vous pouvez choisir de les combiner au lieu de laisser la liste de l'objet étendu l'emporter. Prenons l'exemple d'une extension simple avec une liste en conflit appelée animals
:
view: pets {
extends: fish
set: animals {
fields: [dog, cat]
}
}
view: fish {
set: animals {
fields: [goldfish, guppy]
}
}
Dans ce cas, la vue pets
effectue l'extension et remporte donc l'enchère, ce qui fait que animals
contient [dog, cat]
. Toutefois, en utilisant l'ensemble EXTENDED*
spécial, vous pouvez combiner les listes à la place:
view: pets {
extends: fish
set: animals {
fields: [dog, cat, EXTENDED*]
}
}
view: fish {
set: animals {
fields: [goldfish, guppy]
}
}
La liste animals
contient désormais [dog, cat, goldfish, guppy]
.
Combiner plutôt que remplacer lors de la résolution de conflits
Dans la plupart des cas, en cas de conflit lors de l'extension, l'objet étendu l'emporte. Prenons l'exemple d'une extension simple:
view: product_short_descriptions {
extends: products
dimension: description {
sql: ${TABLE}.short_description ;;
}
}
view: products {
dimension: description {
sql: ${TABLE}.full_description ;;
}
}
Vous pouvez constater qu'il existe un conflit entre le paramètre sql
et la dimension description
. En règle générale, la définition de product_short_descriptions
écrase simplement la définition de products
, car elle effectue l'extension.
Toutefois, vous pouvez également choisir de combiner les définitions si vous le souhaitez. Pour ce faire, utilisez le mot clé ${EXTENDED}
comme suit:
view: product_short_descriptions {
extends: products
dimension: description {
sql: LEFT(${EXTENDED}, 50) ;;
}
}
view: products {
dimension: description {
sql: ${TABLE}.full_description ;;
}
}
Le conflit du paramètre sql
sera désormais traité différemment. Au lieu que la définition product_short_descriptions
l'emporte, elle prendra la définition de products
et l'insérera là où ${EXTENDED}
est utilisé. La définition de description
dans ce cas sera LEFT(${TABLE}.full_description, 50)
.
Éléments à prendre en compte
Projets avec localisation
Lorsque vous étendez un objet, sachez que les règles de localisation s'appliquent également à vos extensions. Si vous étendez un objet, puis définissez de nouveaux libellés ou descriptions, vous devez fournir des définitions de localisation dans les fichiers de chaînes de paramètres régionaux de votre projet. Pour en savoir plus, consultez la page de documentation Localiser votre modèle LookML.