From 4f94e42b5f7da287153bcacae00d2196f156ddbc Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Fri, 19 Aug 2022 13:19:27 +0100 Subject: [PATCH] MDL-73938 reportbuilder: add filters API to support stress testing. Filter types can now define sample values, to be used in forthcoming stress test helpers, in order for them to become active in a report. --- .../classes/local/filters/autocomplete.php | 11 +++++++++++ reportbuilder/classes/local/filters/base.php | 10 ++++++++++ .../classes/local/filters/boolean_select.php | 11 +++++++++++ reportbuilder/classes/local/filters/category.php | 11 +++++++++++ .../classes/local/filters/course_selector.php | 11 +++++++++++ reportbuilder/classes/local/filters/date.php | 12 ++++++++++++ reportbuilder/classes/local/filters/duration.php | 13 +++++++++++++ reportbuilder/classes/local/filters/number.php | 12 ++++++++++++ reportbuilder/classes/local/filters/select.php | 12 ++++++++++++ reportbuilder/classes/local/filters/tags.php | 12 ++++++++++++ reportbuilder/classes/local/filters/text.php | 12 ++++++++++++ reportbuilder/classes/local/filters/user.php | 12 ++++++++++++ reportbuilder/upgrade.txt | 3 ++- 13 files changed, 141 insertions(+), 1 deletion(-) diff --git a/reportbuilder/classes/local/filters/autocomplete.php b/reportbuilder/classes/local/filters/autocomplete.php index dd94c3f8b22..d0d5fe24a88 100644 --- a/reportbuilder/classes/local/filters/autocomplete.php +++ b/reportbuilder/classes/local/filters/autocomplete.php @@ -75,4 +75,15 @@ class autocomplete extends base { return ["{$fieldsql} $insql", array_merge($params, $inparams)]; } + + /** + * Return sample filter values + * + * @return array + */ + public function get_sample_values(): array { + return [ + "{$this->name}_values" => [1], + ]; + } } diff --git a/reportbuilder/classes/local/filters/base.php b/reportbuilder/classes/local/filters/base.php index 9e94c06b0d9..5316a656913 100644 --- a/reportbuilder/classes/local/filters/base.php +++ b/reportbuilder/classes/local/filters/base.php @@ -120,4 +120,14 @@ abstract class base { return $filtersql !== ''; } + + /** + * Return sample filter values, that when applied to a report would activate the filter - that is, cause the filter to return + * SQL snippet. Should be overridden in child classes, to ensure compatibility with stress tests of reports + * + * @return array + */ + public function get_sample_values(): array { + return []; + } } diff --git a/reportbuilder/classes/local/filters/boolean_select.php b/reportbuilder/classes/local/filters/boolean_select.php index 92ae16b8daf..5bc4022f678 100644 --- a/reportbuilder/classes/local/filters/boolean_select.php +++ b/reportbuilder/classes/local/filters/boolean_select.php @@ -101,4 +101,15 @@ class boolean_select extends base { return [$fieldsql, $params]; } + + /** + * Return sample filter values + * + * @return array + */ + public function get_sample_values(): array { + return [ + "{$this->name}_operator" => self::CHECKED, + ]; + } } diff --git a/reportbuilder/classes/local/filters/category.php b/reportbuilder/classes/local/filters/category.php index 223634f7471..1cb4552f024 100644 --- a/reportbuilder/classes/local/filters/category.php +++ b/reportbuilder/classes/local/filters/category.php @@ -90,4 +90,15 @@ class category extends base { return [$sql, $params]; } + + /** + * Return sample filter values + * + * @return array + */ + public function get_sample_values(): array { + return [ + "{$this->name}_value" => 1, + ]; + } } diff --git a/reportbuilder/classes/local/filters/course_selector.php b/reportbuilder/classes/local/filters/course_selector.php index 21060b24a83..6a4747ac6fa 100644 --- a/reportbuilder/classes/local/filters/course_selector.php +++ b/reportbuilder/classes/local/filters/course_selector.php @@ -67,4 +67,15 @@ class course_selector extends base { return ["{$fieldsql} $courseselect", array_merge($params, $courseparams)]; } + + /** + * Return sample filter values + * + * @return array + */ + public function get_sample_values(): array { + return [ + "{$this->name}_values" => [1], + ]; + } } diff --git a/reportbuilder/classes/local/filters/date.php b/reportbuilder/classes/local/filters/date.php index 4d292298a8d..13f87683962 100644 --- a/reportbuilder/classes/local/filters/date.php +++ b/reportbuilder/classes/local/filters/date.php @@ -281,4 +281,16 @@ class date extends base { $dateend->getTimestamp(), ]; } + + /** + * Return sample filter values + * + * @return array + */ + public function get_sample_values(): array { + return [ + "{$this->name}_operator" => self::DATE_CURRENT, + "{$this->name}_unit" => self::DATE_UNIT_WEEK, + ]; + } } diff --git a/reportbuilder/classes/local/filters/duration.php b/reportbuilder/classes/local/filters/duration.php index 66c10b2aa4f..8c3c4951c85 100644 --- a/reportbuilder/classes/local/filters/duration.php +++ b/reportbuilder/classes/local/filters/duration.php @@ -134,4 +134,17 @@ class duration extends base { return [$sql, $params]; } + + /** + * Return sample filter values + * + * @return array + */ + public function get_sample_values(): array { + return [ + "{$this->name}_operator" => self::DURATION_MAXIMUM, + "{$this->name}_value" => 2, + "{$this->name}_unit" => MINSECS, + ]; + } } diff --git a/reportbuilder/classes/local/filters/number.php b/reportbuilder/classes/local/filters/number.php index fa1245eb657..034c2792c8c 100644 --- a/reportbuilder/classes/local/filters/number.php +++ b/reportbuilder/classes/local/filters/number.php @@ -197,4 +197,16 @@ class number extends base { return true; } + + /** + * Return sample filter values + * + * @return array + */ + public function get_sample_values(): array { + return [ + "{$this->name}_operator" => self::GREATER_THAN, + "{$this->name}_value1" => 1, + ]; + } } diff --git a/reportbuilder/classes/local/filters/select.php b/reportbuilder/classes/local/filters/select.php index 5aea41dcf3a..f46aaed3656 100644 --- a/reportbuilder/classes/local/filters/select.php +++ b/reportbuilder/classes/local/filters/select.php @@ -137,4 +137,16 @@ class select extends base { private function validate_filter_values(?int $operator, $value): bool { return !($operator === null || $value === ''); } + + /** + * Return sample filter values + * + * @return array + */ + public function get_sample_values(): array { + return [ + "{$this->name}_operator" => self::EQUAL_TO, + "{$this->name}_value" => 1, + ]; + } } diff --git a/reportbuilder/classes/local/filters/tags.php b/reportbuilder/classes/local/filters/tags.php index e8ff43616bc..b670b431c7a 100644 --- a/reportbuilder/classes/local/filters/tags.php +++ b/reportbuilder/classes/local/filters/tags.php @@ -117,4 +117,16 @@ class tags extends base { return [$select, $params]; } + + /** + * Return sample filter values + * + * @return array + */ + public function get_sample_values(): array { + return [ + "{$this->name}_operator" => self::EQUAL_TO, + "{$this->name}_value" => [1], + ]; + } } diff --git a/reportbuilder/classes/local/filters/text.php b/reportbuilder/classes/local/filters/text.php index d41e7995a36..791a92598dd 100644 --- a/reportbuilder/classes/local/filters/text.php +++ b/reportbuilder/classes/local/filters/text.php @@ -192,4 +192,16 @@ class text extends base { return true; } + + /** + * Return sample filter values + * + * @return array + */ + public function get_sample_values(): array { + return [ + "{$this->name}_operator" => self::IS_EQUAL_TO, + "{$this->name}_value" => 'test', + ]; + } } diff --git a/reportbuilder/classes/local/filters/user.php b/reportbuilder/classes/local/filters/user.php index 033f6bbf6ca..ed311606eb0 100644 --- a/reportbuilder/classes/local/filters/user.php +++ b/reportbuilder/classes/local/filters/user.php @@ -119,4 +119,16 @@ class user extends base { return [$sql, $params]; } + + /** + * Return sample filter values + * + * @return array + */ + public function get_sample_values(): array { + return [ + "{$this->name}_operator" => self::USER_SELECT, + "{$this->name}_value" => [1], + ]; + } } diff --git a/reportbuilder/upgrade.txt b/reportbuilder/upgrade.txt index 7f76b9f0a38..25112966679 100644 --- a/reportbuilder/upgrade.txt +++ b/reportbuilder/upgrade.txt @@ -39,4 +39,5 @@ Information provided here is intended especially for developers. - `category` for reports containing course categories - `tags` for reports containing entities with support for core_tag API - `autocomplete` for reports that contain pre-defined values for selection. -* The helper method `get_custom_report_content()` now accepts a list of filters and applies them to the report +* New method `get_sample_values()` added to base filter class, to be overridden in all filter types to support stress testing +* The test helper method `get_custom_report_content()` now accepts a list of filter values and applies them to the report