annotate compareDatabase.tex @ 40:ecebf7391b86

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