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は木構造を格納、編集する機能を持っている。