Menggunakan kembali kode dengan ekstensi

Ini adalah topik lanjutan yang mengasumsikan bahwa pembaca memiliki pengetahuan yang kuat tentang LookML.

Ringkasan

Seiring bertambahnya ukuran dan kompleksitas model LookML, penggunaan kembali LookML di beberapa tempat akan semakin berguna. Parameter extends memungkinkan Anda menggunakan kembali kode, yang membantu Anda melakukan hal berikut:

  • Tulis kode DRY (don't repeat yourself), sehingga Anda dapat menentukan berbagai hal di satu tempat, sehingga kode Anda lebih konsisten dan lebih cepat diedit
  • Mengelola kumpulan kolom yang berbeda untuk pengguna yang berbeda
  • Membagikan pola desain di berbagai bagian project
  • Menggunakan kembali kumpulan join, dimensi, atau ukuran di seluruh project

Untuk memperluas objek LookML, Anda membuat objek LookML baru, lalu menambahkan parameter extends untuk menunjukkan bahwa objek baru tersebut adalah ekstensi dari objek yang ada. Artinya, project Anda akan memiliki dua versi objek LookML. Jika ada konflik, objek yang diperluas akan diprioritaskan dan mengganti setelan objek yang diperluas. Lihat bagian Detail penerapan untuk extends di halaman ini untuk mengetahui detailnya.

Lihat peningkatan LookML: Memperluas tampilan atau Jelajah sangat ideal untuk skenario saat Anda ingin memiliki beberapa versi tampilan atau Jelajah. Namun, jika tujuan Anda hanya untuk mengubah tampilan atau Jelajah tanpa mengedit file LookML yang berisinya, sebaiknya gunakan penyempurnaan. Anda juga dapat menggunakan parameter extends di dalam perincian. Lihat halaman dokumentasi Peningkatan LookML untuk mengetahui informasi selengkapnya dan kasus penggunaan.

Anda dapat memperluas tampilan, Jelajahi, dan dasbor LookML:

Model tidak dapat diperluas, dan Anda tidak dapat menyertakan file model dalam file model lain. Sebagai gantinya, jika ingin menggunakan kembali atau memperluas Jelajahi di seluruh model, Anda dapat membuat file Jelajahi terpisah, lalu menyertakan file Jelajahi tersebut dalam file model.

Lihat contoh berikut tentang memperluas Jelajahi dan memperluas dasbor LookML.

Memperluas Eksplorasi

Berikut adalah contoh perluasan Jelajahi:

explore: customer {
  persist_for: "12 hours"
}

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

Dalam contoh ini, kita memiliki Jelajah yang disebut Pelanggan, dan kita membuat Jelajah kedua yang disebut Transaksi yang memperluasnya. Semua yang ada di Pelanggan, seperti join-nya, akan disertakan dalam Transaksi. Semua yang ada di Transaksi akan tetap berada di Transaksi.

Namun, perhatikan bahwa ada konflik: Jelajah Pelanggan menyatakan bahwa setelan persist_for harus 12 jam, tetapi Jelajah Transaksi menyatakan bahwa setelan tersebut harus 5 menit. Untuk Jelajahi Transaksi, setelan persist_for: "5 minutes" akan digunakan, karena setelan ini menimpa setelan dari Jelajahi yang diperluas.

Memperluas dasbor LookML

Untuk memperluas dasbor LookML, dasbor yang diperluas dan yang memperluas harus disertakan dalam file model. Jika dasbor yang menggunakan parameter extends disertakan dalam file model tanpa dasbor dasar yang diperluas, Anda akan mendapatkan error validasi LookML bahwa dasbor dasar tidak dapat ditemukan (di antara error lainnya).

Berikut adalah contoh file dasbor:

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

Kita dapat membuat file dasbor LookML baru dan memperluas dasbor FAA dengan menambahkan kartu baru:

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

Karena memperluas dasbor FAA, dasbor FAA Additional akan menyertakan kartu apa pun yang ditentukan dalam file faa.dashboard.lookml. Selain itu, dasbor FAA Additional akan memiliki kartu yang ditentukan dalam file faa_additional.dashboard.lookml-nya sendiri.

Cara termudah untuk membuat dasbor LookML adalah dengan mendapatkan LookML dari dasbor yang ditentukan pengguna. Anda juga dapat menggunakan teknik ini untuk mendapatkan LookML untuk setiap kartu dasbor. Jika Anda menggunakan metode ini, pastikan posisi kartu tidak tumpang-tindih. Dalam contoh faa.dashboard.lookml dan faa_additional.dashboard.lookml, kartu berada di baris atas dasbor, yang ditunjukkan oleh row: 0:

File: faa.dashboard.lookml


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

Namun, kartu baru yang kita tambahkan di dasbor FAA Additional berada di col: 8 sehingga ditampilkan di samping kartu dari dasbor yang diperluas:

File: faa_additional.dashboard.lookml


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

Hal ini mudah terlewatkan karena elemen ini berada di file dasbor yang berbeda. Jadi, jika Anda menambahkan kartu ke dasbor yang diperluas, pastikan untuk memeriksa konflik posisi antara kartu di dasbor yang diperluas dan kartu di dasbor yang diperluas.

Memerlukan ekstensi

Anda dapat menggunakan parameter extension: required untuk menandai objek LookML sebagai memerlukan ekstensi, yang berarti objek tersebut tidak dapat digunakan sendiri. Objek dengan extension: required tidak terlihat oleh pengguna secara mandiri; objek ini hanya dimaksudkan untuk bertindak sebagai titik awal yang akan diperluas oleh objek LookML lain. Parameter extension didukung untuk Jelajah, tampilan, dan dasbor LookML.

explore dengan extension: required tidak dapat digunakan sebagai explore_source untuk pengujian data. LookML Validator akan menampilkan error yang menyatakan bahwa explore_source tidak dapat ditemukan.

Menggunakan metadata untuk melihat ekstensi objek

Anda dapat mengklik parameter explore atau view di IDE Looker dan menggunakan panel metadata untuk melihat ekstensi pada objek, atau untuk melihat objek yang diperluas. Lihat halaman dokumentasi Metadata untuk objek LookML untuk mengetahui informasinya.

Detail implementasi untuk extends

Berikut adalah langkah-langkah yang dilakukan Looker saat memperluas objek LookML:

  1. Menyalin objek yang sedang diperluas: Looker membuat salinan LookML untuk dasbor tampilan, Jelajah, atau LookML yang sedang diperluas. Salinan baru ini adalah objek yang diperluas.
  2. Gabungkan LookML dari dua salinan: Looker menggabungkan LookML dari objek yang diperluas ke dalam objek yang diperluas.
  3. Menyelesaikan konflik antara salinan: Sebagian besar, jika elemen LookML ditentukan dalam objek yang diperluas dan objek yang memperluas, versi dalam objek yang diperluas akan digunakan. Namun, dalam kasus lain, ekstensi akan menggabungkan nilai parameter, bukan mengganti nilai. Lihat bagian Menggabungkan parameter di halaman ini untuk mengetahui informasinya.
  4. Terapkan LookML: Setelah semua konflik diselesaikan, Looker akan menafsirkan LookML yang dihasilkan menggunakan logika standar. Dengan kata lain, Looker akan menggunakan semua default dan asumsi standar seperti pada dasbor tampilan, Jelajahi, atau LookML lainnya.

Bagian berikut menunjukkan detail langkah-langkah ini, dengan memperluas tampilan sebagai contoh. Berikut adalah LookML untuk tampilan dasar kita, tampilan Pengguna:

view: user {
  suggestions: yes

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

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

Berikut adalah LookML untuk tampilan Pengguna dengan Ekstensi Usia, yang memperluas tampilan Pengguna:

include: "/views/user.view"

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

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

  dimension: status {
    type: string
  }
}

Langkah 1: Salin LookML

Dalam hal ini, tampilan user diperluas ke tampilan user_with_age_extensions. Karena user adalah tampilan yang diperluas, salinannya dibuat sebelum penggabungan. Fakta bahwa salinan dibuat tidak terlalu penting untuk diketahui di sini; fakta bahwa tampilan user asli tidak diubah dan dapat digunakan seperti biasa adalah hal yang penting untuk diketahui.

Langkah 2: Gabungkan salinan

Langkah berikutnya adalah menggabungkan semua LookML dari tampilan yang diperluas (user) ke dalam tampilan yang diperluas (user_with_age_extensions). Penting untuk memahami sifat penggabungan ini, yang merupakan penggabungan objek LookML. Dalam praktiknya, ini berarti bahwa LookML apa pun yang ditulis secara eksplisit akan digabungkan, tetapi nilai LookML default yang belum Anda tulis tidak akan digabungkan. Dalam arti tertentu, ini hanyalah teks LookML yang digabungkan, dan tidak ada makna dari teks tersebut.

Langkah 3: Selesaikan konflik

Langkah ketiga adalah menyelesaikan konflik apa pun antara tampilan yang digabungkan.

Pada umumnya, jika elemen LookML ditentukan dalam objek yang diperluas dan objek yang memperluas, versi dalam objek yang memperluas akan digunakan. Namun, dalam kasus lain, ekstensi akan menggabungkan nilai parameter, bukan mengganti nilai. Lihat bagian Menggabungkan parameter di halaman ini untuk mengetahui informasinya.

Dalam kasus contoh user_with_age_extensions, tidak ada parameter yang aditif, dan tidak ada opsi daftar atau kata kunci sql khusus yang ditentukan, sehingga nilai parameter dalam tampilan yang diperluas akan mengganti nilai parameter dalam tampilan yang diperluas:

  • Nama tampilan yang diperluas (user_with_age_extensions) akan menggantikan nama tampilan yang diperluas (user).
  • Nilai perluasan untuk suggestions: no akan menggantikan nilai perluasan suggestions: yes.
  • Tampilan yang diperluas memiliki dimensi yang disebut age, yang tidak ada dalam tampilan yang diperluas (tidak ada konflik).
  • Tampilan yang diperluas memiliki dimensi yang disebut name, yang tidak ada dalam tampilan yang diperluas (tidak ada konflik).
  • Nilai type: string dimensi status dalam tampilan yang diperluas akan menggantikan nilai type: number dalam tampilan yang diperluas.
  • Dimensi status memiliki parameter sql, yang tidak ada dalam tampilan ekstensi (tidak ada konflik).

Fakta bahwa nilai LookML default belum dipertimbangkan adalah hal yang penting, karena Anda tidak ingin membuat kesalahan dengan berpikir bahwa konflik antara nilai default akan terselesaikan. Sebenarnya, elemen tersebut hanya diabaikan pada langkah ini. Itulah sebabnya kita perlu menambahkan parameter tambahan secara eksplisit saat memperluas objek:

Dalam contoh khusus ini, kita tidak menambahkan sql_table_name ke tampilan Pengguna, yang akan menyebabkan beberapa masalah pada langkah berikutnya.

Langkah 4: Menafsirkan LookML seperti biasa

Pada langkah terakhir, LookML yang dihasilkan akan ditafsirkan seperti biasa, termasuk semua nilai default. Dalam contoh khusus ini, LookML tampilan yang dihasilkan akan ditafsirkan sebagai berikut:

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

Perhatikan bahwa LookML yang dihasilkan menyertakan view: user_with_age_extensions, tetapi tidak ada parameter sql_table_name. Akibatnya, Looker akan mengasumsikan bahwa nilai sql_table_name sama dengan nama tampilan.

Masalahnya adalah mungkin tidak ada tabel di database kita yang bernama user_with_age_extensions. Itulah sebabnya kita perlu menambahkan parameter sql_table_name ke tampilan yang akan diperluas. Menambahkan view_name dan view_label ke Jelajah yang akan diperpanjang akan menghindari masalah serupa.

Menggabungkan ekstensi

Ada beberapa cara untuk memanfaatkan objek LookML dengan ekstensi:

Untuk melihat contoh kasus penggunaan lanjutan dan membaca tips pemecahan masalah, lihat halaman Praktik Terbaik Memecahkan masalah contoh kasus penggunaan extends lanjutan.

Memperluas lebih dari satu objek secara bersamaan

Anda dapat memperluas lebih dari satu dasbor, tampilan, atau Jelajahi secara bersamaan. Contoh:

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

Proses ekstensi berfungsi persis seperti yang dijelaskan dalam contoh penerapan, tetapi ada satu aturan tambahan tentang cara menyelesaikan konflik. Jika ada konflik antara beberapa item yang tercantum dalam parameter extends, prioritas diberikan ke item yang tercantum terakhir. Jadi, dalam contoh sebelumnya, jika ada konflik antara user_info dan marketing_info, Jelajah marketing_info akan menang.

Menautkan beberapa ekstensi

Anda juga dapat merangkai ekstensi sebanyak yang Anda inginkan. Contoh:

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

Sekali lagi, proses ekstensi berfungsi persis seperti yang dijelaskan dalam contoh penerapan, dengan satu aturan tambahan tentang resolusi konflik. Jika ada konflik, prioritas diberikan ke item terakhir dalam rantai ekstensi. Dalam contoh ini:

  • orders akan memiliki prioritas lebih tinggi daripada user_info dan marketing_info.
  • user_info akan memiliki prioritas lebih tinggi daripada marketing_info.

Menggabungkan parameter

Pada umumnya, jika elemen LookML ditentukan dalam objek yang diperluas dan objek yang memperluas, versi dalam objek yang memperluas akan digunakan. Hal ini terjadi dalam contoh implementasi di halaman ini.

Namun, dalam kasus berikut, ekstensi akan menggabungkan nilai parameter, bukan mengganti nilai:

Beberapa parameter bersifat aditive

Dalam banyak kasus, jika objek yang diperluas berisi parameter yang sama dengan objek yang diperluas, nilai objek yang diperluas akan mengganti nilai parameter objek yang diperluas. Namun, ekstensi dapat bersifat aditif untuk beberapa parameter, yang berarti bahwa nilai dari objek yang diperluas digunakan bersama dengan nilai dari objek yang diperluas.

Parameter berikut bersifat aditif:

Dalam contoh berikut, tampilan carriers memiliki dimensi name dengan parameter 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"
    }
  }
}

Berikut adalah tampilan carriers_extended, yang memperluas tampilan carriers. Tampilan carriers_extended juga memiliki dimensi name dengan setelan yang berbeda di parameter 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"
    }
  }
}

Dalam tampilan carriers_extended, kedua parameter link bersifat aditive, sehingga dimensi name akan menampilkan kedua link.

Opsi tambahan dengan daftar

Saat menggunakan daftar, Anda dapat memilih untuk menggabungkannya, bukan membuat daftar objek yang diperluas menjadi pemenang. Pertimbangkan ekstensi sederhana ini dengan daftar yang bertentangan yang disebut animals:

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

Dalam hal ini, tampilan pets melakukan perluasan, sehingga akan menang, membuat animals berisi [dog, cat]. Namun, dengan menggunakan kumpulan EXTENDED* khusus, Anda dapat menggabungkan daftar:

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

Sekarang daftar animals akan berisi [dog, cat, goldfish, guppy].

Menggabungkan, bukan mengganti, selama resolusi konflik

Pada umumnya, jika ada konflik selama ekstensi, objek yang diperluas akan menang. Misalnya, perhatikan ekstensi sederhana ini:

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

Anda dapat melihat ada konflik parameter sql dalam dimensi description. Biasanya, definisi dari product_short_descriptions hanya akan menimpa definisi dari products karena melakukan perluasan.

Namun, Anda juga dapat memilih untuk menggabungkan definisi jika mau. Untuk melakukannya, Anda akan menggunakan kata kunci ${EXTENDED} seperti ini:

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

Sekarang, konflik parameter sql akan ditangani secara berbeda. Sebagai ganti definisi product_short_descriptions yang menang, definisi akan diambil dari products dan disisipkan di tempat ${EXTENDED} digunakan. Definisi yang dihasilkan untuk description dalam hal ini adalah: LEFT(${TABLE}.full_description, 50).

Hal-hal yang perlu dipertimbangkan

Project dengan pelokalan

Saat memperluas objek, perhatikan bahwa aturan pelokalan juga berlaku untuk ekstensi Anda. Jika Anda memperluas objek, lalu menentukan label atau deskripsi baru, Anda harus memberikan definisi pelokalan dalam file string lokalitas project. Lihat halaman dokumentasi Menlokalkan model LookML untuk mengetahui informasi selengkapnya.