DEIM Forum 2016 D4-3

SuperSQL クエリ自動修正機構の提案
星野 友亮†

五嶋 研人†

遠山元道 ††† 慶應義塾大学理工学研究科開放環境科学専攻 〒 223-8522 神奈川県横浜市港北区日吉 3-14-1
E-mail: †{yusuke,goto}@db.ics.keio.ac.jp, ††toyama@ics.keio.ac.jp
あらまし SuperSQL は，関係データベースの出力結果を構造化し，多彩なレイアウト表現を実現する SQL の拡張言語である．現在，SuperSQL による Web ページの開発には主に SSedit という専用のエディタが用いられる．このエディタにより開発環境は飛躍的に改善されたが，開発者に表示されるエラーの品質に起因する二次エラーの問題が残る．そこで本論文では，SuperSQL による Web ページ開発時の実際のエラーログを取得し解析することで開発者のエラーパターンを分類．その分類に基づき，SuperSQL クエリのシンタックスエラーを自動で修正し，開発者にその解決策であるクエリの候補を提示する自動修正機構を提案する．
キーワード

SQL，SuperSQL，エラー，オートコレクト

1. は じ め に

2. SuperSQL

SuperSQL は関係データベースの出力結果を構造化し，多様

この章では SuperSQL について簡単に述べる．SuperSQL はなレイアウト表現を可能とする SQL の拡張言語である．通常

関係データベースの出力結果を構造化し，多様なレイアウト表の SQL では，シンプルでフラットな表しか再現できず，自由現を可能とする SQL の拡張言語であり，慶應義塾大学遠山研なレイアウトの表を作るためには HTML や CSS といった他の究室で開発されている [1], [2]. そのクエリは SQL の SELECT言語の導入が不可欠である．しかし SuperSQL を用いること

句を GENERATE< media >< TFE > の 構文を持つ GEN-で他の言語を使用することなく様々なレイアウトな表を作成すERATE 句で置き換えたものである. ここで < media > は出力ることができ，SQL，構造，メディアの三次元的組み合わせに媒体を示し，HTML，PDF などの指定がで きる. また < TFE

よって SuperSQL による開発は無限の広がり見せると言える．

> はターゲットリストの拡張である Target Form Expression

また，SuperSQL を用いると，HTML と PHP を用いた一般的を表し, 結合子, 反復子などのレイアウト指定演算子を持つ一種な方法に比べて，はるかに少ない行数で Web ページを生成すの式である．

ることができる．

2. 1 結 合 子

現在，SuperSQL を用いた Web ページの開発にはコマンド

結合子はデータベースから得られたデータをどの方向 (次元)ラインでの実行の他に，SSedit という専用のエディタを使用すに結合するかを指定する演算子であり, 以下の 3 種類がある．

る方法がある．このエディタの導入ににより，データベースの括弧内はクエリ中の演算子を示している.

テーブル・スキーマの表示や新規作成用のクエリテンプレート•水平結合子 (,)の挿入，ファイルの操作などを GUI で行うことができるようデータを横に結合して出力.になり，SuperSQL での Web ページ開発環境は飛躍的に改善

例 : Name，Telname tel

された．しかし，エラー表示の分かりにくさや読みにくさ，不正確さなどといった，SSedit が開発者に提示するエラーの品質に起因する二次エラーの問題が依然として残っている．そこで
本論文では，SuperSQL による Web ページ開発時に発生した•垂直結合子 (!)

データを縦に結合して出力.
例 : Name! Tel

name

実際のエラーログを取得し解析することで，開発者に共通する頻出シンタックスエラーパターンを分類する．その分類に基づきパターン化することで，パターンとマッチした SuperSQL ク
エリのシンタックスエラーを自動で修正し，開発者にその解決策であるクエリの候補を提示する自動修正機構を提案する．

•深度結合子 (%)

データを 3 次元方法へ結合. 出力が HTML ならばリンクとなる.
例 : Name % Tel

以下に本稿の構成を示す．2 章で SuperSQL の概要，3 章で研究背景について述べる．4 章ではエラーログの分析について述べ，5 章で自動修正機構について述べる．そして，6 章では評価について述べ，7 章で結論と今後の課題を述べる．

telname→tel

2. 2 反 復 子
反復子は指定する方向に，データベースの値があるだけ繰り返して表示する．また反復子はただ構造を指定するだけでなく，そのネストの関係によって属性間の関連を指定できる．例えばFOREACH 句を記述する．以下に例を示す．
[科目名]! ,[学籍番号]! ,[評点]!
クエリ例：とした場合には各属性間に関連はなく，単に各々の一覧が表⟨Q1.ssql⟩示されるだけである．一方，ネストを利用してGENERATE HTML[e.name % {e.salary，e.syear}]!

[科目名! [学籍番号, 評点]! ]!とした場合には，その科目毎に学籍番号と評点の一覧が表示されるといったように，属性間の関連が指定される．以下，そFROM employee e
これを link 関数と FOREACH 句を用いると，Q2.ssql とQ3.ssql の二つの質問文となる.の種類について述べる.

•⟨Q2.ssql⟩

水平反復子 ([ ],)GENERATE HTML

データインスタンスがある限り，その属性のデータを横に繰り[link(e.name, "Q3.ssql", e.id)]!

返し表示する．

FROM employee e

例 : [Name]，⟨Q3.ssql⟩

name1 name2 ・・・ name10

FOREACH e.id•

垂直反復子 ([ ]!)GENERATE HTML[e.salary，e.syear]!

データインスタンスがある限り，その属性のデータを縦に繰り返し表示する.

FROM employee e
name1
name2

例 : [Name]!

・・・name10
2. 3 装 飾 子

link 関数ではペアとなる FOREACH 句を含む質問文のファイル名を第二引数で指定する．さらに，link 関数の第三引数と FOREACH 句で同じ属性を指定する．なお，この属性の値を利用して URL を生成するため、指定する属性はリンク先のページを一意に識別できるもの (主キーなど) を選択する．2

SuperSQL では関係データベースより抽出された情報に，文つ以上の属性を指定する場合 (主キーが 2 つ以上あるようなと字サイズ，文字スタイル，横幅，文字色，背景，高さ，位置なき) は、link 関数では第三引数以降に属性を一つずつ指定し，どの情報を付加できる．これらは装飾演算子 (@) によって指定

FOREACH 句では属性を (,) で 区切って指定する．

する．

2. 5 ソーティング (並べかえ)< 属性名 >@{ < 装飾指定 > }SuperSQL では属性に基づき，昇順もしくは降順にソーティングすることができる．対象になる属性の前に括弧を記述し、装飾指定は”装飾子の名称 = その内容” として指定する．複

その中にソーティングの種類や順序を入れる．ソーティングの数指定するときは各々を”，”で区切る．

種類には asc と desc の二つがあり，ソーティングに順序付けをクエリ例：[employee.name@{width=200，color=red}]!

する場合にはその右側に数字を記述する．数字の小さいものから優先的に処理され，数字指定がない場合は記述された順番に

2. 4 関数

2. 4. 1 image 関数
image 関数を用いると画像を表示することが可能となる．引数には属性名，画像ファイルの存在するディレクトリにパスを指定する．
クエリ例：image(Pict, “./picture”)

2. 4. 2 link 関数 (出力メディアが HTML の場合のみ)link 関数は，FOREACH 句と同時に用いる．深度結合子と同様にリンクを生成することができる．リンクを生成するため上から処理される．

•昇順 (ascending order)

従業員名の昇順によってソーティングを行う．
クエリ例: (asc)e.name•

降順 (descending order)

給料の降順によってソーティングを行う．
クエリ例: (desc)e.salary

3. 研 究 背 景に深度結合子を用いる場合は全てを一つの質問文で記述する

現在，SuperSQL による Web ページの開発には主に SSedit

が，link 関数と FOREACH 句を用いる場合はリンク元のペーという専用のエディタ (図 1) が用いられる [3]．このエディタ

ジとリンク先のページを別々の質問文で記述する．リンク元をの導入により，SuperSQL での Web ページ開発環境は飛躍的生成する質問文で link 関数を，リンク先を生成する質問文でに改善された．また，このエディタは検索やファイルの一括検索，置換などといった様々な拡張機能により，開発者のクエリ作成をより強力に支援する [4]．

図3

エラー分類 (3 学期分)に，学生はログから見るに 10 分ほど似たようなクエリを記述し試行錯誤を繰り返していた．このような事象は，SSedit が開発者に提示するエラーの品質に起因する二次エラーであると言図 1 SSedit

しかし，SuperSQL を用いた Web ページ開発において，開発者はシンタックスエラーを数多く起こす．慶應義塾大学理工学部情報工学科の３年生を対象とした授業であるデータモデリ
ング (担当教員：遠山) での最終課題で，実際に SSedit を用いて Web ページを作成してもらい，その際の学生の実行ログとエラーログを採取したところ，2015 年春学期の授業で SuperSQLが出力したエラー総数は 10637 であった．これは図 2 のように分類される．また，2014 年春学期と 2014 年秋学期の授業におえる．そこで，シンタックスエラーを自動で修正し，開発者にその解決策であるクエリの候補を提示することで，エラー表示の分かりにくさから生まれる新たなエラーを回避し，開発速度を向上させることができると考える．
クエリ例：

GENERATE HTML{ [e.dept, {e.floor! e.name! e.category}] }FROM EMPLOYEE e;

いて採取したログについても同様に分類を行うと図 3 のようになり，多少のばらつきはあるがどの学期の授業においても主に見受けられるエラーの種類は同じものであるということが証明された．さらにそれぞれの学期の，全学生の実行回数に対するエラー比率は，23.5%，25.3%，22.9%であり，学生の記述する

図 4 出力されるエラークエリの 2 割がシンタックスエラーを含むクエリであるということが分かった．

図6

横反復による表

図 5 縦反復による表

4. エラー分析
図 2 エラー分類 (2015 年春学期)

3 章で述べたように，SuperSQL を用いて Web ページを開
例えば，下記のようなシンタックスエラーを含むクエリ例に発する際に主に見受けられるエラーは同じ種類のものであると対して SuperSQL が出力するエラーは図 4 である．学生は縦反いうことから，開発者が起こしがちなシンタックスエラーはあ復による図 5 のような構造，もしくは横反復による図 6 のようる程度予測することができる．この章では，SuperSQL が出力な構造の表を出力したかったのであろうと考えられるが，そのするエラーの分類とは別に，実際に開発者が起こしたエラーをためには [] の後ろに (!) もしくは (,) を記述し反復子の形をとクエリログから分析し，分類する． 表 1 に開発者が起こした実らなければならない．この見かけにはわずかな書き忘れのため際のシンタックスエラーパターンを示す．

表1

シンタックスエラーパターンの分類

図 7 に示すように，シンタックスエラーが含まれるクエリが実行されその実行が失敗となる．その場合に記述されたクエリ

種類

具体例

反復子の後の (!)(,) 書き忘れ

[e.name, e.salary][]! [], の後の結合子の書き忘れ[e.name]! [e.salary]

余分な結合子e.name,! e.salary! e.dept

マッチング．マッチングした結果からシンタックスエラーの解

装飾子の書き方e.namebgcolor=red, width=100

決策であるクエリの候補を予想し開発者に提示する．提示されを解析することで，反復子の後の (!)(,) の書き忘れや余分な結合子などといった表 1 に基づくシンタックスエラーパターンとe.name@bgcolor=red@width=100 たクエリの横にあるラジオボタンを選択し適用ボタンをクリッ

装飾子の後に装飾子を付ける
ソーティングを属性以外に付ける(asc[e.name]!)

クすることで，選択した候補がクエリ画面に挿入される．これ

括弧の使い方の間違い(e.name)!

により開発者はクエリのデバッグのために似たようなクエリを; と:の間違い

from employee e:

書いては実行するという手間をかけることなく開発を続けるこ{} や [] の前に結合子が足りない

e.namee.salary

属性や関数の書き間違い[e.nane]! (decs)e.nameとができる．また，提示されたクエリの候補が開発者の意図に沿う出力をするかどうかが問題となってくる．そこで，選択したクエリ候補をクエリ画面に挿入する前に出力結果を確認できるようにするため，プレビュー機能を用意する．プレビュー機

5. 実 装 例

能では選択されたクエリの候補の出力結果を別ウインドウで開4 章で述べたエラー分析の結果 (表 1) に基づきシンタックス
エラーをパターン化し記憶．そのパターンを用いたクエリ自動修正機構の実装例を提示する．

発者に提示する．図 8 に自動修正機構のフローチャートを示す．

6. 評

価

現在，評価に関しては調査中であるが，本研究では２つの方法で評価を行う予定である．１つ目はエラー比率，開発時間による性能評価．２つ目は既存のオートコレクトツールとの性能比較による評価である．

6. 1 エラー比率，開発時間による性能評価
3 章で述べたように現在の SuperSQL による Web ページ開発の際の実行回数に対するエラー比率は約 20%であり，クエリ自動修正機構を導入し開発を行った場合のエラー比率と比較し評価する．また同様に，開発時間に関してもクエリ自動修正機構の導入前と導入後での変化を比較し評価する．

6. 2 既存のオートコレクトツールとの比較による評価
php が生成する html を自動で修正するシステムや [5] や htmlの構文のチェックを行う Another HTML-lint [6]，html の構文
図7

実 装

例をチェックし自動で修正するプラグインを Jedit に対して提供する Jchecker X [7]，Web ページ作成の際に誤りのある htmlの構文を自動で修正する機能を持つホームページ・ビルダー [8]などと性能を比較し評価する．

•構文チェック機能•自動修正機能•

プレビュー機能などといった点で評価することを予定している．

7. お わ り に
7. 1 結論

開発者に表示されるエラーの品質に起因する二次エラーの問題を解決するために，SuperSQL による Web ページ開発時の実際のエラーログを取得し解析することで開発者のエラー
図8

フローチャートパターンを分類．その分類に基づき，SuperSQL クエリのシンタックスエラーを自動で修正し，開発者にその解決策であるクエリの候補を提示する自動修正機構を提案する．

7. 2 今後の課題ログを更に分析しシンタックスエラーパターンを充実させることで自動修正機構の改善に繋がると考える．また，現在はクエリに 1 つのシンタックスエラーが存在する単独エラーが検出された場合についてクエリの自動修正を行っているが，クエリに２つ以上のシンタックスエラーが存在する複合的なエラーの検出，自動修正についえ検討する必要があると考え，さらに解決策となり得るクエリ候補が多数ある場合の表示の仕方や候補の切り捨て等についても検討事項である．

文献[1] SuperSQL: http://SuperSQL.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 of Data，pp．584-586，1998[3] 木谷 将人, 五嶋 研人, 遠山 元道. SuperSQL クエリ作成支援システムの開発 データ工学ワークショップ, DEIM2014.
[4] 星野 友亮, 五嶋 研人, 遠山 元道. SuperSQL クエリ作成支援シ
ステム SSedit の拡張 データ工学ワークショップ, DEIM2015.
[5] Xiaoyin Wang, Lu Zhang, Tao Xie, Yingfei Xiong, Hong
Mei: Automating Presentation Changes in Dynamic Web
Applications via Collaborative Hybrid Analysis , SIGSOFT 12/FSE-20, November 11-16, 2012, Cary, North Carolina, USA.
[6] Another HTML-lint: http://www.htmllint.net/html-lint/index.html[7] Jchecker X: http://www.artman21.com/jp/jchecker x/[8] ホームページ・ビルダー: https://www.justsystems.com/jp/products/hpb/