MDL-66694 mod_forum: Word/char count tidy ups & add task config option
authorMichael Hawkins <michaelh@moodle.com>
Thu, 17 Oct 2019 06:24:16 +0000 (14:24 +0800)
committerMichael Hawkins <michaelh@moodle.com>
Thu, 17 Oct 2019 08:13:23 +0000 (16:13 +0800)
The chunk size used by the existing post word/char count calculation
ad-hoc task can now be set as a $CFG parameter. Also improved the way
the ad-hoc task is re-queued and tidied up some redundant code.

config-dist.php
mod/forum/backup/moodle2/restore_forum_stepslib.php
mod/forum/classes/local/entities/post.php
mod/forum/classes/task/refresh_forum_post_counts.php
mod/forum/lib.php
mod/forum/tests/generator/lib.php
mod/forum/upgrade.txt

index ba04c38..4928d85 100644 (file)
@@ -643,6 +643,15 @@ $CFG->admin = 'admin';
 //              . 'copy_action_column,preview_action_column,delete_action_column,'
 //              . 'creator_name_column,modifier_name_column';
 //
+// Forum summary report
+//
+// In order for the forum summary report to calculate word count and character count data, those details are now stored
+// for each post in the database when posts are created or updated. For posts that existed prior to a Moodle 3.8 upgrade,
+// these are calculated by the refresh_forum_post_counts ad-hoc task in chunks of 5000 posts per batch by default.
+// That default can be overridden by setting an integer value for $CFG->forumpostcountchunksize.
+//
+//      $CFG->forumpostcountchunksize = 5000;
+//
 //=========================================================================
 // 7. SETTINGS FOR DEVELOPMENT SERVERS - not intended for production use!!!
 //=========================================================================
index 1c344a3..593e353 100644 (file)
@@ -116,7 +116,7 @@ class restore_forum_activity_structure_step extends restore_activity_structure_s
             $data->parent = $this->get_mappingid('forum_post', $data->parent);
         }
 
-        $data = \mod_forum\local\entities\post::add_message_counts($data);
+        \mod_forum\local\entities\post::add_message_counts($data);
         $newitemid = $DB->insert_record('forum_posts', $data);
         $this->set_mapping('forum_post', $oldid, $newitemid, true);
 
index a398f50..90cd0fc 100644 (file)
@@ -346,13 +346,12 @@ class post {
      * This methods adds/updates forum posts' word count and char count attributes based on $data->message.
      *
      * @param \stdClass $record A record ready to be inserted / updated in DB.
-     * @return \stdClass The same record with 'wordcount' and 'charcount' attributes.
+     * @return void.
      */
-    public static function add_message_counts(\stdClass $record) : \stdClass {
+    public static function add_message_counts(\stdClass $record) : void {
         if (!empty($record->message)) {
             $record->wordcount = count_words($record->message);
             $record->charcount = count_letters($record->message);
         }
-        return $record;
     }
 }
index afc5213..4e84059 100644 (file)
@@ -43,19 +43,15 @@ class refresh_forum_post_counts extends \core\task\adhoc_task {
 
         require_once($CFG->dirroot . '/mod/forum/lib.php');
 
-        $recordsfound = mod_forum_update_null_forum_post_counts(5000);
-
-        // Re-queue this adhoc task if records were found during the current run,
-        // since there may be more records to update.
-        if ($recordsfound) {
-            $record = new \stdClass();
-            $record->classname = '\mod_forum\task\refresh_forum_post_counts';
-            $record->component = 'mod_forum';
-
-            // Next run time based from nextruntime computation in \core\task\manager::queue_adhoc_task().
-            $nextruntime = time() - 1;
-            $record->nextruntime = $nextruntime;
-            $DB->insert_record('task_adhoc', $record);
+        // Default to chunks of 5000 records per run, unless overridden in config.php
+        $chunksize = $CFG->forumpostcountchunksize ?? 5000;
+
+        $numrecordsupdated = mod_forum_update_null_forum_post_counts($chunksize);
+
+        // Re-queue this adhoc task if the maximum number of records were found during
+        // the current run, since there may be more records to update.
+        if ($numrecordsupdated == $chunksize) {
+            \core\task\manager::queue_adhoc_task(new refresh_forum_post_counts());
         }
     }
 }
index 2216f29..942a6c0 100644 (file)
@@ -2949,7 +2949,7 @@ function forum_add_new_post($post, $mform, $unused = null) {
         $post->mailnow    = 0;
     }
 
-    $post = \mod_forum\local\entities\post::add_message_counts($post);
+    \mod_forum\local\entities\post::add_message_counts($post);
     $post->id = $DB->insert_record("forum_posts", $post);
     $post->message = file_save_draft_area_files($post->itemid, $context->id, 'mod_forum', 'post', $post->id,
             mod_forum_post_form::editor_options($context, null), $post->message);
@@ -3020,7 +3020,7 @@ function forum_update_post($newpost, $mform, $unused = null) {
     }
     $post->message = file_save_draft_area_files($newpost->itemid, $context->id, 'mod_forum', 'post', $post->id,
             mod_forum_post_form::editor_options($context, $post->id), $post->message);
-    $post = \mod_forum\local\entities\post::add_message_counts($post);
+    \mod_forum\local\entities\post::add_message_counts($post);
     $DB->update_record('forum_posts', $post);
     // Note: Discussion modified time/user are intentionally not updated, to enable them to track the latest new post.
     $DB->update_record('forum_discussions', $discussion);
@@ -3083,7 +3083,7 @@ function forum_add_discussion($discussion, $mform=null, $unused=null, $userid=nu
     $post->course        = $forum->course; // speedup
     $post->mailnow       = $discussion->mailnow;
 
-    $post = \mod_forum\local\entities\post::add_message_counts($post);
+    \mod_forum\local\entities\post::add_message_counts($post);
     $post->id = $DB->insert_record("forum_posts", $post);
 
     // TODO: Fix the calling code so that there always is a $cm when this function is called
@@ -6732,7 +6732,7 @@ function mod_forum_user_preferences() {
  * Updates null forum post counts according to the post message.
  *
  * @param  int  $limit  The number of records to update
- * @return bool Whether any records were found and updated
+ * @return int The number of records found and updated
  */
 function mod_forum_update_null_forum_post_counts(int $limit) {
     global $DB;
@@ -6741,15 +6741,16 @@ function mod_forum_update_null_forum_post_counts(int $limit) {
     $recordset = $DB->get_recordset_select('forum_posts', $select, null, 'discussion', 'id, message', 0, $limit);
     if (!$recordset->valid()) {
         $recordset->close();
-        return false;
+        return 0;
     }
 
     foreach ($recordset as $record) {
-        $countsupdate = \mod_forum\local\entities\post::add_message_counts($record);
-        $DB->update_record('forum_posts', $countsupdate);
+        \mod_forum\local\entities\post::add_message_counts($record);
+        $DB->update_record('forum_posts', $record);
     }
 
+    $recordscount = count($recordset);
     $recordset->close();
 
-    return true;
+    return $recordscount;
 }
index 3705db8..dad429e 100644 (file)
@@ -313,7 +313,7 @@ class mod_forum_generator extends testing_module_generator {
         }
 
         $record = (object) $record;
-        $record = \mod_forum\local\entities\post::add_message_counts($record);
+        \mod_forum\local\entities\post::add_message_counts($record);
 
         // Add the post.
         $record->id = $DB->insert_record('forum_posts', $record);
index e64b5fb..dc259c0 100644 (file)
@@ -5,6 +5,10 @@ information provided here is intended especially for developers.
 
 * The following functions have been finally deprecated and can not be used anymore:
     * forum_scale_used()
+* In order for the forum summary report to calculate word count and character count data, those details are now stored
+    for each post in the database when posts are created or updated. For posts that existed prior to a Moodle 3.8 upgrade, these
+    are calculated by the refresh_forum_post_counts ad-hoc task in chunks of 5000 posts by default. Site admins are able to modify this
+    default, by setting $CFG->forumpostcountchunksize to the required integer value.
 
 === 3.7 ===
   * Changed the forum discussion rendering to use templates rather than print functions.