Menggunakan kembali kode dengan expand

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

Ringkasan

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

  • Tulis kode DRY (jangan ulangi sendiri), sehingga Anda dapat menentukan berbagai hal hanya di satu tempat, membuat kode lebih konsisten dan lebih cepat diedit
  • Mengelola berbagai kumpulan kolom untuk pengguna yang berbeda
  • Bagikan pola desain di berbagai bagian proyek Anda
  • Menggunakan kembali kumpulan gabungan, dimensi, atau ukuran di seluruh proyek

Untuk memperluas objek LookML, buat objek LookML baru, lalu tambahkan parameter extends untuk menunjukkan bahwa objek baru tersebut merupakan ekstensi dari objek yang sudah ada. Ini berarti project Anda akan memiliki dua versi objek LookML. Jika terjadi konflik, objek yang diperluas akan diprioritaskan dan menggantikan setelan objek yang diperpanjang. Lihat bagian Detail penerapan untuk extends nanti di halaman ini untuk mengetahui detailnya.

Lihat penyempurnaan LookML: Memperluas tampilan atau Explore untuk skenario ketika Anda ingin memiliki beberapa versi tampilan atau Explore. Namun, jika tujuan Anda hanyalah memodifikasi tampilan atau Explore tanpa mengedit file LookML yang memuatnya, sebaiknya Anda menggunakan penyempurnaan. Anda juga dapat menggunakan parameter extends di dalam penajaman. Lihat halaman dokumentasi penajaman LookML untuk informasi selengkapnya dan kasus penggunaan.

Anda dapat memperluas tampilan, dasbor Jelajah, dan LookML:

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

Lihat contoh berikut tentang memperluas Explore dan memperluas dasbor LookML.

Memperluas Jelajah

Berikut adalah contoh cara memperluas Jelajah:

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. Segala sesuatu yang ada di Pelanggan, seperti gabungannya, akan disertakan dalam Transaksi. Apa pun yang ada di Transaksi akan tetap ada di Transaksi.

Namun, perhatikan jika terjadi konflik: Explore Pelanggan menyatakan bahwa setelan persist_for harus berdurasi 12 jam, tetapi Explore Transaksi menyatakan bahwa setelan tersebut seharusnya 5 menit. Untuk Eksplorasi Transaksi, setelan persist_for: "5 minutes" akan digunakan, karena menimpa setelan dari Jelajah yang diperluas.

Memperluas dasbor LookML

Untuk memperluas dasbor LookML, baik dasbor yang diperluas maupun yang diperluas 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 yang tidak dapat ditemukan oleh dasbor dasar (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 Tambahan akan menyertakan ubin yang ditentukan dalam file faa.dashboard.lookml. Selain itu, dasbor FAA Tambahan akan memiliki ubin 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 petak dasbor. Jika Anda menggunakan metode ini, pastikan posisi kartu tidak tumpang-tindih. Pada contoh di atas, keduanya berada di baris atas dasbor, yang ditunjukkan dengan row: 0:

File: faa.dashboard.lookml


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

Namun, kartu baru yang kami tambahkan di dasbor Tambahan FAA ada 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 adalah hal yang mudah terlewatkan, karena elemen-elemen ini ada di file dasbor yang berbeda. Jadi, jika Anda menambahkan ubin ke dasbor yang diperluas, pastikan untuk memeriksa konflik posisi antara ubin di dasbor yang diperluas dan ubin di dasbor yang diperluas.

Mewajibkan perpanjangan

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

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

Menggunakan metadata untuk melihat ekstensi suatu objek

Anda dapat mengklik parameter explore atau view di Looker IDE 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 penerapan untuk extends

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

  1. Salin objek yang diperluas: Looker membuat salinan dasbor LookML untuk tampilan, Explore, atau LookML yang sedang diperluas. Salinan baru ini adalah objeking yang diperluas.
  2. Gabungkan LookML dari kedua salinan: Looker menggabungkan LookML objeked ke dalam objeking yang diperluas.
  3. Mengatasi konflik antara salinan: Untuk sebagian besar, jika elemen LookML ditentukan di objeked dan objek inglongs, versi dalam objek yang diperluas akan digunakan. Namun, dalam kasus lain, ekstensi akan menggabungkan parameter value, bukan mengganti nilai. Lihat bagian Menggabungkan parameter di halaman ini untuk informasinya.
  4. Menerapkan 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 dasbor tampilan, Jelajah, atau LookML lainnya.

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

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 akan dibuat sebelum penggabungan. Fakta bahwa salinan dibuat tidak terlalu penting untuk diketahui di sini; penting untuk mengetahui fakta bahwa tampilan user asli tidak berubah dan dapat digunakan seperti biasa.

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 setiap LookML yang ditulis secara eksplisit akan digabungkan, tetapi nilai LookML default yang belum Anda tulis tidak akan digabungkan. Artinya, sebenarnya hanya teks LookML yang disatukan, tanpa makna dari teks tersebut.

Langkah 3: Selesaikan konflik

Langkah ketiga adalah menyelesaikan konflik di antara tampilan yang digabungkan.

Umumnya, jika elemen LookML ditentukan dalam objek extendeded dan objeking, versi dalam objek yang diperluas akan digunakan. Namun, dalam kasus lain, ekstensi akan menggabungkan parameter value, bukan mengganti nilai. Lihat bagian Menggabungkan parameter di halaman ini untuk informasinya.

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

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

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

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

Langkah 4: Tafsirkan LookML seperti biasa

Pada langkah terakhir, LookML yang dihasilkan ditafsirkan seperti biasa, termasuk semua nilai default. Dalam contoh khusus ini, tampilan LookML 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 menyertakan parameter sql_table_name. Akibatnya, Looker akan mengasumsikan bahwa nilai sql_table_name sama dengan nama tampilan.

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

Menggabungkan ekstensi

Ada beberapa cara untuk memanfaatkan objek LookML dengan expand:

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 Eksplorasi secara bersamaan. Contoh:

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

Proses ekstensi bekerja 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 akan diberikan ke item yang tercantum terakhir. Jadi, dalam contoh di atas, jika terjadi konflik antara user_info dan marketing_info, Jelajah marketing_info akan menang.

Membuat rantai beberapa perluasan

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 implementasi, dengan satu aturan tambahan tentang penyelesaian konflik. Jika terjadi konflik, prioritas diberikan ke item terakhir dalam rantai perluasan. Dalam contoh ini:

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

Menggabungkan parameter

Umumnya, jika elemen LookML ditentukan dalam objek extendeded dan objeking, versi dalam objek yang diperluas akan digunakan. Hal ini berlaku dalam contoh penerapan di halaman ini.

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

Beberapa parameter bersifat aditif

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

Parameter berikut adalah aditif:

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

Dan 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 aditif, sehingga dimensi name akan menampilkan kedua link.

Opsi tambahan dengan daftar

Saat bekerja dengan daftar, Anda dapat memilih untuk menggabungkannya, daripada menetapkan daftar objek yang diperluas sebagai pemenangnya. Pertimbangkan ekstensi sederhana ini dengan daftar bentrok 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, sehingga membuat animals berisi [dog, cat]. Namun, dengan menggunakan set EXTENDED* khusus, Anda dapat menggabungkan daftar tersebut:

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

Biasanya, jika terjadi konflik selama perpanjangan, objek yang diperluas akan menang. Misalnya, lihat 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 adanya 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 combine definisi tersebut jika menginginkannya. 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. Bukannya yang menang, definisi product_short_descriptions akan mengambil definisi dari products dan menyisipkannya di tempat ${EXTENDED} digunakan. Definisi yang dihasilkan untuk description dalam kasus 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 lokal project Anda. Lihat halaman dokumentasi Melokalkan model LookML untuk informasi selengkapnya.