# HG changeset patch # User tatsuki # Date 1480582151 -32400 # Node ID 215d5ce839b7ce79d3cd9ccaaf31589f184c1490 # Parent 6afc5049f8b677810916aeedcad2096c8f99d8db add compareDatabase diff -r 6afc5049f8b6 -r 215d5ce839b7 compareDatabase.tex --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/compareDatabase.tex Thu Dec 01 17:49:11 2016 +0900 @@ -0,0 +1,63 @@ +\section{OR-MapperとJungleの検索の比較} +本章ではJungleとOR-Mapperの検索方法の比較を行う。 + +検索には、人間関係を表した木構造データを用いる。 +MySqlでは、表\ref{User}の構造を持つテーブルuserを用いて木構造を表現する。 + + +\begin{table}[htb] +\begin{center} +\caption{User table} +\begin{tabular}{|l|l|l|l|l|} \hline +id & name & age & type &parrent \\ \hline +\end{tabular} +\label{User} +\end{center} +\end{table} + +テーブルuserのカラムの説明を表\ref{UserTableColumn}11に記す。 + +\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 +\end{tabular} +\label{UserTableColumn} +\end{center} +\end{table} + +このテーブルuserに対して、名前が{\tt kono} タイプが{\tt Teacher}のユーザー以下のノードを全て取得したい。 +木構造の深さがわかっている場合、以下のコードのように、副問合せを複数回使用することで一回のSQLで取得可能である。 +select * from user where parent in (select id from user where parent = (select id from user where name = "kono" AND type = "Teacher")) union select * from user where parent = (select id from user where name = "kono" AND type = "Teacher") union select * from user where name = "kono" AND type = "Teacher"; + +しかし、深さが変わると上記のSQLは使用できないうえ、SQL文が長くわかりづらくなる。 +なので、特定のユーザー以下のノードを全て取得する場合は、プログラム内で再帰的に複数回SQLを発行する必要がある。 + +しかしJungleでは以下の一回の検索で全てのノードを取得することが可能である。 +以下にJungleでの検索コードを記述する。 + +\begin{lstlisting}[frame=lrbt,label=index,numbers=left] +tree = jungle.getTreeByName("user"); +InterfaceTraverser traverser = tree.getTraverser(true); +Iterator iterator = traverser.find((TreeNode node) -> { + String value = node.getAttributes().getString("Name"); + if (value == null) return false; + return value.equals("Kono"); +},"Type", "Teacher"); + +while (iterator.hasNext()) { + TreeNode node = iterator.next(); + AllNodeIterator nodeIterator = new AllNodeIterator(node); + while (nodeIterator.hasNext()) { + System.out.println(nodeIterator.next().getAttributes().getString("Name")); + } +} +\end{lstlisting} + + + diff -r 6afc5049f8b6 -r 215d5ce839b7 main.tex --- a/main.tex Thu Dec 01 16:53:51 2016 +0900 +++ b/main.tex Thu Dec 01 17:49:11 2016 +0900 @@ -69,6 +69,8 @@ %まとめ \input{summary.tex} + +\input{compareDatabase.tex} %\begin{acknowledgment} %みんなめっちゃありがと %\end{acknowledgment}