MDL-75119 reportbuilder: preload context data for column callbacks.

This prevents additional requests for context instances in the
callback methods, by preloading all required data in the initial
field select.
This commit is contained in:
Paul Holden
2022-07-04 12:34:15 +01:00
parent 9ccda59e00
commit dc60fe6662
3 changed files with 50 additions and 24 deletions
@@ -19,6 +19,7 @@ declare(strict_types=1);
namespace core_badges\reportbuilder\local\entities;
use context_course;
use context_helper;
use context_system;
use html_writer;
use lang_string;
@@ -48,7 +49,10 @@ class badge extends base {
* @return array
*/
protected function get_default_table_aliases(): array {
return ['badge' => 'b'];
return [
'badge' => 'b',
'context' => 'bctx',
];
}
/**
@@ -89,6 +93,7 @@ class badge extends base {
*/
protected function get_all_columns(): array {
$badgealias = $this->get_table_alias('badge');
$contextalias = $this->get_table_alias('context');
// Name.
$columns[] = (new column(
@@ -101,7 +106,7 @@ class badge extends base {
->add_field("{$badgealias}.name")
->set_is_sortable(true);
// Description.
// Description (note, this column contains plaintext so requires no post-processing).
$columns[] = (new column(
'description',
new lang_string('description', 'core_badges'),
@@ -137,13 +142,20 @@ class badge extends base {
$this->get_entity_name()
))
->add_joins($this->get_joins())
->add_join("LEFT JOIN {context} {$contextalias}
ON {$contextalias}.contextlevel = " . CONTEXT_COURSE . "
AND {$contextalias}.instanceid = {$badgealias}.courseid")
->set_type(column::TYPE_INTEGER)
->add_fields("{$badgealias}.id, {$badgealias}.type, {$badgealias}.courseid, {$badgealias}.imagecaption")
->add_fields(context_helper::get_preload_record_columns_sql($contextalias))
->set_disabled_aggregation_all()
->add_callback(static function(int $badgeid, stdClass $badge): string {
$context = $badge->type == BADGE_TYPE_SITE
? context_system::instance()
: context_course::instance($badge->courseid);
if ($badge->type == BADGE_TYPE_SITE) {
$context = context_system::instance();
} else {
context_helper::preload_from_record($badge);
$context = context_course::instance($badge->courseid);
}
$badgeimage = moodle_url::make_pluginfile_url($context->id, 'badges', 'badgeimage', $badgeid, '/', 'f2');
return html_writer::img($badgeimage, $badge->imagecaption);
+19 -9
View File
@@ -45,7 +45,10 @@ class cohort extends base {
* @return array
*/
protected function get_default_table_aliases(): array {
return ['cohort' => 'c'];
return [
'cohort' => 'c',
'context' => 'chctx',
];
}
/**
@@ -86,6 +89,7 @@ class cohort extends base {
*/
protected function get_all_columns(): array {
$tablealias = $this->get_table_alias('cohort');
$contextalias = $this->get_table_alias('context');
// Category/context column.
$columns[] = (new column(
@@ -94,11 +98,13 @@ class cohort extends base {
$this->get_entity_name()
))
->add_joins($this->get_joins())
->add_join("JOIN {context} {$contextalias} ON {$contextalias}.id = {$tablealias}.contextid")
->set_type(column::TYPE_TEXT)
->add_fields("{$tablealias}.contextid")
->add_fields("{$tablealias}.contextid, " . context_helper::get_preload_record_columns_sql($contextalias))
->set_is_sortable(true)
->add_callback(static function($contextid): string {
return context::instance_by_id((int) $contextid)->get_context_name(false);
->add_callback(static function($contextid, stdClass $cohort): string {
context_helper::preload_from_record($cohort);
return context::instance_by_id($cohort->contextid)->get_context_name(false);
});
// Name column.
@@ -130,8 +136,10 @@ class cohort extends base {
$this->get_entity_name()
))
->add_joins($this->get_joins())
->set_type(column::TYPE_TEXT)
->add_join("JOIN {context} {$contextalias} ON {$contextalias}.id = {$tablealias}.contextid")
->set_type(column::TYPE_LONGTEXT)
->add_fields("{$tablealias}.description, {$tablealias}.descriptionformat, {$tablealias}.id, {$tablealias}.contextid")
->add_fields(context_helper::get_preload_record_columns_sql($contextalias))
->add_callback(static function(?string $description, stdClass $cohort): string {
global $CFG;
require_once("{$CFG->libdir}/filelib.php");
@@ -140,12 +148,14 @@ class cohort extends base {
return '';
}
$description = file_rewrite_pluginfile_urls($description, 'pluginfile.php', $cohort->contextid, 'cohort',
context_helper::preload_from_record($cohort);
$context = context::instance_by_id($cohort->contextid);
$description = file_rewrite_pluginfile_urls($description, 'pluginfile.php', $context->id, 'cohort',
'description', $cohort->id);
return format_text($description, $cohort->descriptionformat, ['context' => $cohort->contextid]);
})
->set_is_sortable(false);
return format_text($description, $cohort->descriptionformat, ['context' => $context->id]);
});
// Visible column.
$columns[] = (new column(
@@ -18,6 +18,8 @@ declare(strict_types=1);
namespace core_course\local\entities;
use context_coursecat;
use context_helper;
use lang_string;
use stdClass;
use core_course_category;
@@ -135,12 +137,12 @@ class course_category extends base {
$this->get_entity_name()
))
->add_joins($this->get_joins())
->add_join("
JOIN {context} {$tablealiascontext}
ON {$tablealiascontext}.instanceid = {$tablealias}.id
AND {$tablealiascontext}.contextlevel = " . CONTEXT_COURSECAT)
->set_type(column::TYPE_TEXT)
->add_fields("{$tablealias}.description, {$tablealias}.descriptionformat, {$tablealiascontext}.id AS contextid")
->add_join("LEFT JOIN {context} {$tablealiascontext}
ON {$tablealiascontext}.contextlevel = " . CONTEXT_COURSECAT . "
AND {$tablealiascontext}.instanceid = {$tablealias}.id")
->set_type(column::TYPE_LONGTEXT)
->add_fields("{$tablealias}.description, {$tablealias}.descriptionformat, {$tablealias}.id")
->add_fields(context_helper::get_preload_record_columns_sql($tablealiascontext))
->add_callback(static function(?string $description, stdClass $category): string {
global $CFG;
require_once("{$CFG->libdir}/filelib.php");
@@ -149,12 +151,14 @@ class course_category extends base {
return '';
}
$description = file_rewrite_pluginfile_urls($description, 'pluginfile.php', $category->contextid, 'coursecat',
context_helper::preload_from_record($category);
$context = context_coursecat::instance($category->id);
$description = file_rewrite_pluginfile_urls($description, 'pluginfile.php', $context->id, 'coursecat',
'description', null);
return format_text($description, $category->descriptionformat, ['context' => $category->contextid]);
})
->set_is_sortable(false);
return format_text($description, $category->descriptionformat, ['context' => $context->id]);
});
return $columns;
}