Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.
   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  declare(strict_types=1);
  18  
  19  namespace core_reportbuilder\local\helpers;
  20  
  21  use core_collator;
  22  use core_component;
  23  use core_reportbuilder\local\aggregation\base;
  24  
  25  /**
  26   * Helper class for column aggregation related methods
  27   *
  28   * @package     core_reportbuilder
  29   * @copyright   2021 Paul Holden <paulh@moodle.com>
  30   * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  31   */
  32  class aggregation {
  33  
  34      /**
  35       * Helper method to convert aggregation class name into fully qualified namespaced class
  36       *
  37       * @param string $aggregation
  38       * @return string
  39       */
  40      public static function get_full_classpath(string $aggregation): string {
  41          return "\\core_reportbuilder\\local\\aggregation\\{$aggregation}";
  42      }
  43  
  44      /**
  45       * Validate whether given class is a valid aggregation type
  46       *
  47       * @param string $aggregationclass Fully qualified namespaced class, see {@see get_full_classpath} for converting value
  48       *      stored in column persistent to full path
  49       * @return bool
  50       */
  51      public static function valid(string $aggregationclass): bool {
  52          return class_exists($aggregationclass) && is_subclass_of($aggregationclass, base::class);
  53      }
  54  
  55      /**
  56       * Return list of all available/valid aggregation types
  57       *
  58       * @return base[]
  59       */
  60      public static function get_aggregations(): array {
  61          $classes = core_component::get_component_classes_in_namespace('core_reportbuilder', 'local\\aggregation');
  62  
  63          return array_filter(array_keys($classes), static function(string $class): bool {
  64              return static::valid($class);
  65          });
  66      }
  67  
  68      /**
  69       * Get available aggregation types for given column type
  70       *
  71       * @param int $columntype
  72       * @param array $exclude List of types to exclude, e.g. ['min', 'sum']
  73       * @return string[] Aggregation types indexed by [shortname => name]
  74       */
  75      public static function get_column_aggregations(int $columntype, array $exclude = []): array {
  76          $types = [];
  77  
  78          $classes = static::get_aggregations();
  79          foreach ($classes as $class) {
  80              if ($class::compatible($columntype) && !in_array($class::get_class_name(), $exclude)) {
  81                  $types[$class::get_class_name()] = (string) $class::get_name();
  82              }
  83          }
  84  
  85          core_collator::asort($types, core_collator::SORT_STRING);
  86  
  87          return $types;
  88      }
  89  }