BizStationブログ

ビズステーション株式会社の公式ブログです。

Transactd 2.0 その2 QueryBuilder で簡単NoSQLクエリー

Transactd 2.0 その1では、読み取りクエリーの使い方について説明しました。今回は、そのクエリーのコードをVisualに生成できるツール、QueryBuilderを紹介します。

QueryBuilderでは、GUIの画面上でデータベースやテーブル、キーの値や条件などを指定すると、Transactdのクエリーのソースコードを生成できます。生成されたコードをコピーアンドペーストするだけでデータベースへのアクセスコードが完成します。開発工程をとても簡単にしてくれること間違いなしです。生成可能ソースの言語は現在のところ、C++/PHP/Ruby/JScriptです。
また、実際にクエリーを実行して結果や実行速度を確認することもできます。

QueryBuilderのインストール

QueryBuilderは現在Beta版で、WindowsMac OS X版があります。どちらも、インストールパッケージで簡単にインストールできます。アンインストールもクリーンにできますので是非試してみてください。


追記 (2016/11/15)
以前のバージョンはバグがありますので最新版(バージョン 3.6)のみリンクします。サーバーPluginも Version 3.6を使用してください。



f:id:bizstation:20140925162219p:plain

それでは、実際の使い方をご紹介します。(実際の操作を行うには、Transactdのサーバーが必要です。Pluginのインストールはこちら

テーブルからレコードを読み取る

+ボタンをクリックしてウィザードを開始します。

f:id:bizstation:20140925162734p:plain
データベースのホスト名、データベース名、スキーマテーブルの名前を指定して[Next]をクリックします。スキーマテーブルを特別に用意していない場合はtransactd_schemaと指定してください。自動で、そのデータベースのスキーマが生成されます。

f:id:bizstation:20140925163039p:plain
[Table]にテーブルリストが表示されるので、読み取るテーブルと、インデックスを選択します。
ユニークなインデックスにはグリーンのマークがついています。[Key Values]には指定したインデックスのフィールド名タイプとサイズが表示されます。
[Value]列に読み取りを開始するインデックスの値を入力します。もし、テーブルの先頭なら、最も小さな値を指定します。[Next]をクリックします。

f:id:bizstation:20140925163631p:plain
ここでは、SQLselectに相当する、列の選択を行います。
左側に選択したテーブルのフィールド一覧が表示されるので、必要なフィールドを→ボタンで右側のリストに加えていきます。この例では4つのフィールドすべてを追加しています。
また、フィールド名に別名を付ける場合は[Alias]に別名を入力します。例では「名前」フィールドを「name」としています。[Next]をクリックします。

f:id:bizstation:20140925183028p:plain
最後に抽出条件を指定します。検索の始まりは最初に指定したので、終わりをid <= 100とします。左側のフィールド一覧からidを、右側の Record match conditions に→ボタンで入れます。[Conditions]に<= 100と入力します。 [Finish]をクリックして完了です。

ソースコードの表示

[PHP]タブをクリックするとクエリーの内容がPHPソースコードで表示されます。
f:id:bizstation:20140925185503p:plain
生成されたソース全体は、単独で動作するように書かれていますが、クエリーの部分だけが選択された状態で表示されます。選択された部分のコードは以下のようになっています。

    $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]に表示されます。
f:id:bizstation:20140925190339p:plain
右上の緑のステータスの横には実行時間が表示されます。このサンプルはWindows 32Bitで表示していますが、WindowsGetTickCountの計測の誤差が0.015程度あるため0と表示されています。100レコード程度だとほとんど0.01秒以下です。

Joinする

それでは次に上記の結果のgroupフィールドからそのグループの名前をJoinしてみます。グループの名前はgroupsテーブルから参照します。+ボタンをクリックしてウィザードを開始します。
f:id:bizstation:20140925191504p:plain
Joinを選択して[Next]をクリックします。

f:id:bizstation:20140925191648p:plain
再びデータベースを選択する画面が出ます。すなわち異なるデータベースのテーブルもJoin可能です。同じデータベースなら、[Current database]を選択します。

f:id:bizstation:20140925191941p:plain
ここでは、Joinするテーブルを選択し、レコードの検索に使うインデックスを指定します。
通常、マスタの参照であればユニークキーが存在します。groupsテーブルでは一意なフィールドがidではなくcodeというフィールドになっています。
次に、左側のレコードセット内のフィールドからJoinのキーとなるフィールドを選択し→ボタンで右側の[Join Key(s)]に入れます。これで、user.groupgroups.codeでJoinするという意味になります。
[Next]をクリックします。

f:id:bizstation:20140925192658p:plain
最後に、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秒以下で実行できています。
f:id:bizstation:20140925194826p:plain

GropuByをしてみる

次に、groupフィールドでグルーピングしてみましょう。各グループに属するユーザーの数をカウントしてみます。

先ほどまで同様、+ボタンをクリックしてウィザードを開始します。
[Operation]ページで[GroupBy]を選択して[Next]をクリックします。
[GroupBy]ページが表示されます。
f:id:bizstation:20140925203903p:plain

左上に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);

f:id:bizstation:20140925200503p:plain

各グループ20Usersづつであることがわかります。これでもまだ実行時間は0.01秒以下です。上段の[Records]列を見てください。Read Join GroupByの後のレコード数が表示されています。それまで100レコードだったものが、 GroupByで5レコードになったことがわかります。

まとめ

QueryBuilderはいかがだったでしょうか? 是非皆さんもダウンロードして試してみてください。簡単にTransactdのクエリーを作成できること、分散クエリーが可能なこと、高速に実行できることをお分りいただけると思います。
そして何より、開発がとてもスピーディーで正確で簡単になります。