Cómo reutilizar código con extensiones

Este es un tema avanzado para el que se supone que el lector tiene un conocimiento sólido de LookML.

Descripción general

A medida que tu modelo de LookML se amplía en tamaño y complejidad, se vuelve cada vez más útil reutilizar LookML en varios lugares. El parámetro extends te permite volver a usar el código, lo que te ayuda a hacer lo siguiente:

  • Escribe código DRY (no te repitas), de modo que puedas definir elementos en un solo lugar, lo que hará que tu código sea más coherente y sea más rápido de editar.
  • Administrar distintos conjuntos de campos para usuarios distintos
  • Compartir patrones de diseño en diferentes partes de tu proyecto
  • Reutilizar conjuntos de uniones, dimensiones o medidas en todo un proyecto

Para extender un objeto de LookML, crea un objeto nuevo de LookML y, luego, agrega el parámetro extends para indicar que el objeto nuevo es una extensión de un objeto existente. Esto significa que tu proyecto tendrá dos versiones del objeto LookML. Si hay algún conflicto, el objeto extendido tendrá prioridad y anulará la configuración del objeto que se está extendiendo. Consulta la sección Detalles de implementación de extends más adelante en esta página para obtener detalles.

Consulta las mejoras de LookML: Extender una vista o una exploración es ideal para situaciones en las que quieres tener varias versiones de ellas. Pero si tu objetivo es simplemente modificar una vista o una exploración sin editar el archivo de LookML que lo contiene, puedes usar un perfeccionamiento. También puedes usar un parámetro extends dentro de un perfeccionamiento. Consulta la página de documentación sobre las mejoras de Looker para obtener más información y casos de uso.

Puedes extender las vistas, las exploraciones y los paneles de LookML:

Los modelos no se pueden extender ni puedes incluir un archivo de modelo en otro archivo de modelo. En cambio, si deseas volver a usar o extender las exploraciones a través de modelos, puedes crear un archivo de exploración independiente y, luego, incluir ese archivo en un archivo de modelo.

Consulta los siguientes ejemplos para extender una exploración y extender un panel de LookML.

Cómo extender una exploración

Este es un ejemplo de cómo extender una exploración:

explore: customer {
  persist_for: "12 hours"
}

explore: transaction {
  extends: [customer]
  persist_for: "5 minutes"
}

En este ejemplo, tenemos una exploración llamada Customer y creamos una segunda exploración llamada Transaction que la extiende. Todo lo que esté en Customer, como sus uniones, se incluirá en Transaction. Todo lo que esté en Transaction permanecerá en Transaction.

Sin embargo, ten en cuenta que hay un conflicto. La exploración de cliente indica que el parámetro de configuración persist_for debería ser de 12 horas, pero la exploración de transacciones indica que debería ser de 5 minutos. Para la exploración de transacción, se usará el parámetro de configuración persist_for: "5 minutes", ya que reemplaza el parámetro de configuración de la exploración que se está extendiendo.

Amplía un panel de LookML

Para extender un panel de LookML, los paneles extendidos y extendidos deben incluirse en el archivo del modelo. Si un panel que usa el parámetro extends se incluye en un archivo de modelo sin el panel base que extiende, aparecerá un error de validación de LookML que indicará que no se puede encontrar el panel base (entre otros errores).

Este es un ejemplo de archivo de panel:

Archivo: 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 crear un nuevo archivo de panel de LookML y ampliar el panel FAA agregando una nueva tarjeta:

Archivo: 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

Dado que extiende el panel de la FAA, el panel FAA Additional incluirá todos los mosaicos que se definan en el archivo faa.dashboard.lookml. Además, el panel FAA Additional tendrá los mosaicos definidos en su propio archivo faa_additional.dashboard.lookml.

La forma más fácil de crear un panel de LookML es obtener LookML desde un panel definido por el usuario. También puedes usar esta técnica con el objetivo de obtener LookML para mosaicos de paneles individuales. Si usas este método, asegúrate de que las posiciones de los mosaicos no se superpongan. En los ejemplos de faa.dashboard.lookml y faa_additional.dashboard.lookml, los mosaicos están en la fila superior del panel, que se indica con row: 0:

Archivo: faa.dashboard.lookml


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

Sin embargo, el nuevo mosaico que agregaremos en el panel FAA Additional se encuentra en col: 8, por lo que se mostrará junto al mosaico en el panel extendido:

Archivo: faa_additional.dashboard.lookml


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

Esto es fácil de pasar por alto, ya que estos elementos están en diferentes archivos de panel. Por lo tanto, si agregas mosaicos a un panel extendido, asegúrate de verificar que no haya conflictos de posicionamiento entre los mosaicos del panel extendido y los mosaicos del panel extendido.

Requiere extensión

Puedes usar el parámetro extension: required para marcar un objeto de LookML como una extensión que requiere una extensión, lo que significa que el objeto no se puede usar por sí solo. Un objeto con extension: required no es visible para los usuarios por sí solo; está diseñado únicamente como punto de partida para que otro objeto de LookML lo extienda. El parámetro extension es compatible con las funciones Exploraciones, vistas y paneles de Looker.

No se puede usar un explore con extension: required como explore_source para una prueba de datos. El Validador de Looker generará un error que indicará que no se puede encontrar el explore_source.

Usa metadatos para ver las extensiones de un objeto

Puedes hacer clic en un parámetro explore o view en el IDE de Looker y usar el panel de metadatos para ver las extensiones del objeto o ver qué objeto extiende. Para obtener más información, consulta la página de documentación Metadatos de objetos de LookML.

Detalles de implementación de extends

Estos son los pasos que realiza Looker cuando extiende un objeto de LookML:

  1. Copiar el objeto que se extiende: Looker crea una copia de LookML para la vista, la exploración o el panel de LookML que se está extendiendo. Esta copia nueva es el objeto ing.
  2. Combina el LookML de las dos copias: Looker combina el LookML del objeto extendido al que se extiende .
  3. Resuelve los conflictos entre las copias: En general, si un elemento de LookML se define en el objeto extendido y en el objeto extendido, se usa la versión en el objeto extendido. Sin embargo, en otros casos, las extensiones combinarán los valores de los parámetros en lugar de anularlos. Consulta la sección Combinación de parámetros en esta página para obtener más información.
  4. Aplica el LookML: Una vez que se resuelven todos los conflictos, Looker interpreta el LookML resultante con la lógica estándar. En otras palabras, Looker usará todos los valores predeterminados y suposiciones estándar, como con cualquier otro panel de vista, exploración o LookML.

En las siguientes secciones, se muestran los detalles de estos pasos, con una vista de ejemplo. A continuación, se muestra LookML para nuestra vista base, la vista User:

view: user {
  suggestions: yes

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

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

Este es el LookML para la vista Usuario con extensiones de edad, que extiende la vista Usuario:

include: "/views/user.view"

view: user_with_age_extensions {
  extends: [user]
  suggestions: no

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

  dimension: status {
    type: string
  }
}

Paso 1: Copia LookML

En este caso, la vista user se extiende a la vista user_with_age_extensions. Como user es la vista que se extiende, se creará una copia de esta antes de combinarla. El hecho de que se haya creado una copia no es particularmente importante en este punto. Es importante conocer el hecho de que la vista user original no se modifica y se puede usar con normalidad.

Paso 2: Combina las copias

El siguiente paso es que todos los elementos de LookML de la vista extendida (user) se combinen en la vista expansible (user_with_age_extensions). Es importante comprender la naturaleza de esta combinación, que solo es una combinación de objetos de LookML. En términos prácticos, esto significa que se combina cualquier LookML escrito explícitamente, pero los valores predeterminados de LookML que no anotaste no se fusionan. En cierto sentido, en realidad es solo el texto de LookML lo que se está armando, y nada de su significado.

Paso 3: Resuelve conflictos

El tercer paso consiste en resolver cualquier conflicto entre las vistas combinadas.

En general, si un elemento LookML se define en el objeto extendidoed y en el objeto ing, se usa la versión en el objeto que se extiende. Sin embargo, en otros casos, las extensiones combinarán los valores de los parámetros en lugar de anularlos. Consulta la sección Combinación de parámetros en esta página para obtener más información.

En el caso del ejemplo de user_with_age_extensions, ninguno de los parámetros es aditivo y no se especifican opciones de lista ni palabras clave sql especiales, por lo que los valores de los parámetros en la vista extendida anularán los valores de parámetros en la vista extendida:

  • El nombre de la vista extendida (user_with_age_extensions) anula el nombre de la vista extendida (user).
  • El valor extensivo para suggestions: no anula el valor extendido a suggestions: yes.
  • La vista extendida tiene una dimensión denominada age, que no existe en la vista extendida (sin conflictos).
  • La vista extendida tiene una dimensión denominada name, que no existe en la vista extendida (sin conflictos).
  • El valor type: string de la dimensión status en la vista extendida anula el valor type: number en la vista extendida.
  • La dimensión status tiene un parámetro sql, que no existe en la vista extendida (sin conflicto).

El hecho de que los valores predeterminados de LookML aún no se consideren es importante, ya que no es recomendable cometer el error de pensar que se están resolviendo los conflictos entre los valores predeterminados. En realidad, solo se los ignora en este paso. Es por eso que debemos agregar de forma explícita parámetros adicionales cuando se extienden objetos:

En este ejemplo específico, no agregamos sql_table_name a la vista Usuario, lo que causará algunos problemas en el siguiente paso.

Paso 4: Interpreta LookML como normal

En el paso final, el LookML resultante se interpreta como normal, incluidos todos los valores predeterminados. En este ejemplo en particular, la vista resultante LookML se interpretaría de la siguiente manera:

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

Observa que el LookML resultante incluye view: user_with_age_extensions, pero no ningún parámetro sql_table_name. Como resultado, Looker supondrá que el valor de sql_table_name es igual al nombre de la vista.

El problema es que probablemente no haya una tabla en nuestra base de datos llamada user_with_age_extensions. Es por eso que debemos agregar un parámetro sql_table_name a cualquier vista que se extenderá. Si agregas view_name y view_label a las exploraciones que se extenderán, se evitan problemas similares.

Combina extensiones

Existen varias formas de aprovechar los objetos de LookML con las extensiones:

Si quieres ver un ejemplo de un caso de uso avanzado y leer sugerencias para solucionar problemas, consulta la página de prácticas recomendadas para solucionar problemas con un caso de uso avanzado de extends.

Extender más de un objeto al mismo tiempo

Es posible extender más de un panel, vista o exploración al mismo tiempo. Por ejemplo:

explore: orders {
  extends: [user_info, marketing_info]
}
# Also works for dashboards and views

El proceso de extensión funciona exactamente como se describe en el ejemplo de implementación, pero hay una regla adicional sobre cómo se resuelven los conflictos. Si hay conflicto entre los elementos de la lista del parámetro extends, se da prioridad a los últimos elementos que se incluyeron en la lista. Por lo tanto, en el ejemplo anterior, si hubiera conflictos entre user_info y marketing_info, ganaría la exploración de marketing_info.

Encadena múltiples extensiones

También puedes encadenar todos los extensiones que desees. Por ejemplo:

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

Una vez más, el proceso de extensión funciona exactamente como se describe en el ejemplo de implementación, con una regla adicional sobre la resolución de conflictos. Si hay algún conflicto, se le da prioridad al último elemento de la cadena de extensiones. En este ejemplo:

  • orders tendría prioridad sobre user_info y marketing_info.
  • user_info tendría prioridad sobre marketing_info.

Combinación de parámetros

En general, si un elemento LookML se define en el objeto extendidoed y en el objeto ing, se usa la versión en el objeto que se extiende. Este fue el caso del ejemplo de implementación en esta página.

Sin embargo, en los siguientes casos, las extensiones combine los valores de los parámetros en lugar de anularlos:

Algunos parámetros son de adición

En muchos casos, si el objeto extendido contiene el mismo parámetro que el objeto que se está extendiendo, los valores del objeto que se extienden anularán los valores de los parámetros del objeto extendido. Sin embargo, las extensiones pueden ser aditivas para algunos parámetros, lo que significa que los valores del objeto extendido se usan junto con los valores del objeto extendido.

Los siguientes parámetros son additivos:

En el siguiente ejemplo, la vista carriers tiene una dimensión name con un 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"
    }
  }
}

Esta es la vista carriers_extended, que extiende la vista carriers. La vista carriers_extended también tiene una dimensión name con diferentes opciones de configuración en el 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"
    }
  }
}

En la vista carriers_extended, los dos parámetros link son aditivos, por lo que la dimensión name mostrará ambos vínculos.

Opciones adicionales con listas

Cuando trabajas con listas, puedes optar por combinarlas en lugar de que la lista del objeto que se extiende sea la más adecuada. Considera esta extensión simple con una lista en conflicto llamada animals:

view: pets {
  extends: fish
  set: animals {
    fields: [dog, cat]
  }
}
view: fish {
  set: animals {
    fields: [goldfish, guppy]
  }
}

En este caso, la vista pets hará la extensión y, por lo tanto, ganará, lo que hará que animals contenga [dog, cat]. Sin embargo, si usas el conjunto especial EXTENDED*, puedes combinar las listas en su lugar:

view: pets {
  extends: fish
  set: animals {
    fields: [dog, cat, EXTENDED*]
  }
}
view: fish {
  set: animals {
    fields: [goldfish, guppy]
  }
}

Ahora la lista animals contendrá [dog, cat, goldfish, guppy].

Combinar en lugar de reemplazar durante la resolución de conflictos

En general, si hay conflictos durante la extensión, ganará el objeto que se extienda. Por ejemplo, tomemos esta extensión simple:

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

Puedes ver que hay un conflicto entre el parámetro sql dentro de la dimensión description. Por lo general, la definición de product_short_descriptions simplemente reemplazará la definición de products, porque está realizando la extensión.

Sin embargo, también puedes optar por combine las definiciones si lo deseas. Para hacerlo, usarás la palabra clave ${EXTENDED} de la siguiente manera:

view: product_short_descriptions {
  extends: products
  dimension: description {
    sql: LEFT(${EXTENDED}, 50) ;;
  }
}
view: products {
  dimension: description {
    sql: ${TABLE}.full_description ;;
  }
}

Ahora el conflicto del parámetro sql se abordará de manera diferente. En lugar de la definición de product_short_descriptions ganadora, se tomará la definición de products y se insertará donde se use ${EXTENDED}. La definición resultante de description en este caso será: LEFT(${TABLE}.full_description, 50).

Aspectos para tener en cuenta

Proyectos con localización

Cuando extiendas un objeto, ten en cuenta que las reglas de localización también se aplican a tus extensiones. Si vas a extender un objeto y luego definirás etiquetas o descripciones nuevas, debes proporcionar definiciones de localización en los archivos de cadenas de configuración regional del proyecto. Consulta la página de documentación Cómo localizar tu modelo de LookML para obtener más información.