diff --git a/classes/log/store.php b/classes/log/store.php index 52c9e2bfa49c83d75de7af28a9dd2d2254d7f759..a2af1f6861ad9227b8d22c84acc7b3fb21a5e3c8 100644 --- a/classes/log/store.php +++ b/classes/log/store.php @@ -105,8 +105,23 @@ class store extends php_obj implements log_writer { $this->error_log_value('moodleevent', $moodleevents); $translatorevents = $translatorcontroller->createEvents($moodleevents); $this->error_log_value('translatorevents', $translatorevents); - $xapievents = $xapicontroller->createEvents($translatorevents); - $this->error_log_value('xapievents', $xapievents); + + if (empty($translatorevents)) { + return; + } + + // Split statements into batches. + $eventbatches = array($translatorevents); + $maxbatchsize = get_config('logstore_xapi', 'maxbatchsize'); + + if (!empty($maxbatchsize) && $maxbatchsize < count($translatorevents)) { + $eventbatches = array_chunk($translatorevents, $maxbatchsize); + } + + foreach ($eventbatches as $translatoreventsbatch) { + $xapievents = $xapicontroller->createEvents($translatoreventsbatch); + $this->error_log_value('xapievents', $xapievents); + } } diff --git a/lang/en/logstore_xapi.php b/lang/en/logstore_xapi.php index f8d450cb4463c6672fa95484fc502e7b8e1db272..85027160596a5f602711707b6156af94b79df9b0 100644 --- a/lang/en/logstore_xapi.php +++ b/lang/en/logstore_xapi.php @@ -39,4 +39,8 @@ $string['backgroundmode'] = 'Send statements by scheduled task?'; $string['backgroundmode_desc'] = 'This will force Moodle to send the statements to the LRS in the background, via a cron task. This will make the process less close to real time, but will help to prevent unpredictable Moodle performance linked to the performance of the LRS.'; +$string['maxbatchsize'] = 'Maximum batch size'; +$string['maxbatchsize_desc'] = 'Statements are sent to the LRS in batches. This setting controls the maximum number of + statements that will be sent in a single operation. Setting this to zero will cause all available statements to + be sent at once, although this is not recommended.'; $string['taskemit'] = 'Emit records to LRS'; \ No newline at end of file diff --git a/settings.php b/settings.php index 269603c4cc2326081b0941ab488947a82e17a941..35e853d49a53c52e85640ebefb014d40567f86bd 100644 --- a/settings.php +++ b/settings.php @@ -41,4 +41,8 @@ if ($hassiteconfig) { $settings->add(new admin_setting_configcheckbox('logstore_xapi/backgroundmode', get_string('backgroundmode', 'logstore_xapi'), get_string('backgroundmode_desc', 'logstore_xapi'), 0)); + + $settings->add(new admin_setting_configtext('logstore_xapi/maxbatchsize', + get_string('maxbatchsize', 'logstore_xapi'), + get_string('maxbatchsize_desc', 'logstore_xapi'), 30, PARAM_INT)); } diff --git a/tests/TestCase.php b/tests/TestCase.php index 94c58c53734e3f94ba971529adaf678b75f43edb..dca1aea0f13518db9b5b9501ef81ae8bf78736de 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -30,13 +30,13 @@ abstract class TestCase extends PhpUnitTestCase { $input = $this->constructInput(); $moodle_events = $this->moodle_controller->createEvents([$input]); - $this->assertNotNull($moodle_events, 'Check that the event exists in the expander controller.'); + $this->assertNotNull($moodle_events, 'Check that the events exist in the expander controller.'); $translator_events = $this->translator_controller->createEvents($moodle_events); - $this->assertNotNull($translator_events, 'Check that the event exists in the translator controller.'); + $this->assertNotNull($translator_events, 'Check that the events exist in the translator controller.'); $xapi_events = $this->xapi_controller->createEvents($translator_events); - $this->assertNotNull($xapi_events, 'Check that the event exists in the emitter controller.'); + $this->assertNotNull($xapi_events, 'Check that the events exist in the emitter controller.'); $this->assertOutput($input, $xapi_events); }