Cómo volver a usar código con extensiones

Este es un tema avanzado que 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 volver a usarlo en varios lugares. El parámetro extends te permite reutilizar código, lo que te ayuda a hacer lo siguiente:

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

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

Consulta los refinamientos de LookML.
Extender una vista o Explorar es ideal para situaciones en las que deseas tener varias versiones de la vista o Explorar. Sin embargo, si su objetivo es simplemente modificar una vista o un archivo Explorar sin editar el archivo LookML que lo contiene, le recomendamos que, en su lugar, utilice una definición mejorada. También puedes usar un parámetro extends dentro de un perfeccionamiento. Consulta la página de documentación Mejoras de LookML para obtener más información y casos prácticos.

Puedes extender los paneles de vistas, Explorar y LookML:

Los modelos no se pueden extender ni incluir un archivo de modelo en otro archivo de modelo. En cambio, si desea volver a usar o ampliar Explorar en todos los modelos, puede crear un archivo Explorar independiente y, luego, incluirlo en un archivo de modelo.

Consulta los siguientes ejemplos para extender un Explorar y extender un panel de LookML.

Extiende una exploración

A continuación, se muestra 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 un Explorar llamado Cliente y creamos un segundo Explorar llamado Transacciones que lo extiende. Todo lo que esté en Customer, como sus combinaciones, se incluirá en Transaction. Todo lo que esté en Transaction permanecerá en Transaction.

Pero tenga en cuenta que hay un conflicto: La exploración del cliente indica que la configuración persist_for debe ser de 12 horas, pero la exploración de transacción dice que debe ser de 5 minutos. Para Explorar transacción, se usará la configuración persist_for: "5 minutes", ya que reemplaza la configuración de la extensión Explorar.

Extiende 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, obtendrás un error de validación de LookML que no se puede encontrar (entre otros errores).

Este es un ejemplo de un 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 archivo de panel nuevo de LookML y extender el panel de FAA mediante la adición de un nuevo mosaico:

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 se extiende el panel FAA, el panel FAA adicional incluirá los mosaicos definidos en el archivo faa.dashboard.lookml. Además, el panel AFA adicional tendrá mosaicos que se definen en su propio archivo faa_additional.dashboard.lookml.

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

Archivo: faa.dashboard.lookml


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

Sin embargo, el nuevo mosaico que agregamos al panel AFA adicional se encuentra en col: 8, por lo que se muestra junto al mosaico del panel ampliado:

Archivo: faa_additional.dashboard.lookml


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

Esto es algo 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 del panel que se extiende.

Solicitud de extensión

Puedes usar el parámetro extension: required para marcar un objeto LookML como que requiere 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 solo para funcionar como punto de partida y lo extenderá otro objeto LookML. El parámetro extension es compatible con las exploraciones, las vistas y los paneles de LookML.

No se puede usar un explore con extension: required como explore_source para una prueba de datos. LookML Validator generará un error que indica 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 cualquier extensión del objeto o ver qué se extiende. Consulta la página de documentación Metadatos para objetos LookML a fin de obtener más información.

Detalles de implementación de extends

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

  1. Copiar el objeto que se extiende: Looker crea una copia del LookML para la vista, la exploración o el panel de LookML que se extiende. Esta copia nueva es el objeto ing.
  2. Combinar el LookML de las dos copias: Looker fusiona el LookML del objeto ed extendido en el objeto ing
  3. Resolver conflictos entre las copias: En la mayoría de los casos, si un elemento LookML se define tanto en el objeto ed extendido como en el objeto ing, se usa la versión del objeto extensible. 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 información.
  4. Aplicar LookML: Una vez que se resuelven todos los conflictos, Looker interpreta el LookML resultante mediante la lógica estándar. En otras palabras, Looker usará todos los valores predeterminados y las suposiciones estándares, al igual que con cualquier otro panel de vista, Explorar o LookML.

En las siguientes secciones, se muestran los detalles de estos pasos y se amplía una vista a modo de ejemplo. A continuación, se muestra el aspecto de nuestra vista base para la vista User:

view: user {
  suggestions: yes

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

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

A continuación, se muestra el aspecto de 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 el 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 crea una copia de esta antes de combinarse. El hecho de que se haga una copia no es muy importante que sepa aquí; es importante saber que la vista user original no se modifica y se puede usar como lo hace normalmente.

Paso 2: combina las copias

El siguiente paso es que todos los LookML de la vista ampliada (user) se combinen con la vista de extensión (user_with_age_extensions). Es importante comprender la naturaleza de esta combinación, que es simplemente una combinación de objetos LookML. En términos prácticos, esto significa que se fusiona cualquier LookML escrito de forma explícita, pero los valores predeterminados de LookML que no escribiste no se combinan. En cierta forma, es solo el texto del LookML que se está reuniendo, y nada del significado de ese texto.

Paso 3: Resuelve los conflictos

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

En general, si un elemento LookML se define tanto en el objeto extendido como en el objeto extendido ing, 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 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 parámetros en la vista extendida anularán los valores de parámetros en la vista extendida:

  • El nombre de la vista ing, que se extiende (user_with_age_extensions), anula el nombre de la vistaed extendida (user).
  • El valor de extensión ing para suggestions: no anula el valor de extensión ed suggestions: yes.
  • La vista extendida tiene una dimensión llamada age, que no existe en la vista ampliada (sin conflicto).
  • La vista extendidaed tiene una dimensión llamada name, que no existe en la vista ampliadaing (sin conflicto).
  • El valor type: string de la dimensión status en la vista de ampliación anula el valor de type: number en la vista ampliada.
  • La dimensión status tiene un parámetro sql, que no existe en la vista ampliación (sin conflicto).

El hecho de que los valores predeterminados de LookML aún no se consideren es importante porque no se comete el error de pensar que los conflictos entre los valores predeterminados se están resolviendo. En realidad, solo se ignoran en este paso. Por este motivo, debemos agregar parámetros adicionales de forma explícita cuando se extienden objetos:

En este ejemplo en particular, no agregamos sql_table_name a la vista Usuario, lo que generará algunos problemas en el siguiente paso.

Paso 4: Interpreta el LookML como normal

En el paso final, el LookML resultante se interpreta como normal, incluidos todos los valores predeterminados. En este ejemplo en particular, terminamos con LookML que incluye view: user_with_age_extensions, pero no un parámetro sql_table_name. Como resultado, Looker asumirá 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. Por este motivo, debemos agregar un parámetro sql_table_name a cualquier vista que se extenderá. Si agregas view_name y view_label a Exploraciones que se extenderán, se evitarán problemas similares.

Combinación de extensiones

Existen algunas formas de aprovechar los objetos LookML con extensiones:

Para ver un ejemplo de un caso práctico avanzado y leer las sugerencias para la solución de problemas, consulte el artículo del Centro de ayuda Cómo solucionar un ejemplo de un caso práctico avanzado de extends.

Extiende más de un objeto al mismo tiempo

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

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

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

Cómo encadenar varias extensiones

También puedes encadenar tantas extensiones como desees. Por ejemplo:

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

Nuevamente, 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.

Combina parámetros

En general, si un elemento LookML se define tanto en el objeto extendido como en el objeto extendido ing, se usa la versión en el objeto extendido. Este fue el caso en el ejemplo de implementación de esta página.

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

Algunos parámetros son aditivos

En muchos casos, si el objeto extendido contiene el mismo parámetro que el objeto que se extiende, los valores del objeto extendido anularán los del parámetro 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 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"
    }
  }
}

Aquí está la vista carriers_extended, que extiende la vista carriers. La vista carriers_extended también tiene una dimensión name con diferentes configuraciones 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 tendrá ambos vínculos. La dimensión se ve de la siguiente manera en Explorar:

Opciones adicionales con listas

Cuando trabajas con listas, puedes optar por combinarlas, en lugar de tener la lista de objetos extendidos. 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 se extiende y, por lo tanto, ganará y hará que animals contenga [dog, cat]. Sin embargo, si usas el conjunto EXTENDED* especial, 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].

Combinación en lugar de reemplazo durante la resolución de conflictos

En general, si existe algún conflicto durante la extensión, el objeto que se extiende gana. Por ejemplo, tome 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 con 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 es la extensión.

Sin embargo, también puede optar por combinar las definiciones si lo desea. Para ello, debe usar 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 ganar la definición product_short_descriptions, tomará la definición de products y la insertará donde se use ${EXTENDED}. La definición resultante para 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 extiendes un objeto y luego defines etiquetas o descripciones nuevas, debes proporcionar definiciones de localización en los archivos de strings de configuración regional del proyecto. Consulta la página de documentación Localiza tu modelo de LookML para obtener más información.