Cómo volver a usar código con extensiones

Este es un tema avanzado en 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 expande en tamaño y complejidad, se vuelve cada vez más útil reutilizarlo 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) para poder definir todo en un solo lugar y hacer que tu código sea más coherente y rápido de editar.
  • Administra diferentes conjuntos de campos para distintos usuarios
  • Compartir patrones de diseño en diferentes partes de tu proyecto
  • Reutilizar conjuntos de uniones, dimensiones o mediciones en todo un proyecto

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

Revisa las mejoras de LookML: Extender una vista o una exploración es ideal para situaciones en las que deseas 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 los contiene, quizás debas definir mejor. También puedes usar un parámetro extends dentro de una mejora. Consulta la página de documentación sobre las mejoras de LookML para obtener más información y casos de uso.

Puedes extender vistas, exploraciones y paneles de LookML:

Los modelos no se pueden extender y no puedes incluir un archivo de modelo en otro archivo de modelo. En cambio, si quieres volver a usar o extender las exploraciones entre 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 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 se encuentre 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 clientes indica que el parámetro de configuración de 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 está extendiendo.

Extiende un panel de LookML

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

Este es un archivo de panel de ejemplo:

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 extender el panel de FAA agregando un mosaico nuevo:

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

Debido a que extiende el panel de FAA, el panel FAA Additional incluirá los mosaicos que se definen en el archivo faa.dashboard.lookml. Además, el panel FAA adicional tendrá 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 para obtener LookML de mosaicos individuales del panel. Si usas este método, asegúrate de que las posiciones de las tarjetas no se superpongan. En los ejemplos de faa.dashboard.lookml y faa_additional.dashboard.lookml, los mosaicos se encuentran en la fila superior del panel, lo 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 adicional se encuentra en col: 8, por lo que se muestra junto al mosaico del panel extendido:

Archivo: faa_additional.dashboard.lookml


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

Es fácil pasar por alto esto, ya que estos elementos se encuentran en diferentes archivos de paneles. Por lo tanto, si agregas mosaicos a un panel extendido, asegúrate de verificar los conflictos de posicionamiento entre los mosaicos del panel extendido y los mosaicos del panel extendido.

Extensión requerida

Puedes usar el parámetro extension: required para marcar que un objeto de LookML 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. Solo está diseñado para actuar como punto de partida para que otro objeto de LookML lo extienda. El parámetro extension es compatible con Exploraciones, vistas y paneles de LookML.

No se puede usar un explore con extension: required como explore_source para una prueba de datos. El validador de LookML generará un error que indicará que no se puede encontrar 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 qué objeto extiende. Consulta la página de documentación Metadatos para objetos de LookML para obtener más información.

Detalles de la implementación de extends

Estos son los pasos que sigue Looker para extender un objeto de LookML:

  1. Copiar el objeto que se está extendiendo: Looker hace una copia de LookML para la vista, Explorar o el panel de LookML que se está ampliando. Esta copia nueva es el objeto extending.
  2. Combina el LookML de las dos copias: Looker combina el LookML del objeto ampliado en el objeto extending.
  3. Resolver conflictos entre las copias: En general, si se define un elemento de LookML en el objeto extendido y el objetoing que se extiende, 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. Para obtener más información, consulta la sección Parámetros de combinación de esta página.
  4. Aplica el LookML: Una vez resueltos 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ándares, como lo haría con cualquier otro panel de vista, Explorar o LookML.

En las siguientes secciones, se muestra la información específica de estos pasos y se extiende una vista a modo de ejemplo. Este es 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 extenderá, se crea una copia de esta antes de la combinación. No es importante saber el hecho de que se cree una copia aquí. Es importante conocer el hecho de que la vista user original no se modifica y se puede usar como de costumbre.

Paso 2: Combina las copias

El siguiente paso es que todo LookML de la vista ampliada (user) se combine con la vista en expansión (user_with_age_extensions). Es importante comprender la naturaleza de esta combinación, que es simplemente una combinación de objetos de LookML. En términos prácticos, esto significa que cualquier LookML escrito explícitamente se combina, pero los valores predeterminados de LookML que no escribiste no se combinan. En cierto sentido, solo se está armando el texto de LookML, y ninguno de sus significados.

Paso 3: Resuelve los conflictos

El tercer paso es resolver cualquier conflicto entre las vistas combinadas.

En general, si un elemento de LookML se define tanto en el objeto extendidoed como en el objeto que se extiendeing, 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. Para obtener más información, consulta la sección Parámetros de combinación de esta página.

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, por lo que los valores de los parámetros en la vista extendida anularán los valores de los parámetros en la vista extendida:

  • El nombre de la vista extensible (user_with_age_extensions) anula el nombre de la vistaextendida (user).
  • El valor extending de suggestions: no anula el valor extendido de suggestions: yes.
  • La vista extendida tiene una dimensión llamada age, que no existe en la vista extendida (sin conflicto).
  • La vista ampliada tiene una dimensión llamada name, que no existe en la vista en expansión (sin conflicto).
  • El valor type: string de la dimensión status en la vistadesplegable anula el valor type: number en la vistaampliada.
  • La dimensión status tiene un parámetro sql, que no existe en la vistaen expansión (sin conflicto).

El hecho de que aún no se estén considerando los valores predeterminados de LookML es importante, porque no querrás cometer el error de pensar que se están resolviendo los conflictos entre valores predeterminados. En realidad, se los ignora en este paso. Por esta razón, es necesario agregar de forma explícita parámetros adicionales cuando se extienden los objetos:

En este ejemplo en particular, 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 de 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 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 vaya a extender. Si agregas view_name y view_label a las exploraciones que se extenderán, se evitarán problemas similares.

La combinación extiende

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

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

Extiende más de un objeto al mismo tiempo

Es posible extender más de un panel, una vista o una 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 algún conflicto entre los múltiples elementos enumerados en el parámetro extends, se dará prioridad a los últimos elementos. Por lo tanto, en el ejemplo anterior, si hubiera conflictos entre user_info y marketing_info, la exploración de marketing_info ganaría.

Encadenar múltiples extensiones

También puedes encadenar tantos extensiones como 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 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 de LookML se define tanto en el objeto extendidoed como en el objeto que se extiendeing, se usa la versión en el objeto que se extiende. Este fue el caso del ejemplo de implementación de 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 aditivos

En muchos casos, si el objeto que se extiende contiene el mismo parámetro que el objeto que se extiende, los valores del objeto que se extiende 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 que se extiende se usan junto con los valores del objeto extendido.

Los siguientes parámetros son aditivos:

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

Y esta es la vista carriers_extended, que extiende la vista carriers. La vista carriers_extended también tiene una dimensión name con diferentes parámetros 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 trabajes con listas, puedes optar por combinarlas en lugar de que la lista del objeto de extensión sea la ganadora. 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 realiza 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:

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, prevalecerá el objeto que se extiende. 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 del parámetro sql en la dimensión description. Por lo general, la definición de product_short_descriptions solo reemplazará la definición de products, ya que realiza la extensión.

Sin embargo, también puede combine las definiciones si lo desea. Para hacerlo, usa 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 que gane la definición product_short_descriptions, tomará la definición de products y la insertará donde se use ${EXTENDED}. La definición resultante de description en este caso será la siguiente: 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 las extensiones. Si extiendes un objeto y, luego, defines nuevas etiquetas o descripciones, debes proporcionar definiciones de localización en los archivos de cadenas de configuración regional de tu proyecto. Consulta la página de documentación Localiza tu modelo de LookML para obtener más información.