Redashで異なるデータソースのデータをJoinする & ちょこっとTips

# 概要

　Redashで異なるデータソースのデータをJoinして表示するための方法を説明したいと思います
結論から言いますと、（2017.6.11時点）異なるデータソースをJoinする機能はまだ公式リリースされていない（リリース延期？）
　そのためこの機能を実現するには、Pythonで自力でマージする必要があります。自力でやらなきゃいけないと聞くとやる気がなくなると思いますが、逆に言うとRedashが対応していないこともPythonで好きに作れるのであれもこれも出来ちゃいます！実装方法も簡単なのでがんばりましょう！
　また、RedashではSalesforceのデータソースに対応しているが、完成度がイマイチなこと（複数階層のリレーションを参照できない）もあり、この方法で対応できるかと思います


# 準備

## Python Scriptの有効化

環境変数```REDASH_ADDITIONAL_QUERY_RUNNERS = "redash.query_runner.python"```を追加

参考：[Re:dash の Python データソースで複数のクエリーの結果を組み合わせる](http://tbpgr.hatenablog.com/entry/2016/10/31/233136)

## データソースにPythonを追加

![python datasource.png](https://qiita-image-store.s3.amazonaws.com/0/30522/d6b8fb21-7c13-ad8d-2209-2a6903fc05f0.png)

**※Pythonコードでimportするライブラリは予め「Modules to import prior to running the script」に追加する必要がある**

# 実装

実装は至ってシンプルです
ループでガラガラっぽんするだけですｗ

例）ユーザIDに一致するユーザ名をユーザ情報データソースから取得する

python初心者なのでご了承ください。。。

```
# 日付=>文字列変換用
from datetime import datetime

# クエリの実行
# get_query_result(クエリ番号)またはexecute_query('データソース名', sql文)でデータを取得
users = get_query_result(1)    # user id datasource
userinfo = get_query_result(2) # user info datasource

result = {}  # データ表示用のオブジェクト

# user id: user nameのマップを作成
mapUserName = {}
for row in userinfo['rows']:
  # id = user id
  # name = user name
  mapUserName[row['id']] = row['name']

# mapUserNameに一致するuser nameを取得
for row in users['rows']:
  row['username'] = mapUserName[row['userid']]
  row['date'] = row['date'].strftime("%Y-%m-%d %H:%M")  # 日付型を文字列に変換

  # 結果表示用に行データをセット（1行ずつ）
  add_result_row(result, {'userid': row['userid'],
                          'username::filter': row['username'],   # 絞り込み用フィルタ項目
                          'date': row['date']})

# 結果表示用の列定義
add_result_column(result, 'userid', '', 'string')
add_result_column(result, 'username::filter', '', 'string')   # 絞り込み用フィルタ項目
add_result_column(result, 'date', '', 'string')

```

## 解説

### クエリの実行
定義済みのクエリを利用する場合は```get_query_result(クエリ番号)```
個別（動的なSQL）で実装する場合は、```execute_query('データソース名', sql文)```

クエリ番号は「queries」のurlから取得します
「http://localhost/queries/18 」なら「18」

### データ取得
queryで取得したデータはrowsプロパティ配下に格納されます

### 日付のフォーマット
redashでは以下の設定を追加することで日付をフォーマットしてくれます

環境変数に```REDASH_DATE_FORMAT: "YYYY/MM/DD"```を追加

ただし、日付データは表示結果テーブルでは整形されますが、「Pivot Table」では整形されない
なので、文字列に変換してから出力するようにしています

### フィルタ表示

結果表示テーブルにデータを絞り込む用のフィルタリング項目を追加することができます
項目名に```::filter``` または ```::multi-filter```を追加

詳細[Re:dashの小技いろいろ](http://blue1st-tech.hateblo.jp/entry/2016/09/04/224200)

SalesforceではSelect句にAS エイリアスを付与することができないので、この方法を用いてフィルタリング項目として設定できます


### 行データの定義
```
add_result_row(result, {'カラム名1': '値', 'カラム名2': '値'})
```

### 列定義
```
add_result_column(result, 'カラム名1', '', 'string')
add_result_column(result, 'カラム名2', '', 'integer')
```


# Tips

## CLIでユーザ追加

```
> ./manage.py users create {user name} {user's email}
```

## CLIでユーザPW変更

```
> ./manage.py users password {user's email} {new password}
```


# 参照

- [Re:dash環境変数一覧](https://redash.io/help-onpremise/setup/settings-environment-variables.html)
- [データソース型一覧](https://redash.io/help-onpremise/how-rd-works/data-source-results-format.html)
- [Re:dash API 一覧](https://people-mozilla.org/~ashort/redash_docs/api.html)
- [Re:dashの小技いろいろ](http://blue1st-tech.hateblo.jp/entry/2016/09/04/224200)
- [Re:dash の基本まとめ](http://tbpgr.hatenablog.com/entry/2016/08/15/024806)