Mercurial > hg > Papers > 2016 > tatsuki-prosym
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 今回は例題として、日記(ブログ)を選択した。 |