39
|
1 \appendix
|
|
2 \section{JDBCとJungleの検索の比較}
|
|
3 本章ではJungleとJDBCの検索方法の比較を行う。
|
36
|
4 検索には、人間関係を表した木構造データを用いる。
|
39
|
5 MySqlでは、表\ref{User}の構造を持つテーブル{\tt user}を用いて木構造を表現する。
|
36
|
6
|
|
7
|
|
8 \begin{table}[htb]
|
|
9 \begin{center}
|
|
10 \caption{User table}
|
|
11 \begin{tabular}{|l|l|l|l|l|} \hline
|
40
|
12 {\tt id} & {\tt name} & {\tt age} & {\tt type} &{\tt parent} \\ \hline
|
36
|
13 \end{tabular}
|
|
14 \label{User}
|
|
15 \end{center}
|
|
16 \end{table}
|
|
17
|
39
|
18 テーブル{\tt user}のカラムの説明を表\ref{UserTableColumn}に記す。
|
36
|
19
|
|
20 \begin{table}[htb]
|
|
21 \begin{center}
|
|
22 \caption{User tableのColumn}
|
|
23 \begin{tabular}{|l|l|} \hline
|
39
|
24 {\tt id} & ユーザーのID \\ \hline
|
|
25 {\tt name} & 名前 \\ \hline
|
|
26 {\tt age} &年齢 \\ \hline
|
|
27 {\tt type} &ユーザのタイプ(Teacher or Student) \\ \hline
|
40
|
28 {\tt parent} & 自身の親のID \\ \hline
|
36
|
29 \end{tabular}
|
|
30 \label{UserTableColumn}
|
|
31 \end{center}
|
|
32 \end{table}
|
|
33
|
39
|
34 このテーブル{\tt user}に対して、名前が{\tt kono} タイプが{\tt Teacher}のユーザー以下のノードを全て取得したい。
|
|
35 ノード以下の木構造の深さがわかっている場合、以下のコードのように、副問合せを複数回行うことで、一回のSQLで取得可能である。
|
38
|
36 \begin{lstlisting}[frame=lrbt,label=index,numbers=left]
|
|
37 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\";");
|
|
38 while (set.next()) {
|
|
39 System.out.println("user -> " + set.getString(2));
|
|
40 }
|
|
41 \end{lstlisting}
|
39
|
42 しかし、深さがわからない場合、プログラム内で再帰的に複数回SQLを発行する必要がある。
|
36
|
43
|
37
|
44 しかし、Jungleでは以下の一回の検索で全てのノードを取得することが可能である。
|
36
|
45 以下にJungleでの検索コードを記述する。
|
|
46
|
|
47 \begin{lstlisting}[frame=lrbt,label=index,numbers=left]
|
39
|
48 tree = jungle.getTreeByName("user"); (1)
|
36
|
49 InterfaceTraverser traverser = tree.getTraverser(true);
|
|
50 Iterator<TreeNode> iterator = traverser.find((TreeNode node) -> {
|
38
|
51 String value = node.getAttributes().getString("Name");
|
|
52 if (value == null) return false;
|
|
53 return value.equals("Kono");
|
39
|
54 },"Type", "Teacher");(2)
|
36
|
55
|
|
56 while (iterator.hasNext()) {
|
39
|
57 TreeNode node = iterator.next();(3)
|
|
58 AllNodeIterator nodeIterator = new AllNodeIterator(node);(4)
|
36
|
59 while (nodeIterator.hasNext()) {
|
39
|
60 System.out.println(nodeIterator.next().getAttributes().getString("Name"))(5);
|
36
|
61 }
|
|
62 }
|
|
63 \end{lstlisting}
|
|
64
|
|
65
|
39
|
66 \begin{enumerate}
|
|
67 \item Jungleから名前が{\tt user}の木を取得する。
|
|
68 \item 木から属性名 {\tt Type}、 属性値 {\tt Teacher}、属性名 {\tt name}、属性値 {\tt Kono}の値を持つノードを取得する。
|
|
69 \item 検索で取得したノードの{\tt Iterator}オブジェクトから、ノードを取得する。
|
|
70 \item 引数で渡したノード以下にあるノードを全て取得する、{\tt AllNodeIterator}クラスを生成する。
|
|
71 \item {\tt AllNodeIterator}クラスから全てのノードを取得する。
|
|
72 \end{enumerate}
|
36
|
73
|
39
|
74 このようにJungleでは、JDBCに比べて非常に直感的に検索を行うことが可能である。
|