view compareDatabase.tex @ 40:ecebf7391b86

fix
author tatsuki
date Thu, 01 Dec 2016 19:36:30 +0900
parents 9d0f50febed1
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に比べて非常に直感的に検索を行うことが可能である。