DEIM Forum 2019 H4-2

GUI を用いた SuperSQL クエリ生成支援ツール
前田 玲緒†

五嶋研人†

遠山元道†† 慶應義塾大学理工学部情報工学科 〒 223-8522 神奈川県横浜市港北区日吉 3-14-1
E-mail: †{maeda,goto}@db.ics.keio.ac.jp, ††toyama@ics.keio.ac.jp
あらましWeb ページを生成する際にデータベースを参照し, 表のような形式でデータを提示するようなことはよく求められる. しかしながら実際に格納されているデータを取得するにはデータベースに関する知識, 構造化された webページの生成には php や html の知識が必要であり, 一つのページを生成するだけでも多くの手間がかかってしまう.
そこで本研究では Swing を用いることで視覚的に理解しながら SQL の拡張言語である SuperSQL を扱えるようにする. ユーザはデータベースからどのデータを抽出し, どのようにレイアウトするかをグリッド形式の作業画面に属性オブジェクトを配置し, グルーピングなどの修飾をすることで指定する. そのコンポーネントから構造情報を解析し, レイアウトに応じた web ページを生成する SuperSQL クエリを生成する支援システムを提案する.
キーワード データベース, SQL, SuperSQL, Swing, HTML演算子である.

1 はじめにSuperSQL は，独自のクエリを記述することによって関係データベースの出力結果を構造化し，多様なレイアウト表現を可能とする SQL の拡張言語である．しかし, 求めている出力結果を得るためのクエリを書くためには SuperSQL の文法を理解しクエリから得られる出力結果をイメージする必要がある.

SuperSQL を扱いやすくするための様々なシステムは提案され•水平結合子 (, )データを横に結合して出力
例：Name, Salary•

Name Salary

垂直結合子 (!)

データを縦に結合して出力
例：Name! Salary

Salaryてきたが, それらは基本となるクエリ自体は自分で記述する必要があったりレイアウト構造の制限を考慮する必要があったりと事前知識が必要になるようなことが多かった. [5] [6]
本研究ではユーザが SuperSQL に関する構文知識がなくても扱えるような SuperSQL のクエリ生成を支援するツールを提案する. グリッド画面上にユーザは自由にレイアウトを指定し， システム側がレイアウトを解析しクエリの生成を行なう
ためユーザは直感的な操作だけで SuperSQL を利用する事が出来る.

2 SuperSQL
この章では本論文で改善を試みる SuperSQL について簡単に述べる. SuperSQL は関係データベースの出力結果を構造化し,Name

2. 2 反 復 子
反復子は取得したデータを指定された方向に結合し続ける演算子である.

•水平反復子 ([ ], )データインスタンスがある限り, その属性のデータを横方向に繰り返し表示する.
例：[Name],•Name1 Name2 . . . NameN

垂直結合子 ([ ]!)データインスタンスがある限り, その属性のデータを縦方向に繰り返し表示する.

多様なレイアウト表現を可能とする SQL の拡張言語であり,慶應義塾大学遠山研究室で開発されている. [1] [2] そのクエリは SQL の SELECT 句を GENERATE < media >< TFE > の構文を持つ GENERATE 句で置き換えたものである. ここで< media > は出力媒体を示し，HTML，PDF などの指定ができる. また < TFE > はターゲットリストの拡張である Target

Form Expression を表し，結合子，反復子などのレイアウト指定演算子を持つ一種の式である.

2. 1 結 合 子
結合子は取得したデータをどの方向に結合するかを指定する

Name1
例：[Name]!

Name2
. . .
NameN

また, 反復子は構造を指定するだけでなく属性同士の関連をネストによって表現できる.

[プロジェクト名]!, [従業員名]!, [給与]!と記述した場合, この属性間に関連はなくただそれぞれの一覧が出力されるだけであるが,[プロジェクト名, [従業員名, 給与]!]!

データベース画面では接続するデータベースと取得するテーと記述した場合には各プロジェクトごとに従業員と給与の一覧

ブルの指定, 実際に表示する値の指定を行う. データベースとが出力されるようになる.の接続ではユーザは接続するデータベースとユーザ名を指定する. データベースとの接続が成功すると存在するテーブルの名

2. 3 装 飾 子

前の一覧を取得し, さらに出力したい情報があるテーブルを選SuperSQL では関係データベースより抽出された情報に, 文字のサイズ, 位置, 横幅, 縦幅などの情報を付加できる. これらを指定するには属性名と装飾演算子（＠）を用いて指定し以下択することでそのテーブルの情報を取得する. ユーザはテーブ
ル形式で表示されている情報からどのようなデータがあるかを確認しながら出力するデータを選ぶことができる. また, 表示のような形式で記述する.

されているセルの配置を変えたくなった場合にはドラッグアン<属性名>@{<装飾指定>}

ドドロップでセル同士を入れ替えることができる.

装飾指定は”装飾子の名称 =その内容”で指定し, ”, ”を用いて複数個の装飾を同時に行うことができる.

2. 4 関3. 3 メイン画面数

SuperSQL ではいくつかの関数が用意されており, ここではimage 関数について説明する. image 関数を用いると画像を表示することが可能となる. 引数には属性名, 画像ファイルの存在するディレクトリのパスを指定する.

image(id, ’. /pic’)

3 提案システム
3. 1 システム概要
図 2 メイン画面

本研究ではユーザが手軽に利用できる Java Swing [3] によって実装を行なった. ユーザは SuperSQL クエリ自体を記述する必要するはなく, GUI システム上でどういったレイアウトにしたいかを実際に値を配置することで指定し, その構造を解析し同様のレイアウトを出力結果とする SuperSQL クエリをシステムが生成する. また, ユーザがデータベースに詳しくなくてもメイン画面では実際にデータをどのように表示したいかをグリッド形式で示すための画面となっている. ここでは先のデー
タベース画面から選択したデータをどこに配置するかを指定したり, 文字列を追加したりセル自体の修飾情報を指定する作業使えるように接続するデータベースを指定すればテーブルの一を行う. 以下ではそれぞれの機能について説明していく.

覧を取得し, 必要なテーブルがあればそのテーブルの情報を取3. 4 セルのサイズ得する. 接続するデータベースは PostgerSQL [4] に限定している. レイアウトを指定する場合にも取得したテーブル情報から選択すればいいため, スペルミスや構文エラーを意識しないでいいようになっている.

3. 2 データベース画面

3. 4. 1 セルの横幅
グリッド形式の各セルには初期サイズが設定されているが,個別にセルのサイズを変更できる. セルを選択した状態で横拡大をすると初期のセル１つ分のサイズが指定されたセルに加算される. また, 細かく数値を指定したい場合にはセルを選択した状態でメイン画面のセルの取得を行なった後に, セルサイズを数値で指定することができる. セルの大きさが変更されたらメイン画面のレイアウト表示も指定された値を反映し更新される.

3. 4. 2 セルの縦幅縦幅を加算したい場合にはメイン画面の縦拡大を押すことでセルの縦幅が１マス分が加算される. 縦幅が２以上のセルがある場合その左右のセルは入れ子の表現の扱いになる.

3. 4. 3 セル同士の結合関連性が高いセル同士を結合することで一つのセルとして扱うことができる. メイン画面のセルを選択した状態で右と結合,または下と結合を押すと指定されたセル同士が結合される. 1
つのセルとして扱うことで後述の反復子の指定をする場合やサイズの指定をする場合にセル全体を指定することができるよう
図 1 データベース画面になる. また, 結合した順序によって構造の違いを表現することができる. 例えば, 以下の図 3 のようなレイアウトを作りたいとする.

図6 セル情報
図 3 目標とする出力結果

るとレイアウトの表示も自動で切り替わるため, 他のセルとのまず単純に必要なデータを選択しレイアウトと同じような位サイズがあっているかの確認もしやすくなっている.

置に指定してクエリを生成したものとそのクエリを SuperSQLで実行した時の出力結果を図 4 に示す.

図 7 セルサイズの変更

このレイアウトからクエリを生成し実行すると図 3 と同じレイアウトを持つ出力結果を得ることができる.
図 4 単純に値を配置した時のクエリの生成

単純に配置しただけではこのようにイメージとは異なる出力結果になってしまう. そこでまずは図 3 のレイアウトに近づけるために慶應義塾のセルの縦幅を３行分に拡大する. こうすることで図 5 のように入れ子のような表現が可能になる.

図 8 セルのサイズを考慮したクエリの生成

3. 5 関数の指定
メイン画面でセルを取得し, 個別のセルを選択している状態でのみ各関数の追加を行うことができる関数の追加が可能にな
図 5 ネストを考慮したクエリの生成

次に 2014 年のセルを選択した状態でメイン画面の右と結合を押すことで, 2014 年と４月のセルが結合され１つのセルとして扱えるようになる. 図 5 の出力結果では入学の行がセル３つ分になって表示が整っていなかったので, 先の結合したセルのサイズを変更することで表示を整えていく. 結合したセルを選択した状態でメイン画面のセルの取得を押すと, 対象のセルの隣にあるドロップダウンリストに選択されているセルの内部セル一覧が図 6 のように表示される.

る. image 関数ではパスの指定が必要なため関数の追加画面では GUI によってどのディレクトリを参照するかを選択することでパスを取得する. パスを取得した後はそのパスが正しいかを確認した上で関数の追加画面のボタンを押すことでウィンドウを閉じることができる. 内部ではパスを取得すると属性名をimage 関数を適用した形に上書きする.
3. 6 反復子の追加
反復子を追加したい場合にはセルを選択した状態で縦反復の追加, または横反復の追加を押すとセルの色が変化し反復子が個別のセルのサイズ指定も可能であるが, 今回は全体のサイ適用されたことを示す. 2. 2 節で述べたように反復子を使う場ズを整えるためにドロップダウンリストからセル全体を指定し,合にはネストを考慮する必要があり, この差異を表現するためセルのサイズを図 7 のように変更する. セルのサイズを変更すに 1 つのセルの全体に対して反復子を追加する. そのため, 複数のセルに対して反復子を用いる場合にはそのセル同士を結合し

図 11 のようにレイアウトを指定し, 生成したクエリを実行するて１つのセルとする必要がある. 反復子を含んだセルをさらにと図 12 のような結果が得られる.

結合し再度反復子を追加することでネストの表現も可能である.
例として各店舗と商品の一覧を表示する場合を考える. レイ
アウト上で図 9 のように全体にのみ反復子を適用した場合には店舗名や階層などが同じでも並んで何回も表示されてしまう.

図 11 入れ子を考慮して反復子を指定する方法

図 9 全体にのみ反復子を適用した場合

SuperSQL では 2. 2 節で述べたように反復子によってネストを表現することができる. ここではまず店舗ごとに詳細を表示するような場合を考える. この場合反復子を２回指定する必要があり, レイアウト上ではまず内部の反復子に相当する部分に

図 12 入れ子を考慮した場合の出力結果反復子を指定する必要がある. 図に示すようにまず内部に相当する各店舗の情報を全て結合し, そのセルに対して反復子を適用する. その後店舗名のセルを店舗情報のセルに対して結合し再度反復子を指定する. このようにレイアウト上で指定を行ってから生成したクエリを実行すると図 10 のような結果が得ら

4 レイアウトの処理
4. 1 レイアウトの可否SuperSQL では表現できる表構造の制限があるが, 本システれる.

ムで表現できる構造はその制限の中に必ずしも収まるわけではない. 基本的に表構造が有効である条件は以下の３つである.
（ 1 ） 線によって分割された全ての図形が長方形である（ 2 ） 各長方形の中に余分な線分が存在しない（ 3 ） 表構造全体が長方形である
しかしながらユーザにとってこれらの判断や構造の設計は手間がかかる上難しく, 本システムでは似たような構造を持つ実行可能なクエリを生成することで正しくない表構造でも SuperSQLを実行できるようにしている. 図 8 では本来表構造として山田次郎のセルの横幅があっていないため正しくないが, 似たような表構造になるようにクエリを生成する.

4. 2 セルの構造情報
グリッド形式のレイアウトから配置されている情報を把握するために各セルは自身の対応する以下の情報を有している.

図 10 全体と店舗情報に対し反復子を適用した場合同様にして階層ごと, 店種ごとに反復子を指定する場合には•座標•

属性名•装飾子•

4. 3 入れ子の構造解析

関数

以降では説明のために図 13 のような記法を用いる.

本システムでの入れ子構造の認識は行数で判断しており, 複数行にまたがるセルがあると入れ子構造としてセル同士を構造化し構造を更新する. 例として図 15 ではまず横結合を行なったセルに対して入れ子構造になるようなセルが配置された場合の構造の変化を示している.

図 13 構造の記法

セルの移動や結合があるたびにその情報をレイアウト表示とともに更新していく. レイアウトの指定の際にセル同士を結合している場合には結合した段階で縦結合や横結合を用いて属性

図 15 入れ子による構造の変化を結合するため, 縦結合を用いてから横結合をする場合と横結合を用いてから縦結合をする場合には出力結果が異なり, 最初入れ子構造になったセル集合のうち入れ子内部の単一行のセに結合した属性ほど関連性が高いと判断し, 入れ子の優先度をルを全て同行で横結合したものとして構造化して扱う. そのた決定する. 結合順序による構造の違いを図 14 に示す.

め, 結合されていなかったセルも入れ子内部で結合されたものと同じように構造化される. 入れ子が多重になっても同様に構造の更新が行われる. 図 16 の例だと外側の入れ子構造を生成し, その内部に図で生成された入れ子構造が組み込まれる構造になっている.

図 16 多重の入れ子
図 14 結合順序による構造の違い

最終的に生成される形が同じだとしても, 結合の順序によっ4. 4 レイアウト全体の構造解析てその内部構造は異なってくる. ユーザが結合した順番が関連クエリを生成するためにはレイアウトがどのように指定され性の高い順番である前提で解釈しているため, ユーザは関連性ているかを理解し, 同じ構造になるようなクエリにどうやってが高い順にセルの結合を行っていくことで入れ子の構造を生成対応させていくかを考える必要がある. セル単位の構造はレイできる.

アウト上で決定しているため, 全体の解析では基本的に構造化された行ごとに構造解析を進めていく. 途中で入れ子構造が存在するレイアウトの場合には前述のように入れ子構造の行として構造が決定しているため, 次の構造化された行と縦結合を行う. 単一の行に収まっている入れ子構造でないセル同士は横結合で結合することで構造化し, 構造化された行を縦結合を用いできたためだと考えられる. 一方で入れ子構造が複雑な場合にて次の行と結合する. 以降の行も同様にして解析を進めていく

は直接入力ではイメージが掴みにくく, 関数を指定する場合にことでセル単位の構造からレイアウト全体の構造が決定する.

はその構文でエラーが起きてしまうことが多かった. 本システ

一例を図 17 に示す.

ムでは関数を指定する場合には前述のように GUI でパスの指定などを行うだけなので, 構文に関してのエラーは起きなかったためその分クエリの生成時間を短縮できたと考えられる.
次に実際にコンパイル回数に変化があったかを確認するために,コンパイル回数を図 19 に示す.

図 19 コンパイル回数の比較

図 17 全体の構造解析

構造関係を理解することでクエリの生成も可能になる. 解析
された構造に対し深さ優先探索をも用いて各セルに保存されている属性名と装飾子, 関数などを取得し SuperSQL のクエリとして適切なクエリを生成する.

5 実

験

実際にコンパイル回数も減らせていることがわかる. 直接入力の際にコンパイル回数が多くなる原因としてエラーの発生や途中経過の確認などのために一旦クエリを実行しレイアウトの確認を行うことなどが挙げられる. 本システムではこのような確認をする必要がないため, コンパイル回数を減らすことができている. 理想的にはコンパイル回数は生成するファイル数であるが, 例 3 や例 4 では本システムでもそれよりは少し多く提案インターフェースを評価するため，評価実験を行う.

なってしまっている. この原因は where 句を自分で書く必要

本実験ではクエリの直接記述の場合と本システムを用いた場合があり, システムが自動的に生成したエイリアスとユーザの認の比較を行うために, SuperSQL クエリを直接記述でも生成で識が異なっていたり, 単純に where 句を書き間違えていたりできる被験者 10 人に対してそれぞれの方法でクエリを生成してあったため今後改善すべき点である.

もらいクエリ生成にかかった時間と最終的なクエリができるまでのコンパイル回数を比較した. 図 18 にクエリの生成にかかった時間を示す.

6 ま と め6. 1 結論

本研究では GUI 上でレイアウトを指定することで SuperSQLクエリの生成を支援するシステムを開発した. GUI で操作できることで文法やスペルミスを気にすることなく, SuperSQL の初心者や構文知識のないユーザでもクエリを生成できるようになった.

6. 2 今後の課題
現在の本システムは SuperSQL の全ての機能を扱えているわけでなく, 装飾子や関数などの一部にしか対応していない.
図 18 クエリ生成時間の比較

例１や例２ではクエリの生成時間にほとんど差がないが, 例３や例 4-5 では本システムでの作業時間が直接入力の生成時間に比べ 40%ほどの時間でクエリの生成を行えている. 例１や例2 ではクエリが単純であり, クエリから結果もイメージしやす
いため直接入力でもエラーやレイアウト悩まずにクエリを生成SuperSQL で表現できることは本システムにも取り入れていくべきであり, 今後の課題となる.
また, 本システムを用いて生成したクエリを後々変更したくなった場合, クエリからレイアウト構造の推定はできないため, もう一度はじめから GUI 上でレイアウトを指定する必要がある.
今後は双方向的な対応をできるシステムを検討する.

文

献[1] SuperSQL: http://ssql.db.ics.keio.ac.jp[2] M. Toyama, SuperSQL: An Extended SQL for Database
Publishing and Presentation , Proceedings of ACM SIGMOD
98 International Conference on Management ofData, pp.584-586, 1998
[3] Java Swing: https://docs. oracle. com/javase/jp/9/docs/api/javax/swing/packagesummary.html[4] PostgreSQL, http://www.postgresql.org/[5] Kengo Haruno, Kento Goto, Motomichi Toyama. Modern
Web Page Generation by Using Exclusively SuperSQL. In
Proceedings of the 20th International Database Engineering& Applications Symposium, pp.340-345, 2016.
[6] 吉沢 拓, 遠山 元道. ”視覚的インターフェースによる SuperSQL
クエリ生成”, 慶應義塾大学, 2008.