Reutilizar código com extensões

Este é um tópico avançado que pressupõe que o leitor tenha um conhecimento sólido de LookML.

Visão geral

À medida que o modelo do LookML aumenta em tamanho e complexidade, é cada vez mais útil reutilizar o LookML em vários lugares. Com o parâmetro extends, é possível reutilizar o código, o que ajuda você 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 o código mais consistente e rápido de editar.
  • Gerenciar conjuntos de campos diferentes para usuários distintos
  • Compartilhar padrões de design em partes diferentes do projeto
  • Reutilizar conjuntos de mesclagens, 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 existente. 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 de implementação do extends mais adiante nesta página.

Confira os refinamentos do LookML.
A extensão de uma visualização ou de exploração é ideal para cenários em que você quer ter várias versões da visualização ou de exploração. Mas caso seu objetivo seja simplesmente 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âmetro extends dentro de um refinamento. Consulte a página de documentação Refinamentos do LookML para ver mais informações e casos de uso.

Você pode estender os painéis de visualizações, explorações e LookML:

Os modelos não podem ser estendidos, e não é possível incluir um arquivo de modelo em outro. Em vez disso, se você quiser reutilizar ou estender o recurso Explorar em vários modelos, é possível criar um arquivo "Explorar" separado e incluir esse arquivo em um arquivo de modelo.

Veja os seguintes exemplos de estendimento de "Explorar" e estendimento de um painel do LookML.

Como estender uma exploração

Veja um exemplo de extensão do Explorar:

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 a estende. Tudo que estiver em Customer, como as mesclagens, será incluído na Transaction. Tudo que estiver em Transaction permanecerá em Transaction.

Observe que há um conflito: o Exploração do Cliente diz que a configuração persist_for precisa ter 12 horas, mas o Explorar Transação diz que ele deve ter 5 minutos. Em Explore, a configuração persist_for: "5 minutes" vai ser usada, porque ela substitui a configuração da extensão "Explorar".

Como estender um painel do LookML

Para estender um painel do LookML, os painéis estendidos e estendidos precisam ser incluídos no arquivo do 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 mostra que o painel base não pode ser encontrado (entre outros erros).

Veja um exemplo de arquivo de 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 do painel LookML e estender o painel 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 Outros FAA vai incluir todos os blocos definidos no arquivo faa.dashboard.lookml. Além disso, o painel Outros fatores da FAA terá todos os blocos definidos no próprio arquivo faa_additional.dashboard.lookml.

A maneira mais fácil de criar um painel LookML é conseguir o LookML de um painel definido pelo usuário. Você também pode usar essa técnica para extrair o LookML para blocos de painel individuais. Se você estiver usando esse método, verifique se as posições dos blocos não se sobrepõem. No exemplo acima, os blocos estão na linha superior do painel, o que é indicado por row: 0:

Arquivo: faa.dashboard.lookml


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

No entanto, o novo bloco que adicionamos no painel FAA adicional está em col: 8. Portanto, ele é exibido ao lado do bloco do painel estendido:

Arquivo: faa_additional.dashboard.lookml


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

Isso é algo fácil de se perder, porque esses elementos estão em diferentes arquivos de painel. Portanto, se você estiver adicionando blocos a um painel estendido, verifique se há conflitos de posicionamento entre os blocos no painel estendido e os blocos no painel estendido.

Exigindo extensão

Você pode usar o parâmetro extension: required para sinalizar um objeto LookML como "extensão". Isso significa que o objeto não pode ser usado sozinho. Um objeto com extension: required não é visível para usuários por conta própria. Ele se destina apenas a atuar como ponto de partida a ser estendido por outro objeto LookML. O parâmetro extension é compatível com explores, visualizações e painéis do LookML.

Um explore com extension: required não pode ser usado como explore_source em um teste de dados. O LookML Validator gera um erro informando que o explore_source não foi encontrado.

Como usar metadados para ver extensões de um objeto

Clique em um parâmetro explore ou view no ambiente de desenvolvimento integrado do Looker e use o painel de metadados para ver quaisquer extensões no objeto ou para saber qual objeto ele estende. Consulte a página de documentação Metadados para objetos LookML para saber mais.

Detalhes de implementação para extends

Estas são as etapas que o Looker segue ao estender um objeto LookML:

  1. Copiar o objeto que está sendo estendido: o Looker faz uma cópia do LookML do painel de visualização, exploração ou LookML que está sendo estendido. Essa nova cópia é o objeto de extensão ing.
  2. Mesclar o LookML das duas cópias: o Looker mescla o LookML do objeto estendidaed com o objeto estendaing.
  3. Resolver conflitos entre as cópias: na maioria dos casos, se um elemento LookML for definido nos objetos estendidosed e estendaing, a versão no objeto estendido será usada. No entanto, em outros casos, as extensões combinam valores de parâmetro em vez de substituir os valores. Consulte a seção Como combinar parâmetros nesta página para ver mais informações.
  4. Aplicar o LookML: quando todos os conflitos forem resolvidos, o Looker interpretará 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 outra visualização, painel de exploração ou 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. Não é especialmente importante saber que uma cópia foi feita aqui. O fato de a visualização user original permanecer inalterada e poder ser usada normalmente é importante.

Etapa 2: mesclar as cópias

A próxima etapa é para todo o LookML na visualização de extensãoed (user) ser mesclada na visualização de extensãoing (user_with_age_extensions). É importante mesclar a aparência do que é Em termos práticos, isso significa que qualquer LookML explicitamente escrito será mesclado, mas os valores padrão do LookML que você não gravou don't serão combinados. De certa forma, é só o texto do LookML que está sendo montado, e o significado do texto não.

Etapa 3: resolver conflitos

A terceira etapa é resolver conflitos entre as visualizações mescladas.

Na maioria dos casos, se um elemento LookML for definido nos objetos estendidosed e estendidosing, a versão no objeto estendido será usada. No entanto, em outros casos, as extensões combinam valores de parâmetro em vez de substituir os valores. Consulte a seção Como combinar parâmetros nesta página para ver mais informações.

No caso do exemplo user_with_age_extensions, nenhum dos parâmetros é adicional e nenhuma opção de lista especial ou palavras-chave do sql é especificada. Portanto, os valores dos parâmetros na visualização estendida substituirão os valores de parâmetro na visualização estendida:

  • O nome de visualização de extensãoinging (user_with_age_extensions) substitui o nome de visualização de extensãoed(user).
  • O valor de extensãoing para suggestions: no modifica o valor de estendeed suggestions: yes.
  • A visualização estendidaing tem uma dimensão chamada age, que não existe na visualização estendidoed (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ão status na visualização estendeing modifica o valor type: number na visualização estendidoed.
  • A dimensão status tem um parâmetro sql, que não existe na visualização de extensão ing (sem conflito).

Os valores padrão de LookML ainda não são considerados porque são importantes porque você não quer cometer o erro de pensar que os conflitos entre os valores padrão estão sendo resolvidos. Na verdade, eles estão apenas sendo ignorados nesta etapa. É por isso que precisamos adicionar explicitamente outros parâmetros ao estender objetos:

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, acabamos com o LookML que inclui view: user_with_age_extensions, mas nenhum 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á tabela no nosso banco de dados chamada user_with_age_extensions. É por isso que precisamos adicionar um parâmetro sql_table_name a qualquer visualização que será estendida. Adicionar view_name e view_label a "explores" será estendido para evitar problemas semelhantes.

Combinação de extensões

Existem algumas maneiras de aproveitar objetos LookML com estendidos:

Para ver um exemplo de caso de uso avançado e ler dicas de solução de problemas, consulte o artigo Solução de problemas de um exemplo de caso de uso avançado de extends da Central de Ajuda.

Ampliar 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á atribuída aos itens listados por último. Portanto, no exemplo acima, se houvesse conflitos entre user_info e marketing_info, o Explorar marketing_info ganharia.

Encadeamento de múltiplas extensões

Também é possível encadear quantas extensões você 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 a resolução de conflitos. Se houver conflitos, a prioridade será atribuída ao último item da cadeia de estendes. Neste exemplo:

  • orders teria prioridade sobre user_info e marketing_info.
  • user_info teria prioridade sobre marketing_info.

Como combinar parâmetros

Na maioria dos casos, se um elemento LookML for definido nos objetos estendidosed e estendidosing, a versão no objeto estendido será usada. Isso ocorreu no exemplo de implementação nesta página.

No entanto, nos casos a seguir, as extensões combinam os valores de parâmetro em vez de substituir os valores:

Alguns parâmetros são aditivos

Em muitos casos, se o objeto estendido contiver o mesmo parâmetro que o objeto que está sendo estendido, os valores do objeto estendido serão modificados aos valores do parâmetro do objeto estendido. No entanto, as extensões podem ser aditivas para alguns parâmetros. Isso significa que os valores do objeto estendido são usados em conjunto com os do objeto estendido.

Os seguintes parâmetros são aditivos:

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"
    }
  }
}

E 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 terá os dois links. A dimensão é semelhante a esta em um Explorar:

Outras opções com listas

Ao trabalhar com listas, você pode combiná-las, em vez de vencer a lista estendida de objetos. 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 de 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].

Combinar em vez de substituir durante a resolução de conflitos

Na maioria dos casos, se houver conflitos durante a extensão, o objeto de extensão vencerá. Por exemplo, veja esta extensão simples:

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

É possível ver que há um conflito do parâmetro sql na dimensão description. Normalmente, a definição de product_short_descriptions substituirá a definição de products porque está fazendo a extensão.

No entanto, você também pode combinar as definições. Para fazer 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á tratado de forma diferente. Em vez de definir a definição de product_short_descriptions, ela usa a definição de products e a insere onde ${EXTENDED} é usada. Neste caso, a definição resultante de description será: LEFT(${TABLE}.full_description, 50).

Considerações

Projetos com localização

Ao estender um objeto, lembre-se de que as regras de localização também se aplicam às 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 Como localizar seu modelo LookML para mais informações.