comparison Slide/prosym.md @ 64:763d63697d93

change node.
author Kazuma Takeda
date Sun, 25 Dec 2016 20:57:57 +0900
parents 7071c1eff185
children 3d51b13cd099
comparison
equal deleted inserted replaced
63:7071c1eff185 64:763d63697d93
158 throw new IOException(); 158 throw new IOException();
159 TreeNode child = either.b(); 159 TreeNode child = either.b();
160 160
161 ``` 161 ```
162 162
163 # JungleのAPI 163 # Jungleのサンプルコード
164 164
165 Jungleの例を記載する。 165 Jungleの例を記載する。
166 166
167 以下のコードは、ルートノードの2番目の子どもから、属性名"name"とペアになっている属性値を取得する。 167 以下のコードは、ルートノードの2番目の子どもから、属性名"name"とペアになっている属性値を取得する。
168 168
197 197
198 <div style="text-align: center;"> 198 <div style="text-align: center;">
199  <img src="./images/NodePath.pdf" alt="message" width="400"> 199  <img src="./images/NodePath.pdf" alt="message" width="400">
200 </div> 200 </div>
201 201
202 # ノードの追加、削除 202 # ノードの追加
203 203
204 ``` Java 204 ``` Java
205 // 変数pathで指定した場所にある、ノードの子供の変数posで指定した位置子ノードを追加 205 // 変数pathで指定した場所にある、ノードの子供の変数posで指定した位置子ノードを追加
206 Either<Error, JungleTreeEditor> addNewChildAt( NodePath path, int pos) 206 Either<Error, JungleTreeEditor> addNewChildAt( NodePath path, int pos)
207
208 // 変数pathで指定した場所にある、ノードの子供の変数posで指定した位置の子ノードを削除
209 Either<Error, JungleTreeEditor> deleteChildAt( NodePath path, int pos)
210 ``` 207 ```
211 208
212 # ノードに対してデータの挿入 209 # ノードに対してデータの挿入
213 210
214 ``` Java 211 ``` Java
232 // 木へ行った変更をコミット。自分が編集を行っていた間に、他のJungleTreeEditorクラスによって木が更新されていた場合、コミットは失敗 229 // 木へ行った変更をコミット。自分が編集を行っていた間に、他のJungleTreeEditorクラスによって木が更新されていた場合、コミットは失敗
233 Either<Error, JungleTreeEditor> success() 230 Either<Error, JungleTreeEditor> success()
234 ``` 231 ```
235 232
236 233
237 # JungleのAPI 234 # Jungleのサンプルコード
238 235
239 Jungleの木を編集する例を記載する。 236 Jungleの木を編集する例を記載する。
240 以下のコードは木からEditorを取得し、変数editorNodePathで指定したノードに新しい子ノードを追加したものである。 237 以下のコードは木からEditorを取得し、変数editorNodePathで指定したノードに新しい子ノードを追加したものである。
241 238
242 ``` Java 239 ``` Java
248 editor = either.b(); 245 editor = either.b();
249 editor.success(); 246 editor.success();
250 247
251 ``` 248 ```
252 249
250 # 検索APIの実装
251
252 属性名key 属性値valueの組で検索を行うAPIの実装を、木の走査を行うTraverserクラス内に、lambda式を用いて行った。
253
254 以下に検索を行う関数findの定義を記述する。
255
256 ``` Java
257 public Iterator<TreeNode> find(Query query, String key, String searchValue);
258 ```
259
260 関数findは引数に、Query query、String key、String valueの3つの引数を取り、条件に一致したノードのIteratorインタフェースを返す。
261
262
263 第1引数には、探索の条件を記述する関数boolean comdition(TreeNode)を定義したInterface Queryを、第2、第3引数の、String key、String ValueはIndexを用いた絞込みに使用する。
264
265 # 関数findを用いた検索APIのサンプルコード
266
267 ``` Java
268 InterfaceTraverser traverser = tree.getTraverser(true);
269 Iterator<TreeNode> resultNodeIterator = traverser.find((TreeNode node) -> {
270 String personId = node.getAttributes().getString("Personid");
271 if (personId == null) return false;
272 return personId.equals("p:2");
273 }, "element", "Person");
274 ```
275
276 ・Traverserクラスは木の走査を行う。まずは木から取得してくる。
277
278 ・Indexからfindの第2、第3引数である、属性名"element" 属性値"Person"の組のノードを取得し、Queryに渡す。
279
280 ・引数のノードから関数getAttributes().getString("Personid")で属性名Personidとペアになっている属性値を取得する。
281
282 ・属性値がnullだった場合、このノードには属性名がPersonidの組のデータは存在しないので、falseを返し次のノードの評価を行う。
283
284 ・属性値がnullでなかった場合、p:2と一致するかどうかを調べ結果を返す。
285
286
253 # JungleでのIndexの実装 287 # JungleでのIndexの実装
288
289 検索を行う際にIndexを使いたい。そこでIndexを実装した。
254 290
255 Jungleは、非破壊的木構造というデータ構造上、過去の版の木構造を全て保持しているため、全ての版に独立したIndexが必要となる。 291 Jungleは、非破壊的木構造というデータ構造上、過去の版の木構造を全て保持しているため、全ての版に独立したIndexが必要となる。
256 292
257 そのため、前の版のIndexを破壊すること無く、Indexを更新する必要があった。 293 そのため、前の版のIndexを破壊すること無く、Indexを更新する必要があった。
258 294
299 335
300 ・取得したIndexに、検索で使用する属性値"kanagawa"でgetを行う。属性名"name" 属性値kanagawaの値を持つノードのリストが、Optionalクラスに包まれて返ってくる。 336 ・取得したIndexに、検索で使用する属性値"kanagawa"でgetを行う。属性名"name" 属性値kanagawaの値を持つノードのリストが、Optionalクラスに包まれて返ってくる。
301 337
302 ・中身が入っているか確認、入っていた場合OptionalオブジェクトからノードリストのIteratorを返す。 338 ・中身が入っているか確認、入っていた場合OptionalオブジェクトからノードリストのIteratorを返す。
303 339
304 # 検索APIの実装
305
306 属性名key 属性値valueの組で検索を行うAPIの実装を、木の走査を行うTraverserクラス内に、lambda式を用いて行った。
307
308 以下に検索を行う関数findの定義を記述する。
309
310 ``` Java
311 public Iterator<TreeNode> find(Query query, String key, String searchValue);
312 ```
313
314 関数findは引数に、Query query、String key、String valueの3つの引数を取り、条件に一致したノードのIteratorインタフェースを返す。
315
316
317 第1引数には、探索の条件を記述する関数boolean comdition(TreeNode)を定義したInterface Queryを、第2、第3引数の、String key、String ValueはIndexを用いた絞込みに使用する。
318
319 # 関数findを用いた検索APIのサンプルコード
320
321 ``` Java
322 InterfaceTraverser traverser = tree.getTraverser(true);
323 Iterator<TreeNode> resultNodeIterator = traverser.find((TreeNode node) -> {
324 String personId = node.getAttributes().getString("Personid");
325 if (personId == null) return false;
326 return personId.equals("p:2");
327 }, "element", "Person");
328 ```
329
330 ・Traverserクラスは木の走査を行う。まずは木から取得してくる。
331
332 ・Indexからfindの第2、第3引数である、属性名"element" 属性値"Person"の組のノードを取得し、Queryに渡す。
333
334 ・引数のノードから関数getAttributes().getString("Personid")で属性名Personidとペアになっている属性値を取得する。
335
336 ・属性値がnullだった場合、このノードには属性名がPersonidの組のデータは存在しないので、falseを返し次のノードの評価を行う。
337
338 ・属性値がnullでなかった場合、p:2と一致するかどうかを調べ結果を返す。
339
340 # HTML Rendering Engine 340 # HTML Rendering Engine
341 341
342 Jungleの特性を生かしたRendering Engineを開発した。 342 Jungleの特性を生かしたRendering Engineを開発した。
343 343
344 今回は例題として、日記(ブログ)を選択した。 344 今回は例題として、日記(ブログ)を選択した。