Como maximizar a reutilização do código com o DRY LookML: como definir medidas reutilizáveis para cálculos complexos

Ao definir cálculos complexos no LookML, pode ser útil dividi-los em etapas intermediárias que envolvem cálculos mais simples. Ao criar medidas intermediárias, você torna os cálculos mais legíveis, fáceis de manter e menos propensos a erros, já que só precisa garantir que cada cálculo intermediário esteja correto em um só lugar.

Esta página mostra um exemplo de como tornar seus cálculos no LookML mais legíveis e fáceis de manter definindo medidas intermediárias para dividir cálculos complexos em etapas menores e mais gerenciáveis.

Componentes

Pré-requisitos

Exemplo: dividir um cálculo complexo em medidas intermediárias

Suponha que você tenha uma empresa que vende produtos on-line e queira definir medidas para calcular o lucro total e os dividendos dos acionistas. Uma maneira de fazer isso é definir duas medições: total_profit e shareholder_dividends, da seguinte maneira:


measure: total_profit {
  type: number
  sql: SUM(${orders.sale_price}) - SUM(${employees.salary}) - SUM(${products.cost}) ;;
}

measure: shareholder_dividends
  description: "We give shareholders 60% of our total profits."
  type: number
  sql: 0.6 * (SUM(${orders.sale_price}) - SUM(${employees.salary}) - SUM(${products.cost})) ;;

Neste exemplo, o cálculo SUM(${orders.sale_price}) - SUM(${employees.salary}) - SUM(${products.cost}) é reutilizado no parâmetro sql para as duas medidas. Se você precisar atualizar a definição desse cálculo, por exemplo, para corrigir um erro, terá que atualizar o cálculo manualmente para as duas medidas.

Para facilitar a manutenção dessas definições de medidas, reutilize a medida total_profit no cálculo na medida shareholder_dividends:


measure: total_profit {
  type: number
  sql: SUM(${orders.sale_price}) - SUM(${employees.salary}) - SUM(${products.cost}) ;;
}

measure: shareholder_dividends
  description: "We give shareholders 60% of our total profits."
  type: number
  sql: 0.6 * ${total_profit} ;;

Talvez você queira dividir o cálculo em total_profit em medidas ainda mais simples que possam ser reutilizadas em outros cálculos. Por exemplo, é possível criar medidas de type: sum chamadas total_sales, total_revenue, total_cost e total_salary:


measure: total_sales {
  hidden: yes
  type: sum
  sql: ${orders.sale_price} ;;
}

measure: total_revenue {
  hidden: yes
  type: number
  sql: ${total_sales} ;;
}

measure: total_cost {
  hidden: yes
  type: sum
  sql: ${products.cost} ;;
}

measure: total_salary {
  hidden: yes
  type: sum
  sql: ${employees.salary} ;;
}

É possível reutilizar os campos intermediários definidos da seguinte maneira:


measure: total_expenses {
  type: number
  sql: ${total_cost} + ${total_salary} ;;
}

measure: total_profit {
  type: number
  sql: ${total_revenue} - ${total_expenses} ;;
}

measure: shareholder_dividends {
  description: "We give shareholders 60% of our total profits."
  type: number
  sql: 0.6 * ${total_profit} ;;
}

Embora você tenha definido mais medidas, essas medidas intermediárias podem ser reutilizadas em outros cálculos, e será mais fácil corrigir um erro ou fazer alterações nos cálculos usados em várias medidas.