Mercurial > hg > Papers > 2016 > tatsuki-prosym
view jungle.tex @ 14:d5366636aa23
add bibliography.tex
author | tatsuki |
---|---|
date | Thu, 10 Nov 2016 19:28:52 +0900 |
parents | 36f400a632c1 |
children | b3350fe86bb7 |
line wrap: on
line source
\section{非破壊的木構造データベースJungle} \subsection{Jungleのデータ構造} Jungleは複数の木の集合からなり、木は複数のノードの集合で出来ている。 ノードは自身の子のListと属性名と属性値の組を持ち、ノードの位置はNodePathで表される。 Jungleは非破壊的木構造であるためデータの編集は一度生成した木を上書きせず、ルートから編集を行うノードまでコピーを行い新しく木構造を構築することで行う。 そのため、読み込みと書き込みを同時に行うことができる。 \subsection{木の生成} Jungleには木を生成、管理を行うAPI(*表\ref{jungleAPI})が実装されている。 \begin{table}[htb] \begin{center} \caption{Jungleに実装されているAPI} \begin{tabular}{|l|l|} \hline createNewTree( &Jungleに新しく木を生成する \\ String treeName) &木の名前が重複した場合 \\ &生成に失敗する \\ \hline getTreeByName( &JungleからtreeNameと名前が \\ String treeName) &一致したtreeを取得する \\ &名前が一致するTreeがない場合 \\ &取得は失敗する \\ \hline \end{tabular} \label{jungleAPI} \end{center} \end{table} \subsection{NodePath} JungleのNodeの位置はNodePathを使って表される。 NodePathはrootNodeからスタートし、ノードの子供の場所を次々表すことで対象のNodeの場所を表す。 \begin{figure}[h] \begin{center} \includegraphics[height = 4cm , bb=0 0 313 301]{images/nodePath.pdf} \caption{NodePath} \label{goodLayoutTree} \end{center} \end{figure} \newpage \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の上に \\ & Nodeを追加する \\ \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 root = new DefaultNodePath(); Either<Error, JungleTreeEditor> either = editor.addNewChildAt(root, 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を持っていた場合木の変更をコミットする \end{enumerate} これらのAPIによりJungleは木構造を格納する機能を持っている。 \subsection{その他のJungle} 他には当研究室で開発を行っている並列分散フレームワークAliceを用いて実装された分散木構造データベースJungle、Haskell版Jungleなどもある。