Mercurial > hg > Papers > 2016 > tatsuki-prosym
view jungle.tex @ 23:b9c1613d9f84
Add NodePath graffle
author | Kazuma |
---|---|
date | Tue, 29 Nov 2016 01:45:18 +0900 |
parents | 27f92e7af1fc |
children | 24a324c76245 |
line wrap: on
line source
\section{JungleのAPI} Jungleは複数の木の集合からなり、木は複数のノードの集合で出来ている。 それぞれの木には名前が付いている。 木の中のノードの位置はNodePathで表される。 指定されたノードに対する編集を行うJungleTreeEditorを呼び出す。 編集し終わった後に名前に対する木のルートをアトミックに変更するcommit APIを呼び出す。 本節ではJungle DBのAPIについて解説する。 \subsection{木の生成} Jungleには木の生成・管理を行うAPI(表\ref{jungleAPI})が実装されている。 \begin{table}[htb] \begin{center} \caption{Jungleに実装されているAPI} \begin{tabular}{|l|l|} \hline JungleTree &Jungleに新しく木を生成する \\ createNewTree( &木の名前が重複した場合 \\ String treeName) &生成に失敗しnullを返す。 \\ \hline JungleTree &JungleからtreeNameと名前が \\ getTreeByName( &一致するtreeを取得する。 \\ String treeName) &名前が一致するTreeがない場合 \\ &取得は失敗しnullを返す \\ \hline \end{tabular} \label{jungleAPI} \end{center} \end{table} \newpage \subsection{NodePath} JungleのNodeの位置はNodePathを使って表す。 NodePathはrootNodeからスタートし、対象のNodeまでの経路を、数字を用いて指し示すことで対象のNodeの場所を表す。また、rootNodeは例外として-1と表記される。 NodePathが\textless -1,1,2,3\textgreater を表している際の例を図\ref{NodePath}に記す。 \begin{figure}[h] \begin{center} \includegraphics[height = 4cm , bb=0 0 313 301]{images/nodePath.pdf} \caption{NodePath} \label{NodePath} \end{center} \end{figure} \subsection{木の編集} Jungleの木の編集はJungleTreeEditorを用いて行われる。 JungleTreeEditorには表\ref{editor}で定義されているAPIが実装されている。 \begin{table}[htb] \begin{center} \caption{Editorに実装されているAPI} \begin{tabular}{|l|l|} \hline addNewChildAt( &pathで指定した場所にある \\ NodePath path, &Nodeの子供のpos番目にNodeを \\ int pos) &追加する。 \\ \hline deleteChildAt( &pathで指定した場所にある \\ NodePath path, &Nodeのpos番目の子ノードを \\ int pos) &削除する。 \\ \hline putAttribute( &pathで指定した場所にある \\ NodePath path, &Nodeに属性名 key \\ String key, &属性値 valueのペアで \\ ByteBuffer value) &値を挿入する。 \\ \hline deleteAttribute( &pathで指定した場所にある \\ NodePath path, &Nodeが持つ属性名keyとペアで \\ String key) &保存されているデータを削除する。 \\ \hline moveChild( &pathで指定された位置にある \\ NodePath path &NodeのchildNum番目の \\ ,int childNum, &childをmoveの方向に移動させる。 \\ String move) & \\ \hline pushPop() & rootNodeの上に新しいrootNodeを追加する。 \\ & 線形のTree等を作る際に使用することで \\ & 計算量をO(n)からO(1)にできる。 \\ \hline \end{tabular} \label{editor} \end{center} \end{table} これらのAPIは \begin{lstlisting}[frame=lrbt,numbers=left,label=editorCode] Either<Error, JungleTreeNode> \end{lstlisting} 型を返す。 これはエラーの場合はErrorが格納されており、編集が成功した場合JungleTreeEditorを保持する。 編集後に返されるJungleTreeEditorは、編集された木構造を保持しているため、編集前の木構造を保持しているJungleTreeEditorとは別のオブジェクトである。 編集を行った後は、editor.success()で今までの編集をコミットすることができる。その際他のJungleTreeEditorによって木が更新されていた場合はコミットに失敗する。 その場合は最初からやり直す必要がある。 以下にJungleTreeEditorを使ったサンプルコードを記述する。 \begin{lstlisting}[frame=lrbt,numbers=left,label=editorCode] JungleTreeEditor editor = tree.getTreeEditor(); DefaultNodePath editNodePath = new DefaultNodePath(); Either<Error, JungleTreeEditor> either = editor.addNewChildAt(editNodePath, 0); if (either.isA()) throw new IllegalStateException(); editor = either.b(); editor.success(); \end{lstlisting} \begin{enumerate} \item tree.getEditor()でtreeからJungleTreeEditorを取得する。 \item 次に変更するノードの場所を指すNodePathを作成する。 \item editor.addNewChildAtでpathで指定したノードの子供の0番目に子ノードを追加する。 \item 返り値のEitherがErrorを保持していないか(編集に失敗していないか)を確認する。 \item Errorを保持していた場合Exceptionを投げる。 \item 編集に成功していた場合、編集後のEditorを取得する。 \item (6)で取得したEditorを用いて木の変更をコミットする。 \end{enumerate} これらのAPIによりJungleは木構造を格納、編集する機能を持っている。