Taichi Masuyama 4 лет назад
Родитель
Сommit
9f3364d64b
1 измененных файлов с 12 добавлено и 3 удалено
  1. 12 3
      packages/app/src/server/models/page.ts

+ 12 - 3
packages/app/src/server/models/page.ts

@@ -536,17 +536,26 @@ schema.statics.removeLeafEmptyPagesById = async function(pageId: ObjectIdLike):
     return;
   }
 
-  const initialPageIdsToRemove = [initialLeafPage._id];
-
   async function generatePageIdsToRemove(page, pageIds: ObjectIdLike[]): Promise<ObjectIdLike[]> {
     const nextPage = await self.findById(page.parent);
-    if (!nextPage?.isEmpty) {
+
+    if (nextPage == null) {
+      return pageIds;
+    }
+
+    // delete leaf empty pages
+    const isNextPageEmpty = nextPage.isEmpty;
+    const isSiblingsExist = !isNextPageEmpty || await self.exists({ parent: nextPage.parent, _id: { $ne: nextPage._id } }); // evaluate (!isNextPageEmpty ||) first to reduce query
+
+    if (!isNextPageEmpty || isSiblingsExist) {
       return pageIds;
     }
 
     return generatePageIdsToRemove(nextPage, [...pageIds, nextPage._id]);
   }
 
+  const initialPageIdsToRemove = [initialLeafPage._id];
+
   const pageIdsToRemove = await generatePageIdsToRemove(initialLeafPage, initialPageIdsToRemove);
 
   await this.deleteMany({ _id: { $in: pageIdsToRemove } });