
ThoughtSpotでFilter付きでJoinを行う方法をご紹介します
AkimasaKajitaniです。
今回は、ThoughtSpotコミュニティに投稿されたナレッジベースからちょっと試してみたいと思います。
Managing Filters in Joins
https://community.thoughtspot.com/s/article/Managing-Filters-in-Joins
こちらの記事、ちょっと読んでみると正直よくわからなかったので、実際に試してみましょう。
インプット
今回のデータはこちらの2つです。
ts_join_filter_opportunity:
こちらは、顧客名の一覧です(本来は顧客名以外にもいろんな属性がついていると考えていただければ幸いです)。
ts_join_filter_status:
こちらは、各Opportunityに対してどのようなステータスになっているか、という表です。いわゆるFact的なテーブルです。
お題
先程提示した2つのテーブルを用いていきます。StatusがActiveのもののみ表示したいとします。
このような場合、普通にOpportunity_idで結合し、フィルターでStatus = Activeとすると思います。
検索トークン:
Customer Name、Status、Opportunity_idとさらにフィルタとしてActiveを入れています。
実際の表は以下のようになります。
これで基本的には欲しいものが得られています。
ただ、ここで一つ要件を加えてみたいと思います。常にStatusがActiveのもののみエンドユーザーに見せたくて、Activeじゃないものを見せたくない、とします。しかしながら、エンドユーザーはこの「Active」の文言を消すと、簡単にすべてのデータを見ることができます。しかしそのようなことをエンドユーザーにしてほしくない、とします。
このような時に、元記事の「Managing Filters in Joins」の機能が活躍します。
ソリューション
実際のやり方としては、モデルのTMLにフィルタを書き加える、ということになります。
まず、フィルタを普通に指定するもともとのやり方を見てみましょう。この場合のモデルのTMLは以下のようになります(ジョインがローカルジョインの場合のTMLです)。
guid: d085056f-f279-428c-90bf-28a0ac76ad2a
model:
name: TS_Join_Filter_Sample
model_tables:
- name: ts_join_filter_opportunity
- name: ts_join_filter_status
joins:
- with: ts_join_filter_opportunity
'on': '[ts_join_filter_status::Opportunity_id] = [ts_join_filter_opportunity::Opportunity_id]'
type: INNER
cardinality: ONE_TO_ONE
columns:
- name: Customer Name
column_id: ts_join_filter_opportunity::Customer_name
properties:
column_type: ATTRIBUTE
index_type: DONT_INDEX
- name: Opportunity Id
column_id: ts_join_filter_opportunity::Opportunity_id
properties:
column_type: ATTRIBUTE
index_type: DONT_INDEX
- name: Status
column_id: ts_join_filter_status::Status
properties:
column_type: ATTRIBUTE
index_type: DONT_INDEX
properties:
is_bypass_rls: false
join_progressive: true
spotter_config:
is_spotter_enabled: false
結合の条件は、「model_tables」のところの、「joins」のところで定義されています。どの項目を紐づけるか、というところが「on」句となります。
on句だけ抜き出してみましょう。
'on': '[ts_join_filter_status::Opportunity_id] = [ts_join_filter_opportunity::Opportunity_id]'
on句の部分を見ると、「テーブル部分」::「項目名」という形で指定するのがわかるかと思います。
今回の方法は、このon句の部分に、フィルタ条件まで書き込んでしまうところがポイントです。今回やりたいのは、ts_join_filter_statusというテーブルの「status」という項目がActiveの場合のみ結合したい、ということになります。これを実現する条件は以下のように書けます。
[ts_join_filter_status::Status] = 'Active'
この条件をon句の部分に付け加えてみましょう。以下のように書くことができます。
'on': "([ts_join_filter_status::Opportunity_id] = [ts_join_filter_opportunity::Opportunity_id]) AND [ts_join_filter_status::Status] = 'Active'"
もともとの条件はシングルクオーテーションでくくられていましたが、それをダブルクォテーションに変更してから上の条件式を追加しています。
実際のTMLの画面は以下のようになります(on句付近のみの抜き出しです)。
これでモデルを保存し、表示してみましょう。以下のようにActiveのフィルタを入れずにトークン検索してみると・・・
以下のように確かにActive以外の項目が表示されません。
つまり、フィルタ条件を検索の際に入れなくても、モデルの時点でこっそりとフィルタを入れることができた、ということになります。これならエンドユーザーの方に気づかれずにフィルタを効かせることができる、ということになります。
ちなみに、このようにフィルタを生かしたJOINを作った場合に、結合を編集しようとすると、以下のように注意文が出てきます。
この状態で、カーディナリティなどは変更しても特に問題ありませんでした。ただ、JOINの項目はグレーアウトして変更することができないため、項目を変更したい時は、TMLで編集する必要があります。
※ThouhtSpot Version 10.13.0.cl-87