パス修復後の子孫数の再カウント

仕様

  • PageService.resumeRenameSubOperation によるパスの修復後に、Rename処理の失敗によって発生する子孫数の不整合を修正する

なぜ必要か

  • Rename に失敗した場合、Rename の対象であるページの祖先にあたるページの子孫数に不整合が生じる。
    • 関連するページの子孫数は、PageService.renameSubOperation でリネーム処理がすべて終わった後に更新しているため、中断されると子孫数が更新されない
    • 子孫数に不整合の起きるページは、Rename 前後の親ページおよび、それらから parent で辿れる祖先のページ

対象

  • PageOperation ドキュメント の fromPathtoPath から、/ までのすべてのパスのページ
    • fromPath/1/2/XXX, toPath/A/B/XXX の場合の対象例
      • /, /1, /1/2/, /A, /A/B
      • フォルダをイメージするとわかりやすい
  • Rename の対象であるページより下のページの子孫数は壊れない(そもそも更新する必要がないため)。

方法

  • PageService.resumeRenameOperation の最後に修正を行う。
  • PageOperation ドキュメントのfromPathtoPath から修正対象のパスをすべて取得する(同じパスはマージする)
  • 取得したパス名を持つページを、パスの降順ですべて取得し、子孫数の再計算と更新を順次行う
    • 更新する値は以下の足し算
      • 子孫数を更新するページの id を parent に持つページの数(空ページは除く)
      • 上記が持つ descendantCount の合計