パス修復後の子孫数の再カウント
仕様
PageService.resumeRenameSubOperation
によるパスの修復後に、Rename処理の失敗によって発生する子孫数の不整合を修正する
なぜ必要か
- Rename に失敗した場合、Rename の対象であるページの祖先にあたるページの子孫数に不整合が生じる。
- 関連するページの子孫数は、
PageService.renameSubOperation
でリネーム処理がすべて終わった後に更新しているため、中断されると子孫数が更新されない
- 子孫数に不整合の起きるページは、Rename 前後の親ページおよび、それらから
parent
で辿れる祖先のページ
対象
PageOperation
ドキュメント の fromPath
とtoPath
から、/
までのすべてのパスのページ
fromPath
が /1/2/XXX
, toPath
が /A/B/XXX
の場合の対象例
/
, /1
, /1/2/
, /A
, /A/B
- フォルダをイメージするとわかりやすい
- Rename の対象であるページより下のページの子孫数は壊れない(そもそも更新する必要がないため)。
方法
PageService.resumeRenameOperation
の最後に修正を行う。
PageOperation
ドキュメントのfromPath
と toPath
から修正対象のパスをすべて取得する(同じパスはマージする)
- 取得したパス名を持つページを、パスの降順ですべて取得し、子孫数の再計算と更新を順次行う
- 更新する値は以下の足し算
- 子孫数を更新するページの id を parent に持つページの数(空ページは除く)
- 上記が持つ
descendantCount
の合計