Transactd 2.0 その2 QueryBuilder で簡単NoSQLクエリー
Transactd 2.0 その1では、読み取りクエリーの使い方について説明しました。今回は、そのクエリーのコードをVisualに生成できるツール、QueryBuilderを紹介します。
QueryBuilderでは、GUIの画面上でデータベースやテーブル、キーの値や条件などを指定すると、Transactdのクエリーのソースコードを生成できます。生成されたコードをコピーアンドペーストするだけでデータベースへのアクセスコードが完成します。開発工程をとても簡単にしてくれること間違いなしです。生成可能ソースの言語は現在のところ、C++/PHP/Ruby/JScriptです。
また、実際にクエリーを実行して結果や実行速度を確認することもできます。
QueryBuilderのインストール
QueryBuilderは現在Beta版で、WindowsとMac OS X版があります。どちらも、インストールパッケージで簡単にインストールできます。アンインストールもクリーンにできますので是非試してみてください。
追記 (2016/11/15)
以前のバージョンはバグがありますので最新版(バージョン 3.6)のみリンクします。サーバーPluginも Version 3.6を使用してください。
- Mac OS X 10.9 : querybuilder.pkg (未署名のため、ダウンロード後Ctrlキーを押しながらクリックして開き、開発元未確認のダイアログで[開く]をクリックします。)
- Windows 32Bit : setupQueryBuilder_3_6.exe (デジタル署名済)
それでは、実際の使い方をご紹介します。(実際の操作を行うには、Transactdのサーバーが必要です。Pluginのインストールはこちら)
テーブルからレコードを読み取る
+ボタンをクリックしてウィザードを開始します。
データベースのホスト名、データベース名、スキーマテーブルの名前を指定して[Next]をクリックします。スキーマテーブルを特別に用意していない場合はtransactd_schema
と指定してください。自動で、そのデータベースのスキーマが生成されます。
[Table]にテーブルリストが表示されるので、読み取るテーブルと、インデックスを選択します。
ユニークなインデックスにはグリーンのマークがついています。[Key Values]には指定したインデックスのフィールド名タイプとサイズが表示されます。
[Value]列に読み取りを開始するインデックスの値を入力します。もし、テーブルの先頭なら、最も小さな値を指定します。[Next]をクリックします。
ここでは、SQLのselect
に相当する、列の選択を行います。
左側に選択したテーブルのフィールド一覧が表示されるので、必要なフィールドを→ボタンで右側のリストに加えていきます。この例では4つのフィールドすべてを追加しています。
また、フィールド名に別名を付ける場合は[Alias]に別名を入力します。例では「名前」フィールドを「name」としています。[Next]をクリックします。
最後に抽出条件を指定します。検索の始まりは最初に指定したので、終わりをid <= 100
とします。左側のフィールド一覧からidを、右側の Record match conditions に→ボタンで入れます。[Conditions]に<= 100
と入力します。 [Finish]をクリックして完了です。
ソースコードの表示
[PHP]タブをクリックするとクエリーの内容がPHPのソースコードで表示されます。
生成されたソース全体は、単独で動作するように書かれていますが、クエリーの部分だけが選択された状態で表示されます。選択された部分のコードは以下のようになっています。
$cp1 = new bzs\connectParams('tdap://localhost/querytest?dbfile=test.bdf'); $db->c_use($cp1); $at1 = new bzs\activeTable($db, 'user'); $at1->alias('名前', 'name'); $q = new bzs\query(); $q->select('id', 'name', 'group', 'tel'); $q->where('id', '<=', '100') ->reject(65535)->limit(0)->optimize(bzs\queryBase::none); $rs = $at1->index(0)->keyValue('0')->read($q);
最後の行の$rs
が結果のrecordset
です。
データの表示
[Run]をクリックするとクエリーを実行して、結果が[Data view]に表示されます。
右上の緑のステータスの横には実行時間が表示されます。このサンプルはWindows 32Bitで表示していますが、WindowsのGetTickCount
の計測の誤差が0.015程度あるため0と表示されています。100レコード程度だとほとんど0.01秒以下です。
Joinする
それでは次に上記の結果のgroup
フィールドからそのグループの名前をJoinしてみます。グループの名前はgroups
テーブルから参照します。+ボタンをクリックしてウィザードを開始します。
Joinを選択して[Next]をクリックします。
再びデータベースを選択する画面が出ます。すなわち異なるデータベースのテーブルもJoin可能です。同じデータベースなら、[Current database]を選択します。
ここでは、Joinするテーブルを選択し、レコードの検索に使うインデックスを指定します。
通常、マスタの参照であればユニークキーが存在します。groups
テーブルでは一意なフィールドがid
ではなくcode
というフィールドになっています。
次に、左側のレコードセット内のフィールドからJoinのキーとなるフィールドを選択し→ボタンで右側の[Join Key(s)]に入れます。これで、user.group
とgroups.code
でJoinするという意味になります。
[Next]をクリックします。
最後に、groups
テーブルから追加する列を選択します。ここではname
を選択しました。またgroup_name
という別名を付けました。[Finish]をクリックして完了です。
それでは生成されたソースコードを見てみまししょう。先程と同じ部分は省きます。
$cp2 = new bzs\connectParams('tdap://192.168.3.155/querytest?dbfile=test.bdf'); $db->c_use($cp2); $at2 = new bzs\activeTable($db, 'groups'); $at2->alias('name', 'group_name'); $q->reset()->select('name')->optimize(bzs\queryBase::none); $at2->index(0)->join($rs, $q, 'group');
最初の行で異なるサーバーが指定されています。分散クエリーが簡単に実行できます。
実行すると、group_name
フィールドが追加されているのがわかります。実行時間もJoinをしても0.01秒以下で実行できています。
GropuByをしてみる
次に、group
フィールドでグルーピングしてみましょう。各グループに属するユーザーの数をカウントしてみます。
先ほどまで同様、+ボタンをクリックしてウィザードを開始します。
[Operation]ページで[GroupBy]を選択して[Next]をクリックします。
[GroupBy]ページが表示されます。
左上にrecordset
内のフィールド一覧が表示されます。ここから、グルーピングのキーになるフィールドを→ボタンで[Grouping Key]に入れます。
次に、[Functions]からCount
を選択し、→ボタンをクリックします。画像がありませんが、ここでカウントした結果を入れる列名を聞かれます。ここではuser_count
としました。
[Registerd function]にはCount
のresultがuser_count
であると表示されています。[Finish]をクリックして完了です。
追加されたソースコードと実行結果を見てみましょう。
$q = new bzs\groupQuery(); $gq->keyField('group'); $fns = new bzs\fieldNames(); $fns->reset()->keyField(); $f0 = new bzs\count(fns, 'user_count'); $gq->addFunction($f0); $rs->groupBy(gq);
各グループ20Usersづつであることがわかります。これでもまだ実行時間は0.01秒以下です。上段の[Records]列を見てください。Read Join GroupByの後のレコード数が表示されています。それまで100レコードだったものが、 GroupBy
で5レコードになったことがわかります。
まとめ
QueryBuilderはいかがだったでしょうか? 是非皆さんもダウンロードして試してみてください。簡単にTransactdのクエリーを作成できること、分散クエリーが可能なこと、高速に実行できることをお分りいただけると思います。
そして何より、開発がとてもスピーディーで正確で簡単になります。