Mercurial > hg > Papers > 2016 > tatsuki-prosym
view Paper/compareDatabase.tex @ 56:4309d8dfb06c
fix indent
author | Kazuma Takeda |
---|---|
date | Fri, 23 Dec 2016 12:57:48 +0900 |
parents | 06be9d62844f |
children |
line wrap: on
line source
\appendix \section{JDBCとJungleの検索の比較} 本章ではJungleとJDBCの検索方法の比較を行う。 検索には、人間関係を表した木構造データを用いる。 MySqlでは、表\ref{User}の構造を持つテーブル{\tt user}を用いて木構造を表現する。 \begin{table}[htb] \begin{center} \caption{User table} \begin{tabular}{|l|l|l|l|l|} \hline {\tt id} & {\tt name} & {\tt age} & {\tt type} &{\tt parent} \\ \hline \end{tabular} \label{User} \end{center} \end{table} テーブル{\tt user}のカラムの説明を表\ref{UserTableColumn}に記す。 \begin{table}[htb] \begin{center} \caption{User tableのColumn} \begin{tabular}{|l|l|} \hline {\tt id} & ユーザーのID \\ \hline {\tt name} & 名前 \\ \hline {\tt age} &年齢 \\ \hline {\tt type} &ユーザのタイプ(Teacher or Student) \\ \hline {\tt parent} & 自身の親のID \\ \hline \end{tabular} \label{UserTableColumn} \end{center} \end{table} このテーブル{\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を発行する必要がある。 しかし、Jungleでは以下の一回の検索で全てのノードを取得することが可能である。 以下にJungleでの検索コードを記述する。 \begin{lstlisting}[frame=lrbt,label=index,numbers=left] 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");(2) while (iterator.hasNext()) { TreeNode node = iterator.next();(3) AllNodeIterator nodeIterator = new AllNodeIterator(node);(4) while (nodeIterator.hasNext()) { 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に比べて非常に直感的に検索を行うことが可能である。