[Looker] extendsをきちんと理解する #looker

2021.08.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Lookerオブジェクトを継承できるextendsは、何が嬉しくて、どう使うのかをご紹介します。

extendsとは?

extendsは、viewとexploreに書けるパラメータです。extendsで指定したviewまたはexploreを継承します。

extendsの何が嬉しいのか?

身近な例で言うと、以下のようなことはないでしょうか?

データベースの各テーブルに共通してある項目(modified_atなど)をそれぞれのviewで管理していませんか?メンテナンスが煩雑に感じることはありませんか?そのような場合、共通項目を別のviewファイルにまとめておいて、それを複数のviewで継承することで、まとめた項目のメンテナンスを一括管理できてしまいます。

このように、一度定義した項目を再定義しないで済むので、コードを複数の場所で使いまわしたいときに非常に便利です。(コードの再利用性が高まるというわけです。嬉ぴよ)

あとは、LookMLダッシュボードもextendsすることができます。

LookMLダッシュボードの一番の難点はレイアウトの煩雑さです。そこで、あらかじめ数種類のLooKMLダッシュボードのレイアウトを用意しておき、新しいダッシュボードを作る際には用意したレイアウトから合うものを使用するといった、LookMLダッシュボードでダッシュボードを管理する場合のユースケースが挙げられます。

extendsの使い方

extendsは単体で使う分には、記述も動きも非常にシンプルですが、exploreで使用する際には注意する点があるので、このことについて重点的にご紹介します。(viewはさらさらっと)

extends (for view)

まずは、includeパラメータでextendsで指定するviewファイルを指定して、extends先のviewファイルでも参照できるようにします。

次に、viewにextendsパラメータで継承したいviewを指定して完了です。

例えば、上図のようにextention_order_itemsviewというプロジェクトに存在しないviewを定義しても、プロジェクトにきちんと存在しているorder_itemsviewを継承しているので、下図の通りExploreにフィールドが表示されます。

extends (for explore)

exploreでのextendsもviewと同様、継承したいexploreをextendsパラメータで指定するだけです。

extended_order_itemsという存在しないviewを定義して、きちんと存在するorder_itemsviewを元にしたexploreを継承したので、Exploreの画面の上では瓜二つのExploreが出来上がりました。

exploreでextendsを使う際の注意点

先程の例では、order_itemsexploreにview_name: order_itemsと定義しています。view_nameパラメータは、exploreに明示的に参照するviewを定義できるパラメータです。

こちらを明示的に定義しておかないと、extends先でオブジェクト名が変わってしまうことによるエラーの原因になってしまいます。

上の例のコードでextendsの動きとともに順を追って説明します。

extendsされると、まず、extendsで指定されたexploreがコピーされます。

次に、extends先のexploreをコピーしたexploreにマージします。この際に起こるコンフリクトではextends先に記述されているものが優先されます。

この時にview_nameを定義していないと、継承先のexploreでjoinするのに指定していたorder_items.user_idが参照できないviewとしてエラーになってしまいます。

しかし下図の通り、明示的にview_nameでorder_itemsを参照するように定義しておくと、explore名が変わっても参照先が定義されているのでエラーになりません。

extention: required

共通するviewのフィールドをまとめておく時など、extendsする用途以外では使用しない場合があります。その際には、extention: requiredを定義しておくと開発者ではないユーザーには表示されません。

まとめ

extendsについて理解できましたか?

LookMLを開発していて、ここの記述をもう少しシンプルにできないかな?という時には、extendsが使えないか考えてみてください!