[Looker]あるフィールドからのリンク先をExploreごとに変えてみる #looker

2021.03.25

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

さがらです。

Lookerを使用する上で、ある1つのviewを用いて複数のExploreを定義する時、「あるフィールドからのリンク先をExploreごとに変更したい」ということを考えたことのある方、いるのではないでしょうか。

私も最近この課題に直面したため、解決策をまとめてみたいと思います。

前提条件

検証する内容としては、Levi'sなど服のブランドが登録されたbrandというフィールドに対して、検索結果を表示するリンクを設定することを考えます。brandというフィールドはproductsというviewで定義されているとします。

ここで、productsviewをベースとしたExploreを定義するのですが、以下のように2つのExploreに分けることを考えてみます。

  • products_googleというExploreからは、Google検索の結果にリンク
  • products_yahooというExploreからは、Yahoo検索の結果にリンク

リンク実装前のベースとなるLookMLの内容は下記のコードになります。

実装前のmodelファイルの内容

# ファイル名:test_explore_link.model
connection: "snowlooker"
include: "./products.view"

explore: products_google {
  from: products
}

explore: products_yahoo {
  from: products
}

実装前のviewファイルの内容

# ファイル名:products.view
view: products {
  sql_table_name: "PUBLIC"."PRODUCTS" ;;
  dimension: brand {
    type: string
    sql: ${TABLE}."BRAND" ;;
  }
  
  measure: count {
    type: count
  }
}

解決策

まず、この問題の解決策としては大きく2つあると思います。

  • viewのextendsを使用する
  • Liquidを使用する

この2つの方法について、それぞれまとめていきます。

方法その1:viewのextendsを使用する

まず1つ目の方法は、extendsを用いて products_googleというview、 products_yahooというview、それぞれ定義する方法です。

この方法で実装した後のコードは下記のようになります。

方法その1実装後のmodelファイルの内容

products_googleというview、 products_yahooというview、それぞれ定義するのでincludeが必要になります。

connection: "snowlooker"
include: "./products_google.view"
include: "./products_yahoo.view"

explore: products_google {
}

explore: products_yahoo {
}

方法その1実装後のviewファイルの内容

extends元となるproductsというview、extends先となるproducts_googleというview、 products_yahooというview、合計3つのviewの定義が必要となります。

# ファイル名:products.view
view: products {
  extension: required

  dimension: brand {
    type: string
    sql: ${TABLE}."BRAND" ;;
  }

  measure: count {
    type: count
  }
}
# ファイル名:products_google.view
include: "./products.view"

view: products_google {
  extends: [products]
  sql_table_name: "PUBLIC"."PRODUCTS" ;;

  dimension: brand {
    link: {
      label: "search results by google"
      url: "http://www.google.com/search?q={{ value | url_encode }}"
    }
  }
}
# ファイル名:products_yahoo.view
include: "./products.view"

view: products_yahoo {
  extends: [products]
  sql_table_name: "PUBLIC"."PRODUCTS" ;;

  dimension: brand {
    link: {
      label: "search results by yahoo"
      url: "https://search.yahoo.co.jp/search?p={{ value | url_encode }}"
    }
  }
}

方法その2:Liquidを使用する

2つ目の方法は、Liquidを駆使する方法です。

linkパラメータ内はLiquidが使用できるので、_explore._nameという現在のExplore名を取得できるLiquid変数とCASEを使って、リンク先を動的に変化させてみます。

この方法で実装した後のコードは下記のようになります。

方法その2実装後のmodelファイルの内容

元のviewの対象となるフィールドだけLiquidの記述が必要なので、modelファイルは実装前の状態から特に変更する必要はありません。

# ファイル名:test_explore_link.model
connection: "snowlooker"
include: "./products.view"

explore: products_google {
  from: products
}

explore: products_yahoo {
  from: products
}

方法その2実装後のviewファイルの内容

Liquidを使って場合分けをするため、urlパラメータの内容が少し複雑になります。

ちなみにlabelも方法その1のように変化させることを考えると、同じようなLiquidをlabel側にも書かないといけません。(同じ構成のコードを書いて長くなるだけのため、この例では実装していません。)

# ファイル名:products.view
view: products {
  sql_table_name: "PUBLIC"."PRODUCTS" ;;
  dimension: brand {
    type: string
    sql: ${TABLE}."BRAND" ;;
    link: {
      label: "search results"
      url: "{% case _explore._name %}
              {% when 'products_google' %}
                http://www.google.com/search?q={{ value | url_encode }}
              {% else %}
                https://search.yahoo.co.jp/search?p={{ value | url_encode }}
            {% endcase %}"
    }
  }
  
    measure: count {
    type: count
  }
}

どう使い分けるべきか?

事例はとてもシンプルな内容でしたが、「あるフィールドからのリンク先をExploreごとに変更する」ための、2つの方法をまとめてみました。

ですが、「どちらを採用すべきなのか?」判断が難しい所だと思いますので、個人的にそれぞれの方法のメリット・デメリット・使いたい場面をまとめて、本ブログを締めたいと思います。

方法その1:viewのextendsを使用する

  • メリット
    • extends時に他のフィールドも内容を変更したい場合、その変更内容もこの実装のついでにまとめて対応できる
    • viewごとに実装することになるため、リンク先を変更したviewを複数のExploreで使い回せる
  • デメリット
    • 1つリンク先が増える度に、extendsしたviewが増えていってしまう
  • 使いたい場面
    • あるviewのあるフィールドのリンク先をExploreごとに変更すること以外に、そのviewの中でExploreに応じて内容を変更したいフィールドが他にもたくさんある場合

方法その2:Liquidを使用する

  • メリット
    • 対象のviewのフィールド内でLiquidを書くだけで済む
    • extendsしないため、viewの数が増えなくて済む
  • デメリット
    • リンク先を分ける必要があるExploreが多い場合、冗長なLiquidを書くことになってしまう
  • 使いたい場面
    • 実装対象のviewの中で、使用するExploreごとに内容を変更したいフィールドが他にない場合(Exploreごとに変更したい箇所はリンク先だけ、の場合)