itizawa 5 лет назад
Родитель
Сommit
936411c162
1 измененных файлов с 40 добавлено и 4 удалено
  1. 40 4
      src/server/service/page.js

+ 40 - 4
src/server/service/page.js

@@ -2,9 +2,12 @@ const mongoose = require('mongoose');
 const escapeStringRegexp = require('escape-string-regexp');
 const logger = require('@alias/logger')('growi:models:page');
 const debug = require('debug')('growi:models:page');
+const { Writable } = require('stream');
+const { createBatchStream } = require('@server/util/batch-stream');
 const { serializePageSecurely } = require('../models/serializers/page-serializer');
 
 const STATUS_PUBLISHED = 'published';
+const BULK_REINDEX_SIZE = 100;
 
 class PageService {
 
@@ -128,13 +131,46 @@ class PageService {
   async completelyDeletePageRecursively(targetPage, user, options = {}) {
     const findOpts = { includeTrashed: true };
     const Page = this.crowi.model('Page');
+    const { PageQueryBuilder } = Page;
 
     // find manageable descendants (this array does not include GRANT_RESTRICTED)
-    const pages = await Page.findManageableListWithDescendants(targetPage, user, findOpts);
+    // const pages = await Page.findManageableListWithDescendants(targetPage, user, findOpts);
+
+    const readStream = new PageQueryBuilder(Page.find())
+      .addConditionToExcludeRedirect()
+      .addConditionToListOnlyDescendants(targetPage.path)
+      .addConditionToFilteringByViewer(user)
+      .query
+      .lean()
+      .cursor();
+
+    // const completelyDeletePage = this.completelyDeletePage.bind(this);
+    let count = 0;
+    const writeStream = new Writable({
+      objectMode: true,
+      async write(batch, encoding, callback) {
+        try {
+          count += batch.length;
+          console.log(batch);
+          // await completelyDeletePage(batch, user, options);
+          logger.info(`Adding pages progressing: (count=${count})`);
+        }
+        catch (err) {
+          logger.error('addAllPages error on add anyway: ', err);
+        }
+
+        callback();
+      },
+      final(callback) {
+        logger.info(`Adding pages has completed: (totalCount=${count})`);
+
+        callback();
+      },
+    });
 
-    await Promise.all(pages.map((page) => {
-      return this.completelyDeletePage(page, user, options);
-    }));
+    readStream
+      .pipe(createBatchStream(BULK_REINDEX_SIZE))
+      .pipe(writeStream);
   }