annotate jungle.tex @ 31:11dc58bf5a2b

fix
author tatsuki
date Tue, 29 Nov 2016 18:36:23 +0900
parents 365a3ea6a21f
children 8512227869d5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24
tatsuki
parents: 21
diff changeset
1 \section{非破壊的木構造データベースJungle}
tatsuki
parents: 21
diff changeset
2 Jungleは等研究室が開発を行っているデータベースで、Javaを用いて実装されている。
15
b3350fe86bb7 intorduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
3
1
tatsuki
parents: 0
diff changeset
4 Jungleは複数の木の集合からなり、木は複数のノードの集合で出来ている。
24
tatsuki
parents: 21
diff changeset
5 ノードは自身の子のListと属性名と属性値の組でデータを持ち、データベースのレコードに相当する。
tatsuki
parents: 21
diff changeset
6 通常のレコードと異なるのは、ノードに子供となる複数のノードが付くところである。
tatsuki
parents: 21
diff changeset
7 また、ノード同士はListを用いた参照で木構造を構築しているため、親から子への片方向の参照しか持たない。
15
b3350fe86bb7 intorduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
8
b3350fe86bb7 intorduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
9
24
tatsuki
parents: 21
diff changeset
10 Jungleは、データの編集を一度生成した木を上書きせず、ルートから編集を行うノードまでコピーを行い新しく木構造を構築し、そのルートをアトミックに入れ替えることで行う(図\ref{nonDestractTreeEdit})。
31
tatsuki
parents: 29
diff changeset
11 その際、編集に関係ないノードは参照を行い、複製元の木と共有する(図\ref{nonDestractTreeEdit}の例ではノードB D Eは編集に関係ないためノードAから参照を行い、過去の木と共有を行っている)。
24
tatsuki
parents: 21
diff changeset
12 これを非破壊的木構造と呼ぶ。非破壊木構造は新しい木を構築している時にも、現在の木を安定して読み出せるという特徴がある。
tatsuki
parents: 21
diff changeset
13 しかし、書き込み時の手間は大きくなる。
tatsuki
parents: 21
diff changeset
14
29
365a3ea6a21f change image size
tatsuki
parents: 24
diff changeset
15
365a3ea6a21f change image size
tatsuki
parents: 24
diff changeset
16
24
tatsuki
parents: 21
diff changeset
17 \begin{figure}[h]
tatsuki
parents: 21
diff changeset
18 \begin{center}
tatsuki
parents: 21
diff changeset
19 \includegraphics[height = 2.5cm , bb=0 0 511 188]{images/nonDestractTreeEdit.pdf}
tatsuki
parents: 21
diff changeset
20 \caption{非破壊的木構造の木の編集}
tatsuki
parents: 21
diff changeset
21 \label{nonDestractTreeEdit}
tatsuki
parents: 21
diff changeset
22 \end{center}
tatsuki
parents: 21
diff changeset
23 \end{figure}
tatsuki
parents: 21
diff changeset
24
31
tatsuki
parents: 29
diff changeset
25 \newpage
tatsuki
parents: 29
diff changeset
26 通常のRDBと異なり、Jungleは木構造をそのまま読み込むことができる。例えば、XMLやJsonで記述された構造を、データベースを設計することなく読み込むことが可能であり、実際、そのような機能が実装されている。この木をそのままデータベースとして使用することも可能である。しかし、木の変更の手間は木の構造に依存する。
24
tatsuki
parents: 21
diff changeset
27 %特に非破壊木構造を採用しているJungleでは木構造の変更にo(1)からo(n)の様々な選択肢がある。つまり、アプリケーションに合わせて木を設計しない限り、
31
tatsuki
parents: 29
diff changeset
28 特に非破壊木構造を採用しているJungleでは、木構造の変更の手間はO(1)からO(n)となる。つまり、アプリケーションに合わせて木を設計しない限り、
24
tatsuki
parents: 21
diff changeset
29 十分な性能を出すことはできない。逆に言えば、正しい木の設計を行えば高速な処理が可能である。
tatsuki
parents: 21
diff changeset
30
tatsuki
parents: 21
diff changeset
31 Jungleは基本的にon memoryで使用することを考えており、一度、木のルートを取得すれば、その上で木構造として自由にアクセスして良い。
tatsuki
parents: 21
diff changeset
32 Jungleは分散データベースを構成するように設計されており、分散ノード間の通信は木の変更のログを交換することによって行われる。
tatsuki
parents: 21
diff changeset
33 持続性のある分散ノードを用いることでJungleの持続性を保証することができる。本論文では分散実装部分ではなく on memory DBの
tatsuki
parents: 21
diff changeset
34 部分について考察する。
tatsuki
parents: 21
diff changeset
35
3
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
36 \subsection{木の生成}
24
tatsuki
parents: 21
diff changeset
37 初めにJungleにおける木の生成について述べる。
tatsuki
parents: 21
diff changeset
38 Jungleは複数の木を一意な名前を利用して管理しており、名前を利用することで作成、編集、削除を行う。
tatsuki
parents: 21
diff changeset
39 以下にJungleが提供している木の生成・管理を行うAPI(表\ref{jungleAPI})を記す。
3
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
40 \begin{table}[htb]
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
41 \begin{center}
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
42 \caption{Jungleに実装されているAPI}
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
43 \begin{tabular}{|l|l|} \hline
21
tatsuki
parents: 15
diff changeset
44 JungleTree &Jungleに新しく木を生成する \\
tatsuki
parents: 15
diff changeset
45 createNewTree( &木の名前が重複した場合 \\
tatsuki
parents: 15
diff changeset
46 String treeName) &生成に失敗しnullを返す。 \\ \hline
tatsuki
parents: 15
diff changeset
47 JungleTree &JungleからtreeNameと名前が \\
tatsuki
parents: 15
diff changeset
48 getTreeByName( &一致するtreeを取得する。 \\
tatsuki
parents: 15
diff changeset
49 String treeName) &名前が一致するTreeがない場合 \\
tatsuki
parents: 15
diff changeset
50 &取得は失敗しnullを返す \\ \hline
3
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
51 \end{tabular}
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
52 \label{jungleAPI}
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
53 \end{center}
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
54 \end{table}
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
55
31
tatsuki
parents: 29
diff changeset
56 \newpage
24
tatsuki
parents: 21
diff changeset
57 \subsection{TreeNode}
31
tatsuki
parents: 29
diff changeset
58 Jungleが保持している木は、複数のノードの集合で出来ている。
tatsuki
parents: 29
diff changeset
59 ノードは、自身の子のListと属性名と属性値の組でデータを持つ。
tatsuki
parents: 29
diff changeset
60 ノードに対するアクセスは、表\ref{TreeNodeAPI}に記述されているAPIを用いて行われる。
24
tatsuki
parents: 21
diff changeset
61
tatsuki
parents: 21
diff changeset
62 \begin{table}[htb]
tatsuki
parents: 21
diff changeset
63 \begin{center}
tatsuki
parents: 21
diff changeset
64 \caption{TreeNodeに実装されているAPI}
tatsuki
parents: 21
diff changeset
65 \begin{tabular}{|l|l|} \hline
tatsuki
parents: 21
diff changeset
66 Children &ノードの子供を扱う \\
tatsuki
parents: 21
diff changeset
67 getChildren() &Childrenクラスを返す。 \\ \hline
tatsuki
parents: 21
diff changeset
68 Attribute &ノードが保持しているデータを \\
tatsuki
parents: 21
diff changeset
69 getAttribute() &扱うAttribteクラスを返す。 \\ \hline
tatsuki
parents: 21
diff changeset
70 \end{tabular}
tatsuki
parents: 21
diff changeset
71 \label{TreeNodeAPI}
tatsuki
parents: 21
diff changeset
72 \end{center}
tatsuki
parents: 21
diff changeset
73 \end{table}
tatsuki
parents: 21
diff changeset
74
tatsuki
parents: 21
diff changeset
75 Childrenクラスは表\ref{Children}に記述されたAPIを、Attributeクラスは表\ref{Attribute}に記述されたAPIを提供する。
tatsuki
parents: 21
diff changeset
76 これらを利用しノードの子供や、保持する値にアクセスする。
tatsuki
parents: 21
diff changeset
77 \begin{table}[htbH]
tatsuki
parents: 21
diff changeset
78 \begin{center}
tatsuki
parents: 21
diff changeset
79 \caption{Childrenに実装されているAPI}
tatsuki
parents: 21
diff changeset
80 \begin{tabular}{|l|l|} \hline
tatsuki
parents: 21
diff changeset
81 int size() &子供の数を返す。 \\ \hline
tatsuki
parents: 21
diff changeset
82 Either &ノードが持つ子供の中から、 \\
tatsuki
parents: 21
diff changeset
83 \textless Error,TreeNode\textgreater &変数numで指定された \\
tatsuki
parents: 21
diff changeset
84 at(int num) &位置にある子どもを返す。 \\ \hline
tatsuki
parents: 21
diff changeset
85 \end{tabular}
tatsuki
parents: 21
diff changeset
86 \label{Children}
tatsuki
parents: 21
diff changeset
87 \end{center}
tatsuki
parents: 21
diff changeset
88 \end{table}
tatsuki
parents: 21
diff changeset
89
tatsuki
parents: 21
diff changeset
90
tatsuki
parents: 21
diff changeset
91 関数children.at(int num)が返すEither\textless Error,TreeNode\textgreater クラスは、変数numで指定した場所に子ノードがあればTreeNodeクラスを、無かった場合はErrorクラスを持つ型である。
tatsuki
parents: 21
diff changeset
92
tatsuki
parents: 21
diff changeset
93
tatsuki
parents: 21
diff changeset
94
tatsuki
parents: 21
diff changeset
95 \begin{table}[htbH]
tatsuki
parents: 21
diff changeset
96 \begin{center}
tatsuki
parents: 21
diff changeset
97 \caption{Attributeに実装されているAPI}
tatsuki
parents: 21
diff changeset
98 \begin{tabular}{|l|l|} \hline
tatsuki
parents: 21
diff changeset
99 ByteBuffer &ノードが持つ値から、 \\
tatsuki
parents: 21
diff changeset
100 get(String key) &属性名 keyとペアの属性値 \\
tatsuki
parents: 21
diff changeset
101 &をByteBuffer型で返す。 \\ \hline
tatsuki
parents: 21
diff changeset
102 String &ノードが持つ値から、\\
tatsuki
parents: 21
diff changeset
103 getString(String key) &属性名 key とペアの属性値 \\
tatsuki
parents: 21
diff changeset
104 &をString型で返す。 \\ \hline
tatsuki
parents: 21
diff changeset
105 \end{tabular}
tatsuki
parents: 21
diff changeset
106 \label{Attribute}
tatsuki
parents: 21
diff changeset
107 \end{center}
tatsuki
parents: 21
diff changeset
108 \end{table}
tatsuki
parents: 21
diff changeset
109
31
tatsuki
parents: 29
diff changeset
110 \newpage
24
tatsuki
parents: 21
diff changeset
111 以下にルートノードの2番目の子供から、属性名 nameとペアになっている属性値を取得するサンプルコードを記述する。
tatsuki
parents: 21
diff changeset
112 \begin{lstlisting}[frame=lrbt,numbers=left,label=getAttributeCode]
tatsuki
parents: 21
diff changeset
113 JungleTree tree = jungle.getTreeByName("TreeName");
tatsuki
parents: 21
diff changeset
114 TreeNode root = tree.getRootNode();
tatsuki
parents: 21
diff changeset
115 Children children = root.getChildren();
tatsuki
parents: 21
diff changeset
116 Either<Error,TreeNode> either = children.at(2);
tatsuki
parents: 21
diff changeset
117 if (either.isA())
tatsuki
parents: 21
diff changeset
118 throw new IllegalStateException();
tatsuki
parents: 21
diff changeset
119 TreeNode child = either.b();
tatsuki
parents: 21
diff changeset
120 Attribute attribute = child.getAttribute();
tatsuki
parents: 21
diff changeset
121 String value = attribute.getString("name");
tatsuki
parents: 21
diff changeset
122 \end{lstlisting}
tatsuki
parents: 21
diff changeset
123
tatsuki
parents: 21
diff changeset
124 \begin{enumerate}
tatsuki
parents: 21
diff changeset
125 \item Jungleから名前を指定して木を取得する。
tatsuki
parents: 21
diff changeset
126 \item (1)で取得した木のルートノードを取得する。
tatsuki
parents: 21
diff changeset
127 \item (2)で取得したルートノードからChildren型の子ノードを取得する。
tatsuki
parents: 21
diff changeset
128 \item (3)で取得した変数childrenから2番目の子供を取得する。
tatsuki
parents: 21
diff changeset
129 \item 2番目の子供が取得できたかを調べる。
tatsuki
parents: 21
diff changeset
130 \item 取得できていなかった場合Exceptionを投げる。
tatsuki
parents: 21
diff changeset
131 \item 取得に成功していた場合、eitherから子ノードを受け取る。
tatsuki
parents: 21
diff changeset
132 \item (7)で取得した子ノードからAttributeを取得する。
tatsuki
parents: 21
diff changeset
133 \item (8)で取得したAttributeから属性名 nameがペアの値を取得する。
tatsuki
parents: 21
diff changeset
134 \end{enumerate}
tatsuki
parents: 21
diff changeset
135
tatsuki
parents: 21
diff changeset
136
8
36f400a632c1 add ipsj
tatsuki
parents: 4
diff changeset
137 \subsection{NodePath}
31
tatsuki
parents: 29
diff changeset
138 Jungleでは、木のノードの位置をNodePathクラスを使って表す。
24
tatsuki
parents: 21
diff changeset
139 NodePathクラスはルートノードからスタートし、対象のノードまでの経路を、数字を用いて指し示すことで対象のノードの場所を表す。また、ルートノードは例外として-1と表記される。
tatsuki
parents: 21
diff changeset
140 NodePathクラスが\textless -1,1,2,3\textgreater を表している際の例を図\ref{NodePath}に記す。
8
36f400a632c1 add ipsj
tatsuki
parents: 4
diff changeset
141 \begin{figure}[h]
36f400a632c1 add ipsj
tatsuki
parents: 4
diff changeset
142 \begin{center}
29
365a3ea6a21f change image size
tatsuki
parents: 24
diff changeset
143 \includegraphics[height = 6cm , bb=0 0 568 455]{images/nodePath.pdf}
8
36f400a632c1 add ipsj
tatsuki
parents: 4
diff changeset
144 \caption{NodePath}
21
tatsuki
parents: 15
diff changeset
145 \label{NodePath}
8
36f400a632c1 add ipsj
tatsuki
parents: 4
diff changeset
146 \end{center}
36f400a632c1 add ipsj
tatsuki
parents: 4
diff changeset
147 \end{figure}
2
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
148
24
tatsuki
parents: 21
diff changeset
149
tatsuki
parents: 21
diff changeset
150
tatsuki
parents: 21
diff changeset
151 \newpage
tatsuki
parents: 21
diff changeset
152
tatsuki
parents: 21
diff changeset
153 \subsection{木の編集API}
tatsuki
parents: 21
diff changeset
154 Jungleの木の編集はJungleTreeEditorクラスを用いて行われる。
tatsuki
parents: 21
diff changeset
155 JungleTreeEditorクラスには編集を行うために、表\ref{editor}で定義されているAPIが実装されている。
2
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
156
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
157 \begin{table}[htb]
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
158 \begin{center}
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
159 \caption{Editorに実装されているAPI}
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
160 \begin{tabular}{|l|l|} \hline
24
tatsuki
parents: 21
diff changeset
161 Either &変数pathで指定した場所 \\
tatsuki
parents: 21
diff changeset
162 \textless Error,JungleTreeEditor\textgreater &にある、ノードの子供の \\
tatsuki
parents: 21
diff changeset
163 addNewChildAt( &変数posで指定した位置に\\
tatsuki
parents: 21
diff changeset
164 NodePath path, &子ノードを追加する。 \\
tatsuki
parents: 21
diff changeset
165 int pos) & \\ \hline
tatsuki
parents: 21
diff changeset
166 Either &変数pathで指定した場所 \\
tatsuki
parents: 21
diff changeset
167 \textless Error,JungleTreeEditor\textgreater &にある、ノードの子供の \\
tatsuki
parents: 21
diff changeset
168 deleteChildAt( &変数posで指定した位置の\\
tatsuki
parents: 21
diff changeset
169 NodePath path, &子ノードを削除する。 \\
tatsuki
parents: 21
diff changeset
170 int pos) & \\ \hline
tatsuki
parents: 21
diff changeset
171 Either &変数pathで指定した場所 \\
tatsuki
parents: 21
diff changeset
172 \textless Error,JungleTreeEditor\textgreater &にあるノードに、 \\
tatsuki
parents: 21
diff changeset
173 putAttribute( &属性名 変数key \\
tatsuki
parents: 21
diff changeset
174 NodePath path, &属性値 変数valu \\
tatsuki
parents: 21
diff changeset
175 String key, &のペアで値を挿入する。 \\
tatsuki
parents: 21
diff changeset
176 ByteBuffer value) & \\ \hline
tatsuki
parents: 21
diff changeset
177 Either &変数pathで指定した場所 \\
tatsuki
parents: 21
diff changeset
178 \textless Error,JungleTreeEditor\textgreater &にあるノードが持つ、 \\
tatsuki
parents: 21
diff changeset
179 deleteAttribute( &属性名 変数keyとペアで \\
tatsuki
parents: 21
diff changeset
180 NodePath path, &保存されているデータを \\
tatsuki
parents: 21
diff changeset
181 String key) &削除する。 \\ \hline
tatsuki
parents: 21
diff changeset
182 Either &変数pathで指定した場所 \\
tatsuki
parents: 21
diff changeset
183 \textless Error,JungleTreeEditor\textgreater &にある、ノードの変数num\\
tatsuki
parents: 21
diff changeset
184 moveChild( &で指定された位置の子供を\\
tatsuki
parents: 21
diff changeset
185 NodePath path &変数moveの方向に\\
tatsuki
parents: 21
diff changeset
186 ,int num, &移動させる。 \\
tatsuki
parents: 21
diff changeset
187 String move) & \\ \hline
tatsuki
parents: 21
diff changeset
188 Either &ルートノードの上に新しい\\
tatsuki
parents: 21
diff changeset
189 \textless Error,JungleTreeEditor\textgreater &ルートノードを追加する\\
tatsuki
parents: 21
diff changeset
190 pushPop() &線形のTree等を作る際に\\
tatsuki
parents: 21
diff changeset
191 &使用することで計算量を\\
tatsuki
parents: 21
diff changeset
192 &O(n)からO(1)にできる。\\ \hline
2
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
193 \end{tabular}
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
194 \label{editor}
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
195 \end{center}
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
196 \end{table}
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
197
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
198
31
tatsuki
parents: 29
diff changeset
199 編集後に返されるJungleTreeEditorクラスは、編集後の木構造を保持しているため、編集前の木構造を保持しているJungleTreeEditorクラスとは別のオブジェクトである。
24
tatsuki
parents: 21
diff changeset
200 編集を行った後は、関数editor.success()で今までの編集をコミットすることができる。その際他のJungleTreeEditorクラスによって木が更新されていた場合はコミットに失敗する。
3
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
201 その場合は最初からやり直す必要がある。
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
202
31
tatsuki
parents: 29
diff changeset
203 以下にJungleTreeEditorクラスを用いて、木の編集を行うサンプルコードを記述する。
2
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
204
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
205 \begin{lstlisting}[frame=lrbt,numbers=left,label=editorCode]
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
206 JungleTreeEditor editor = tree.getTreeEditor();
21
tatsuki
parents: 15
diff changeset
207 DefaultNodePath editNodePath = new DefaultNodePath();
tatsuki
parents: 15
diff changeset
208 Either<Error, JungleTreeEditor> either = editor.addNewChildAt(editNodePath, 0);
tatsuki
parents: 15
diff changeset
209 if (either.isA())
2
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
210 throw new IllegalStateException();
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
211 editor = either.b();
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
212 editor.success();
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
213 \end{lstlisting}
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
214
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
215 \begin{enumerate}
31
tatsuki
parents: 29
diff changeset
216 \item 関数tree.getEditor()で編集を行う木から、JungleTreeEditorクラスを取得する。
tatsuki
parents: 29
diff changeset
217 \item 次に変更するノードの場所を示す、NodePathクラスを作成する。
tatsuki
parents: 29
diff changeset
218 \item 関数editor.addNewChildAt()を用いて、変数pathで指定したノードの子供の0番目に子ノードを追加する。
24
tatsuki
parents: 21
diff changeset
219 \item 返り値の変数EitherがErrorクラスを保持していないか(編集に失敗していないか)を確認する。
tatsuki
parents: 21
diff changeset
220 \item Errorクラスを保持していた場合Exceptionを投げる。
tatsuki
parents: 21
diff changeset
221 \item 編集に成功していた場合、編集後のJungleTreeEditorクラスを取得する。
tatsuki
parents: 21
diff changeset
222 \item (6)で取得したJungleTreeEditorクラスを用いて木の変更をコミットする。
2
031742e63cf2 add image
tatsuki
parents: 1
diff changeset
223 \end{enumerate}
3
9fdb28e064df pre fix
tatsuki
parents: 2
diff changeset
224
31
tatsuki
parents: 29
diff changeset
225 これらのAPIにより、Jungleは木構造を格納、編集する機能を持っている。