Mercurial > hg > Papers > 2016 > tatsuki-prosym
changeset 39:9d0f50febed1
fix
author | tatsuki |
---|---|
date | Thu, 01 Dec 2016 19:28:13 +0900 |
parents | 0bb8c8489f2c |
children | ecebf7391b86 |
files | abst.tex compareDatabase.tex maTrix.tex |
diffstat | 3 files changed, 29 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/abst.tex Thu Dec 01 18:56:10 2016 +0900 +++ b/abst.tex Thu Dec 01 19:28:13 2016 +0900 @@ -2,7 +2,7 @@ プログラムからデータを分離して扱うデータベースには、 プログラム中のデータ構造とRDBの表構造のインピーダンスミスマッチ\cite{Atkinson:1995:OPO:615224.615226}という問題がある。 データベースのレコードをプログラム中のオブジェクトとして使えるOR Mapper\cite{Lamb:1991:ODS:125223.125244}\cite{Henry:2001:OVJ:367884.367889}や、 -データベース自体も、表に特化したKey Value Store\cite{cassandra09} \cite{cassandra}や、Jsonなどの不定形のデータ構造を格納するように機能拡張されてきている。 +データベース自体も、表に特化したKey Value Store\cite{cassandra09} \cite{cassandra} や、Jsonなどの不定形のデータ構造を格納するように機能拡張されてきている。 しかし、プログラム中のデータは複雑な構造をメモリ上に構築しており、これらの方法でもまだギャップがある。 今回提案する木構造データベースJungle\cite{kono11b} \cite{kono11e}はプログラム内部に直接木構造を構築する。 そして、木のルートをアトミックに入れ替えることでトランザクションを実現する。
--- a/compareDatabase.tex Thu Dec 01 18:56:10 2016 +0900 +++ b/compareDatabase.tex Thu Dec 01 19:28:13 2016 +0900 @@ -1,67 +1,74 @@ -\section{OR-MapperとJungleの検索の比較} -本章ではJungleとOR-Mapper\cite{Henry:2001:OVJ:367884.367889}の検索方法の比較を行う。 - +\appendix +\section{JDBCとJungleの検索の比較} +本章ではJungleとJDBCの検索方法の比較を行う。 検索には、人間関係を表した木構造データを用いる。 -MySqlでは、表\ref{User}の構造を持つテーブルuserを用いて木構造を表現する。 +MySqlでは、表\ref{User}の構造を持つテーブル{\tt user}を用いて木構造を表現する。 \begin{table}[htb] \begin{center} \caption{User table} \begin{tabular}{|l|l|l|l|l|} \hline -id & name & age & type &parrent \\ \hline +{\tt id} & {\tt name} & {\tt age} & {\tt type} &{\tt parrent} \\ \hline \end{tabular} \label{User} \end{center} \end{table} -テーブルuserのカラムの説明を表\ref{UserTableColumn}11に記す。 +テーブル{\tt user}のカラムの説明を表\ref{UserTableColumn}に記す。 \begin{table}[htb] \begin{center} \caption{User tableのColumn} \begin{tabular}{|l|l|} \hline -id & ユーザーのID \\ \hline -name & 名前 \\ \hline -age &年齢 \\ \hline -type &ユーザのタイプ(Teacher or Student) \\ \hline -parrent & 自身の親のID \\ \hline +{\tt id} & ユーザーのID \\ \hline +{\tt name} & 名前 \\ \hline +{\tt age} &年齢 \\ \hline +{\tt type} &ユーザのタイプ(Teacher or Student) \\ \hline +{\tt parrent} & 自身の親のID \\ \hline \end{tabular} \label{UserTableColumn} \end{center} \end{table} -このテーブルuserに対して、名前が{\tt kono} タイプが{\tt Teacher}のユーザー以下のノードを全て取得したい。 -木構造の深さがわかっている場合、以下のコードのように、副問合せを複数回使用することで一回のSQLで取得可能である。 +このテーブル{\tt user}に対して、名前が{\tt kono} タイプが{\tt Teacher}のユーザー以下のノードを全て取得したい。 +ノード以下の木構造の深さがわかっている場合、以下のコードのように、副問合せを複数回行うことで、一回のSQLで取得可能である。 \begin{lstlisting}[frame=lrbt,label=index,numbers=left] ResultSet set = stmt.executeQuery("select * from user where parent_id in (select id from user where parent_id = (select id from user where name = \"kono\" AND type = \"Teacher\")) union select * from user where parent_id = (select id from user where name = \"kono\" AND type = \"Teacher\") union select * from user where name = \"kono\" AND type = \"Teacher\";"); while (set.next()) { System.out.println("user -> " + set.getString(2)); } \end{lstlisting} -しかし、深さが変わると上記のSQLは使用できないうえ、SQL文が長くわかりづらくなる。 -なので、特定のユーザー以下のノードを全て取得する場合は、プログラム内で再帰的に複数回SQLを発行する必要がある。 +しかし、深さがわからない場合、プログラム内で再帰的に複数回SQLを発行する必要がある。 しかし、Jungleでは以下の一回の検索で全てのノードを取得することが可能である。 以下にJungleでの検索コードを記述する。 \begin{lstlisting}[frame=lrbt,label=index,numbers=left] -tree = jungle.getTreeByName("user"); +tree = jungle.getTreeByName("user"); (1) InterfaceTraverser traverser = tree.getTraverser(true); Iterator<TreeNode> iterator = traverser.find((TreeNode node) -> { String value = node.getAttributes().getString("Name"); if (value == null) return false; return value.equals("Kono"); - },"Type", "Teacher"); + },"Type", "Teacher");(2) while (iterator.hasNext()) { - TreeNode node = iterator.next(); - AllNodeIterator nodeIterator = new AllNodeIterator(node); + TreeNode node = iterator.next();(3) + AllNodeIterator nodeIterator = new AllNodeIterator(node);(4) while (nodeIterator.hasNext()) { - System.out.println(nodeIterator.next().getAttributes().getString("Name")); + System.out.println(nodeIterator.next().getAttributes().getString("Name"))(5); } } \end{lstlisting} +\begin{enumerate} +\item Jungleから名前が{\tt user}の木を取得する。 +\item 木から属性名 {\tt Type}、 属性値 {\tt Teacher}、属性名 {\tt name}、属性値 {\tt Kono}の値を持つノードを取得する。 +\item 検索で取得したノードの{\tt Iterator}オブジェクトから、ノードを取得する。 +\item 引数で渡したノード以下にあるノードを全て取得する、{\tt AllNodeIterator}クラスを生成する。 +\item {\tt AllNodeIterator}クラスから全てのノードを取得する。 +\end{enumerate} +このようにJungleでは、JDBCに比べて非常に直感的に検索を行うことが可能である。
--- a/maTrix.tex Thu Dec 01 18:56:10 2016 +0900 +++ b/maTrix.tex Thu Dec 01 19:28:13 2016 +0900 @@ -123,6 +123,7 @@ 図\ref{fig:PersonTree}の人物Treeに対して、上記の検索を行うとNode3が取得できる。 +付録AにJDBCとの検索方法の比較を記述する。 \subsection{ノードの親をたどるIndex} maTrixがJungleに検索を行う際、親をたどる処理が必要になったが、Jungleは親から子への単一リンクしか持っていなかった。 しかし、Jungleは非破壊という性質上、子に親への参照をもたせることが難しいため、ノードを渡すと親ノードを返すParentIndexを実装した。