Il s'agit d'un sujet avancé qui suppose que le lecteur possède une connaissance approfondie de LookML.
Présentation
À mesure que la taille et la complexité de votre modèle LookML augmentent, il devient de plus en plus utile de le réutiliser à plusieurs endroits. Le paramètre extends
vous permet de réutiliser le code, ce qui vous permet d'effectuer les opérations suivantes:
- Écrivez du code DRY (ne vous répétez pas) pour pouvoir le définir en un seul 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
afin d'indiquer que le nouvel objet est une extension d'un objet existant. Cela signifie que votre projet aura deux versions de l'objet LookML. En cas de conflit, l'objet extensible prévaut et remplace les paramètres de l'objet étendu. Pour en savoir plus, consultez la section Détails de l'implémentation pour extends
plus loin sur cette page.
Découvrez les filtres LookML.
L'extension d'une vue ou d'une exploration est idéale pour les scénarios dans lesquels vous souhaitez avoir 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 le contient, vous pouvez utiliser un filtre. Vous pouvez également utiliser un paramètreextends
dans un filtre. Pour en savoir plus et voir des cas d'utilisation, consultez la page de documentation sur les affinages 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 de fichier de modèle dans un autre fichier de modèle. Si vous souhaitez réutiliser ou étendre les explorations sur plusieurs modèles, vous pouvez créer un fichier Explorer distinct, puis inclure ce fichier Explorer dans un fichier de modèle.
Consultez les exemples suivants pour étendre une exploration et étendre un tableau de bord LookML.
Prolonger une découverte
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 Customer, et nous avons créé une deuxième exploration appelée Transaction qui l'étend. Tout ce qui se trouve dans Customer, y compris ses jointures, sera inclus dans Transaction. Tout ce qui se trouve dans Transaction restera dans Transaction.
Toutefois, il y a un conflit: dans l'onglet Explorer, l'option persist_for
indique que le paramètre persist_for
devrait être défini sur 12 heures, contre 5 minutes pour la fonctionnalité Transactions. Le paramètre persist_for: "5 minutes"
est utilisé pour l'exploration de la transaction, car il remplace le paramètre de la section "Explorer" s'étendant.
Étendre un tableau de bord LookML
Pour étendre un tableau de bord LookML, il doit ê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 obtiendrez une erreur de validation LookML indiquant que le tableau de bord de base est introuvable (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 nouvelle tuile:
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
Comme il étend le tableau de bord FAA, le tableau de bord FAA Additional inclut toutes les tuiles définies dans le fichier faa.dashboard.lookml
. En outre, le tableau de bord FAA Additional contient des tuiles définies dans son propre fichier faa_additional.dashboard.lookml
.
Le moyen le plus simple de créer un tableau de bord LookML consiste à obtenir le LookML à partir d'un tableau de bord défini par l'utilisateur. Vous pouvez également utiliser cette technique pour obtenir le LookML pour des tuiles de tableau de bord individuelles. Si vous utilisez cette méthode, assurez-vous que les positions de vos tuiles ne se chevauchent pas. Dans l'exemple ci-dessus, les tuiles se trouvent sur la première ligne du tableau de bord, comme indiqué par row: 0
:
Fichier : faa.dashboard.lookml
row: 0
col: 0
width: 8
height: 6
Toutefois, la nouvelle vignette que nous ajoutons au tableau de bord Informations supplémentaires sur la FAA se trouve dans col: 8
. Elle s'affiche donc à côté de la vignette à partir 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 ces éléments, car ils se trouvent dans des fichiers de tableau de bord différents. Par conséquent, si vous ajoutez des tuiles à un tableau de bord étendu, veillez à rechercher les conflits de positionnement entre les tuiles du tableau de bord étendu et celles du tableau de bord étendu.
Extension requise
Vous pouvez utiliser le paramètre extension: required
pour marquer un objet LookML comme nécessitant une extension, ce qui signifie que l'objet ne peut pas être utilisé seul. Un objet avec extension: required
n'est pas visible par les utilisateurs, il sert uniquement de point de départ pour être étendu par un autre objet LookML. Le paramètre extension
est compatible avec les explorations, les vues et les tableaux de bord LookML.
Impossible d'utiliser une propriété explore
avec extension: required
comme explore_source
pour un test de données. LookML Validator génère une erreur indiquant que explore_source
est introuvable.
Utiliser les métadonnées pour afficher les extensions d'un objet
Vous pouvez cliquer sur un paramètre explore
ou view
dans l'IDE Looker et utiliser le panneau des métadonnées pour afficher toutes les extensions de l'objet ou voir quel objet il s'étend. Pour en savoir plus, consultez la page Métadonnées pour les objets LookML.
Détails de l'implémentation pour extends
Voici les étapes que Looker doit suivre pour étendre un objet LookML:
- Copier l'objet qui est étendu : Looker crée une copie du LookML du tableau de bord de la vue, de l'exploration ou de LookML en cours d'extension. Cette nouvelle copie correspond à l'objet extension.
- Merge the LookML of the two copies: Looker fusionne le LookML de l'objet Extended dans l'objet extension.
- Résolvez les conflits entre les copies: Dans la plupart des cas, si un élément LookML est défini à la fois dans l'objeted et dans l'objetextension, la version de l'objet étendue est utilisée. Toutefois, dans d'autres cas, les extensions combinent les valeurs des paramètres au lieu de remplacer les valeurs. Pour en savoir plus, consultez la section Combiner les paramètres.
- Appliquer le LookML : une fois tous les conflits résolus, Looker interprète le LookML obtenu à l'aide de la logique standard. En d'autres termes, Looker utilise toutes les valeurs par défaut et hypothèses standards comme pour toute autre vue, Explorer ou LookML.
Les sections suivantes présentent les détails de ces étapes, en développant une vue à titre d'exemple. Voici le LookML pour 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 LookML de la vue User with Age Extensions, qui développe la vue 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
}
}
Étape 1: Copiez LookLook
Dans ce cas, la vue user
est étendue à la vue user_with_age_extensions
. La vue user
étant étendue, une copie de celle-ci est créée avant la fusion. Il n'est pas particulièrement important de savoir qu'une copie est effectuée. Il est important de savoir que la vue user
d'origine reste inchangée et peut être utilisée normalement.
Étape 2: Fusionner les copies
L'étape suivante consiste à fusionner l'ensemble de la vue LookML de la vue étendue ed (user
) dans la vue étendue ing (user_with_age_extensions
). Il est important de comprendre la nature de cette fusion, qui est simplement une fusion d'objets LookML. En termes pratiques, cela signifie que tout LookML écrit explicitement est fusionné, mais que les valeurs LookML par défaut que vous n'avez pas écrites ne sont pas fusionnées. D'une certaine manière, il s'agit en fait du texte du LookML qui est créé, sans aucune signification de ce texte.
Étape 3: Résolvez 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'objetd'extension et dans l'objetd'extension, la version de l'objet extensible est utilisée. Toutefois, dans d'autres cas, les extensions combinent les valeurs des paramètres au lieu de remplacer les valeurs. Pour en savoir plus, consultez la section Combiner les paramètres.
Dans le cas de l'exemple user_with_age_extensions
, aucun paramètre n'est additif, et aucune option de liste ni sql
mot clé n'est spécifiée. Par conséquent, les valeurs de paramètres dans la vue développée remplacent celles de la vue développée:
- Le nom de la vue étendue
user_with_age_extensions
remplace le nom de la vue étendue ed (user
). - La valeur d'extension pour
suggestions: no
remplace la valeur d'extensionsuggestions: yes
. - La vue étendue comporte une dimension appelée
age
, qui n'existe pas dans la vue étendue (sans conflit). - La vue étendue ed comporte une dimension appelée
name
, qui n'existe pas dans la vue étendue ing (aucun conflit). - La valeur
type: string
de la dimensionstatus
dans la vue étendueing remplace la valeurtype: number
dans la vue étendueed. - La dimension
status
comporte un paramètresql
, qui n'existe pas dans la vue étendue (sans conflit).
Le fait que les valeurs LookML par défaut ne soient pas encore prises en compte est important, car vous ne souhaitez pas commettre l'erreur de penser que les conflits entre les valeurs par défaut sont en cours de résolution. En réalité, ils sont simplement ignorés à cette étape. C'est pourquoi nous devons ajouter explicitement des paramètres supplémentaires lors de l'extension des objets:
- Lorsque nous étendons une vue, nous ajoutons les paramètres
sql_table_name
etinclude
. - Lorsque nous étendons une exploration, nous ajoutons les paramètres
view_name
etview_label
.
Dans cet exemple, nous n'avons pas ajouté sql_table_name
à la vue Utilisateur, ce qui posera quelques problèmes à l'étape suivante.
Étape 4: Interprétez le lookML comme d'habitude
À la dernière étape, le LookML obtenu est interprété comme normal, y compris toutes les valeurs par défaut. Dans cet exemple particulier, nous avons obtenu LookML qui inclut view: user_with_age_extensions
, mais pas de paramètre sql_table_name
. Par conséquent, Looker suppose que la valeur de sql_table_name
est égale au nom de la vue:
Le problème est qu'il n'existe probablement aucune 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
à toutes les vues qui vont être étendues. Ajouter des view_name
et des view_label
à des explorations qui seront prolongées évite des problèmes similaires.
Combiner les extensions
Il existe plusieurs façons d'exploiter les objets LookML avec des extensions:
- Un objet peut étendre plusieurs autres objets.
- Un objet extensible peut être lui-même étendu.
- Les extensions peuvent être utilisées dans les filtres (pour en savoir plus, consultez la page de documentation sur les filtres LookML).
Pour voir un exemple de cas d'utilisation avancé et lire les conseils de dépannage, consultez l'article Résoudre les problèmes liés à un cas d'utilisation avancé de
extends
dans le centre d'aide.
Extension de plusieurs objets en même temps
Il est possible d'étendre plusieurs tableaux de bord, vues ou explorations en même temps. Exemple :
explore: orders {
extends: [user_info, marketing_info]
}
# Also works for dashboards and views
Le processus des extensions fonctionne exactement comme indiqué dans l'exemple de mise en œuvre, mais il existe une règle supplémentaire pour résoudre les 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 répertoriés en dernier. Ainsi, dans l'exemple ci-dessus, en cas de conflit entre user_info
et marketing_info
, l'exploration marketing_info
prévaut.
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]
...
}
Là encore, le processus d'extension fonctionne exactement comme décrit dans l'exemple de mise en œuvre, avec une règle supplémentaire de 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
aura priorité suruser_info
etmarketing_info
.user_info
aura priorité surmarketing_info
.
Combiner des paramètres
Dans la plupart des cas, si un élément LookML est défini à la fois dans l'objetd'extension et dans l'objetd'extension, la version de l'objet extensible est utilisée. C'est le cas de l'exemple de mise en œuvre présenté sur cette page.
Toutefois, dans les cas suivants, les extensions combinent les valeurs des paramètres au lieu de les remplacer:
- Pour les paramètres additifs
- Avec le mot clé de la liste
EXTENDED*
- Avec le mot clé
${EXTENDED}
pour le paramètresql
Certains paramètres sont cumulatifs
Dans de nombreux cas, si l'objet extensible contient le même paramètre que celui qui est étendu, les valeurs de l'objet étendu remplacent celles de l'objet étendu. Toutefois, les extensions peuvent être additionnelles pour certains paramètres, ce qui signifie que les valeurs de l'objet extensible sont utilisées avec les valeurs de l'objet étendu.
Les paramètres suivants sont additionnels:
Pour les dimensions et les mesures:
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 des paramètres différents 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
s'ajoutent les uns aux autres. Par conséquent, la dimension name
comporte les deux liens. La dimension se présente comme suit dans une exploration:
Options supplémentaires avec listes
Lorsque vous travaillez avec des listes, vous pouvez choisir de les combiner plutôt que de laisser la liste des objets étendues gagner. Prenons l'exemple de cette 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 va donc remporter, ce qui fait que animals
contient [dog, cat]
. Toutefois, en utilisant l'ensemble spécial EXTENDED*
, 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 maintenant [dog, cat, goldfish, guppy]
.
Combiner au lieu de remplacer lors de la résolution de conflit
Dans la plupart des cas, en cas de conflit d'extension, l'objet étendu l'emporte. Prenons l'exemple de cette extension simple:
view: product_short_descriptions {
extends: products
dimension: description {
sql: ${TABLE}.short_description ;;
}
}
view: products {
dimension: description {
sql: ${TABLE}.full_description ;;
}
}
Vous constatez qu'il y a un conflit entre le paramètre sql
et la dimension description
. En règle générale, la définition de product_short_descriptions
remplace simplement la définition de products
, car elle effectue l'extension.
Toutefois, vous pouvez également 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
est désormais résolu différemment. Au lieu de la définition product_short_descriptions
qui l'emporte, elle utilise la définition de products
et l'insère là où ${EXTENDED}
est utilisé. La définition de description
dans ce cas est la suivante : LEFT(${TABLE}.full_description, 50)
.
Éléments à prendre en compte
Projets avec localisation
Lorsque vous développez un objet, sachez que les règles de localisation s'appliquent également à vos extensions. Si vous développez 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 Localiser votre modèle LookML.