Firebase analytics でBigQuery連携する時のLookMLのtips

# 対象

* [Looker](https://looker.com/)を導入している
* [Firebase analytics](https://firebase.google.com/docs/analytics/?hl=ja)を導入していてBigQueryと連携して使用している
* Firebaseを導入した多数(数十単位ですｗ)のゲームを分析しようとしている
* 全てのゲーム用のBigQueryのテーブル定義のLookMLを作るのが手間なので、一つのLookMLの定義を使いまわしたい

人向けの記事になります。

# 背景

試作品も含めて多くのゲームを開発するにあたって、1ゲームごとにFirebaseプロジェクトを作成しています。そのため、ゲームの個数だけスキーマが同じBigQueryのテーブルが作成されることになります。実直に行う場合、ゲームの個数分のLookML定義を作成することになりますが、ゲームが増えてくると

* Exploreで出てくるテーブル一覧が増えすぎてひどいことになる
* 汎用的なLookやDashboardもアプリごとに作成する必要があるため、Browseでも一覧にLook,Dashboardが増えすぎてひどいことになる

などの問題が出てきます。
そのため、LookMLの定義は一つにして、parameterで各ゲームに切り替えられるようにしようと考えました。


# ベストの解決法

[コメント](https://qiita.com/takezoux2/items/df37a59562e17ba59c33#comment-20d7b965713c470f4a0c
)にいただいた解決方法です。これが最もスマートだと思います。

parameterをtype:stringで定義し、Liquidでrubyのテンプレートエンジンが使えることを利用し、シングルクォーテーションをリプレイスして取り除きます。

```yaml:参考
view: firebase_bigquery_table {
  sql_table_name: `{{ data_set_name._parameter_value | replace: "'", ""  }}.events_*` ;;

  parameter: data_set_name {
    type: string
    allowed_value: {
      label: "Game 1"
      value: "game-one.analytics_184196333"
    }
    allowed_value: {
      label: "Game 2"
      value: "game-two.analytics_215474048"
    }
    allowed_value: {
      label: "Game 3"
      value: "game-three.analytics_32888192"
    }
  }
  // Definitions
}
```
reference
https://docs.looker.com/ja/reference/field-params/parameter#using_parameter_in_a_logical_statement
https://shopify.github.io/liquid/filters/replace/


# 失敗した解決法

LookMLマスターの方は、[typeをunquotedにしたparameter](https://docs.looker.com/reference/field-reference/dimension-type-reference#unquoted)を用意して、テーブル名の部分を置き換えれば良いだけじゃないかとお思いかと思います。

```yaml:参考
view: firebase_bigquery_table {
  sql_table_name: `{% parameter data_set_name %}.events_*` ;;

  parameter: data_set_name {
    type: unquoted
    allowed_value: {
      label: "Game 1"
      value: "game-one.analytics_184196333"
    }
    allowed_value: {
      label: "Game 2"
      value: "game-two.analytics_215474048"
    }
    allowed_value: {
      label: "Game 3"
      value: "game-three.analytics_32888192"
    }
  }
  // Definitions
}
```

しかし、そうは問屋が卸しません。
なぜならば、unquotedは、許容される文字が限られており

```
type: unquoted parameters are restricted to the characters A through Z and 0 through 9 (no spaces or other special characters).
```

とドキュメントにあるように、アルファベットと数字以外の文字は入力するとエラーになってしまいます。Firebaseの場合プロジェクト作成時に自動でBigQueryのプロジェクト名がつけられてしまい、その名前には-(ハイフン)が含まれてしまうことがあるため、unquotedなparameterでは名前の置き換えをしようとすると、無効な文字が含まれているためエラーとなってしまいます。

# あまり上手くない解決法

最終的にたどり着いたのは、[Liquid parameter](https://docs.looker.com/reference/liquid-variables)を利用して、ifを使って任意のunquotedな文字列を挿入する方法です。
 
```yaml:参考
view: firebase_bigquery_table {
  // SQL上では、「game-one.analytics_32888192.events_*」といった形になります
  // 改行、スペースが入ると、それもテーブル名に反映されてしまうので１ライナーで書く必要があります。
  sql_table_name: `{% if data_set_name._parameter_value == "'G1'" %}game-one.analytics_184196333{% elsif data_set_name._parameter_value == "'G2'" %}game-two.analytics_215474048{% else %}game-three.analytics_32888192{% endif %}.events_*` ;;

  parameter: data_set_name {
    type: string
    allowed_value: {
      label: "Game 1"
      value: "G1"
    }
    allowed_value: {
      label: "Game 2"
      value: "G2"
    }
    allowed_value: {
      label: "Game 3"
      value: "G3"
    }
  }

  // Definitions
}

```

[parameter](https://docs.looker.com/reference/field-params/parameter)から、ゲームの名前を受け取りそれをLiquid parameterで判定し、BigQueryのテーブル参照に置き換えています。
注意点としては、sql_table_nameには、スペース、改行を入れては行けないとういことです。そのため、sql_table_nameの列は１行である必要があるため、非常に長くなってしまいます。(そのため、allowed_valueで短い名前にマップして多少緩和をしています)


# おまけ

[Firebase analyticsをBigQueryにExportした際のSchema](https://support.google.com/firebase/answer/7029846?hl=ja)