Este é um tópico avançado que pressupõe que o leitor tem um sólido conhecimento de LookML.
Informações gerais
À medida que o modelo do LookML se expande em tamanho e complexidade, é cada vez mais útil reutilizá-lo em vários lugares. O parâmetro extends
permite reutilizar o código, o que ajuda a fazer o seguinte:
- Escreva o código DRY (não se repita) para que você possa definir as coisas em apenas um lugar, tornando seu código mais consistente e mais rápido de editar
- Gerenciar conjuntos de campos diferentes para usuários diferentes
- Compartilhar padrões de design em diferentes partes do projeto
- Reutilizar conjuntos de junções, dimensões ou medidas em um projeto
Para estender um objeto LookML, crie um novo objeto LookML e adicione o parâmetro extends
para indicar que o novo objeto é uma extensão de um objeto atual. Isso significa que o projeto terá duas versões do objeto LookML. Se houver conflitos, o objeto de extensão terá precedência e substituirá as configurações do objeto que está sendo estendido. Veja mais detalhes na seção Detalhes da implementação do extends
nesta página.
Confira os refinamentos do LookML.
Estender uma visualização ou uma exploração é ideal para cenários em que você quer ter várias versões da visualização ou explorar. No entanto, caso seu objetivo seja apenas modificar uma visualização ou uma exploração sem editar o arquivo LookML que o contém, convém usar um refinamento. Também é possível usar um parâmetroextends
dentro de um refinamento. Consulte a página de documentação Refinamentos do LookML para mais informações e casos de uso.
Estender os painéis de visualizações, explorações e LookML:
Os modelos não podem ser estendidos, e você não pode incluir um arquivo de modelo em outro arquivo de modelo. Em vez disso, se você quiser reutilizar ou ampliar o recurso "Explorar" em vários modelos, crie um arquivo desse tipo e inclua-o em um modelo.
Veja os seguintes exemplos de como estender um recurso "Explorar" e estender um painel do LookML.
Como estender uma exploração
Veja um exemplo de como estender uma exploração:
explore: customer {
persist_for: "12 hours"
}
explore: transaction {
extends: [customer]
persist_for: "5 minutes"
}
Neste exemplo, temos uma exploração chamada Cliente e criamos uma segunda exploração chamada Transação que o estende. Tudo que estiver em Customer, como as mesclagens, será incluído em Transaction. Qualquer item de Transaction permanecerá em Transaction.
No entanto, observe que há um conflito: a guia Explorar do cliente informa que a configuração persist_for
precisa ser de 12 horas, mas a opção Explorar indica que ela precisa ter 5 minutos. Para a exploração em Transação, a configuração persist_for: "5 minutes"
será usada porque ela substitui a configuração da exploração que está sendo estendida.
Como estender um painel do LookML
Para estender um painel do LookML, os painéis estendidos e estendidos precisam ser incluídos no arquivo de modelo. Se um painel que usa o parâmetro extends
for incluído em um arquivo de modelo sem o painel base estendido, você receberá um erro de validação LookML que indica que o painel básico não foi encontrado (entre outros erros).
Veja um exemplo de arquivo do painel:
Arquivo: 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
Podemos criar um novo arquivo de painel do LookML e estender o painel do FAA adicionando um novo bloco:
Arquivo: 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
Como ele estende o painel FAA, o painel FAA Adicional incluirá todos os blocos definidos no arquivo faa.dashboard.lookml
. Além disso, o painel Additional FAA terá todos os blocos definidos no próprio arquivo faa_additional.dashboard.lookml
.
A maneira mais fácil de criar um painel do LookML é conseguir o LookML de um painel definido pelo usuário. Você também pode usar essa técnica para obter o LookML para blocos de painel individuais. Se você estiver usando esse método, certifique-se de que as posições dos seus blocos não se sobreponham. No exemplo acima, os blocos estão na linha superior do painel, indicada por row: 0
:
Arquivo: faa.dashboard.lookml
row: 0
col: 0
width: 8
height: 6
No entanto, o novo bloco que estamos adicionando no painel FAA adicional está em col: 8
, por isso é exibido ao lado do bloco no painel estendido:
Arquivo: faa_additional.dashboard.lookml
row: 0
col: 8
width: 8
height: 6
Isso é algo fácil de perder, pois esses elementos estão em arquivos de painel diferentes. Portanto, se você estiver adicionando blocos a um painel estendido, verifique se há conflitos de posicionamento entre blocos no painel estendido e blocos no painel de extensão.
Exigir extensão
Você pode usar o parâmetro extension: required
para sinalizar um objeto LookML como extensão necessária, o que significa que o objeto não pode ser usado sozinho. Um objeto com extension: required
não fica visível para os usuários sozinho. Ele se destina apenas a servir como ponto de partida para ser estendido por outro objeto LookML. O parâmetro extension
é compatível com os painéis Explorars, visualizações e LookML.
Um explore
com extension: required
não pode ser usado como explore_source
para um teste de dados. O LookML Validator gerará um erro informando que explore_source
não foi encontrado.
Como usar metadados para ver extensões de um objeto
É possível clicar em um parâmetro explore
ou view
no ambiente de desenvolvimento integrado do Looker e usar o painel de metadados para ver as extensões no objeto ou para ver qual objeto ele estende. Consulte a página de documentação Metadados para objetos LookML e veja mais informações.
Detalhes da implementação de extends
Estas são as etapas que o Looker segue ao estender um objeto LookML:
- Copiar o objeto que está sendo estendido: o Looker faz uma cópia do LookML para o painel de visualização, exploração ou LookML que está sendo estendido. Esta nova cópia é o objeto de extensão ing.
- Mesclar o LookML das duas cópias: o Looker mescla o LookML do objeto ed de extensão com o objeto amp.
- Resolver conflitos entre as cópias: na maioria dos casos, se um elemento LookML for definido nos objetos de extensão ed e de extensão ing, a versão no objeto de extensão será usada. No entanto, em outros casos, as extensões combinarão os valores dos parâmetros em vez de modificá-los. Consulte a seção Como combinar parâmetros nesta página para mais informações.
- Aplicar o LookML: quando todos os conflitos são resolvidos, o Looker interpreta o LookML resultante usando a lógica padrão. Em outras palavras, o Looker usará todos os padrões e suposições padrão como em qualquer outro painel de visualização, de exploração ou do LookML.
As seções a seguir mostram as especificidades dessas etapas, estendendo uma visualização como exemplo. Veja o LookML para nossa visualização base, a visualização User:
view: user {
suggestions: yes
dimension: name {
sql: ${TABLE}.name ;;
}
dimension: status {
sql: ${TABLE}.status ;;
type: number
}
}
Veja o LookML para a visualização User with Age Extensions, que estende a visualização 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
}
}
Etapa 1: copiar o LookML
Nesse caso, a visualização user
está sendo estendida para a visualização user_with_age_extensions
. Como user
é a visualização que está sendo estendida, uma cópia dela é feita antes da mesclagem. O fato de que uma cópia é feita não é muito importante saber aqui. O fato de que a visualização original de user
não foi alterada e pode ser usada normalmente, é importante saber.
Etapa 2: mesclar as cópias
A próxima etapa é fazer com que todos os LookML da visualização estendidaed (user
) sejam mesclados à visualização estendidaing (user_with_age_extensions
). É importante entender a natureza dessa mesclagem, que é simplesmente uma mesclagem de objetos LookML. Em termos práticos, isso significa que qualquer LookML explicitamente gravado será mesclado, mas os valores padrão do LookML que você não anotou não serão mesclados. De certo modo, trata-se apenas do texto do LookML que está sendo criado, e não do significado desse texto.
Etapa 3: resolver conflitos
A terceira etapa é resolver conflitos entre as visualizações mescladas.
Na maioria das vezes, se um elemento LookML for definido no objeto estendidaed e no objeto estendidaing, a versão no objeto estendido será usada. No entanto, em outros casos, as extensões combinarão os valores dos parâmetros em vez de modificá-los. Consulte a seção Como combinar parâmetros nesta página para mais informações.
No caso do exemplo do user_with_age_extensions
, nenhum dos parâmetros é additive, e nenhuma opção de lista ou sql
palavras-chave especiais são especificadas. Portanto, os valores dos parâmetros na visualização estendida substituirão os valores do parâmetro na visualização estendida:
- O nome da visualização estendidaing (
user_with_age_extensions
) modifica o nome da visualização estendidaed (user
). - O valor de extensãoing para
suggestions: no
modifica o valor de extensãoedsuggestions: yes
. - A visualização estendidaing tem uma dimensão chamada
age
, que não existe na visualização estendidaed (sem conflito). - A visualização estendidaed tem uma dimensão chamada
name
, que não existe na visualização estendidaing (sem conflito). - O valor
type: string
da dimensãostatus
na visualização Extensão substitui o valortype: number
na visualização Extensão. - A dimensão
status
tem um parâmetrosql
, que não existe na visualização Extensão (sem conflito).
O fato de os valores padrão de LookML ainda não serem considerados é importante, porque você não quer cometer o erro de pensar que os conflitos entre valores padrão estão sendo resolvidos. Na verdade, elas estão sendo ignoradas nesta etapa. É por isso que precisamos adicionar explicitamente parâmetros adicionais ao estender objetos:
- Ao ampliar uma visualização, adicionamos os parâmetros
sql_table_name
einclude
. - Ao estender uma exploração, adicionamos os parâmetros
view_name
eview_label
.
Neste exemplo específico, não adicionamos sql_table_name
à visualização Usuário, o que causará alguns problemas na próxima etapa.
Etapa 4: interpretar o LookML como de costume
Na etapa final, o LookML resultante será interpretado como normal, incluindo todos os valores padrão. Neste exemplo específico, a visualização resultante LookML será interpretada da seguinte maneira:
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
}
}
Observe que o LookML resultante inclui view: user_with_age_extensions
, mas não tem o parâmetro sql_table_name
. Como resultado, o Looker presumirá que o valor de sql_table_name
é igual ao nome da visualização.
O problema é que provavelmente não há uma tabela no nosso banco de dados chamada user_with_age_extensions
. Por isso, precisamos adicionar um parâmetro sql_table_name
a qualquer visualização que será estendida. Adicionar view_name
e view_label
ao recurso Explorar que será estendido evita problemas semelhantes.
A combinação de extensões
Há algumas maneiras de usar objetos LookML com extensões:
- Um objeto pode estender vários outros objetos.
- Um objeto de extensão pode ser estendido.
- Os extensíveis podem ser usados em refinamentos (consulte a página de documentação de Refinamento do LookML para obter mais informações).
Para ver um exemplo de caso de uso avançado e ler dicas de solução de problemas, consulte a página Solução de problemas de um exemplo de caso de uso avançado do
extends
.
Como estender mais de um objeto ao mesmo tempo
É possível estender mais de um painel, visualização ou exploração ao mesmo tempo. Exemplo:
explore: orders {
extends: [user_info, marketing_info]
}
# Also works for dashboards and views
O processo de extensão funciona exatamente como descrito no exemplo de implementação, mas há uma regra extra sobre como os conflitos são resolvidos. Se houver conflitos entre os vários itens listados no parâmetro extends
, a prioridade será concedida para os itens listados por último. Portanto, no exemplo acima, se houvesse conflitos entre user_info
e marketing_info
, o Explorar marketing_info
venceria.
Encadear várias extensões
Você também pode encadear quantas extensões quiser. Exemplo:
explore: orders {
extends: [user_info]
...
}
explore: user_info {
extends: [marketing_info]
...
}
Novamente, o processo de extensão funciona exatamente como descrito no exemplo de implementação, com uma regra extra sobre resolução de conflitos. Se houver conflitos, a prioridade será dada ao último item na cadeia de estende. Neste exemplo:
orders
teria prioridade sobreuser_info
emarketing_info
.user_info
teria prioridade sobremarketing_info
.
Como combinar parâmetros
Na maioria das vezes, se um elemento LookML for definido no objeto estendidaed e no objeto estendidaing, a versão no objeto estendido será usada. Esse foi o exemplo de implementação nesta página.
No entanto, nos casos a seguir, as extensões combinarão os valores de parâmetros em vez de substituí-los:
- Para parâmetros additive
- Com a palavra-chave da lista
EXTENDED*
- Com a palavra-chave
${EXTENDED}
para o parâmetrosql
Alguns parâmetros são aditivos
Em muitos casos, se o objeto de extensão contiver o mesmo parâmetro que o objeto que está sendo estendido, os valores do objeto em extensão substituirão os valores de parâmetro do objeto estendido. No entanto, as extensões podem ser aditivas para alguns parâmetros, o que significa que os valores do objeto estendido são usados em conjunto com os do objeto estendido.
Os seguintes parâmetros são aditivos:
Para dimensões e medidas:
Para visualizações:
Para Explorar:
No exemplo a seguir, a visualização carriers
tem uma dimensão name
com um parâmetro 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"
}
}
}
Aqui está a visualização carriers_extended
, que estende a visualização carriers
. A visualização carriers_extended
também tem uma dimensão name
com configurações diferentes no parâmetro 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"
}
}
}
Na visualização carriers_extended
, os dois parâmetros link
são aditivos. Portanto, a dimensão name
exibirá os dois links.
Opções adicionais com listas
Ao trabalhar com listas, você pode combiná-las, em vez de fazer com que a lista do objeto estendida seja a vencedora. Considere esta extensão simples com uma lista conflitante chamada animals
:
view: pets {
extends: fish
set: animals {
fields: [dog, cat]
}
}
view: fish {
set: animals {
fields: [goldfish, guppy]
}
}
Nesse caso, a visualização pets
está fazendo a extensão e, portanto, vencerá, fazendo com que animals
contenha [dog, cat]
. No entanto, ao usar o conjunto especial EXTENDED*
, você pode combinar as listas:
view: pets {
extends: fish
set: animals {
fields: [dog, cat, EXTENDED*]
}
}
view: fish {
set: animals {
fields: [goldfish, guppy]
}
}
Agora, a lista animals
conterá [dog, cat, goldfish, guppy]
.
Combinação em vez de substituição durante a resolução de conflitos
Na maioria dos casos, se houver algum conflito durante a extensão, o objeto de extensão vencerá. Por exemplo, considere esta extensão simples:
view: product_short_descriptions {
extends: products
dimension: description {
sql: ${TABLE}.short_description ;;
}
}
view: products {
dimension: description {
sql: ${TABLE}.full_description ;;
}
}
Você pode ver que há um conflito do parâmetro sql
na dimensão description
. Normalmente, a definição de product_short_descriptions
simplesmente substitui a definição de products
porque está fazendo a extensão.
No entanto, você também pode combinar as definições se quiser. Para isso, você usará a palavra-chave ${EXTENDED}
desta forma:
view: product_short_descriptions {
extends: products
dimension: description {
sql: LEFT(${EXTENDED}, 50) ;;
}
}
view: products {
dimension: description {
sql: ${TABLE}.full_description ;;
}
}
Agora, o conflito do parâmetro sql
será abordado de outra forma. Em vez da definição product_short_descriptions
, ela vai usar a definição do products
e inseri-la no local em que o ${EXTENDED}
é usado. A definição resultante para description
neste caso será: LEFT(${TABLE}.full_description, 50)
.
Informações importantes
Projetos com localização
Ao estender um objeto, lembre-se de que as regras de localização também se aplicam a suas extensões. Se você estiver estendendo um objeto e definindo novos rótulos ou descrições, forneça definições de localização nos arquivos de strings de localidade do seu projeto. Consulte a página de documentação Como localizar seu modelo do LookML para mais informações.