. declare(strict_types=1); namespace core_reportbuilder\local\helpers; use core_collator; use core_component; use core_reportbuilder\local\aggregation\base; /** * Helper class for column aggregation related methods * * @package core_reportbuilder * @copyright 2021 Paul Holden * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class aggregation { /** * Helper method to convert aggregation class name into fully qualified namespaced class * * @param string $aggregation * @return string */ public static function get_full_classpath(string $aggregation): string { return "\\core_reportbuilder\\local\\aggregation\\{$aggregation}"; } /** * Validate whether given class is a valid aggregation type * * @param string $aggregationclass Fully qualified namespaced class, see {@see get_full_classpath} for converting value * stored in column persistent to full path * @return bool */ public static function valid(string $aggregationclass): bool { return class_exists($aggregationclass) && is_subclass_of($aggregationclass, base::class); } /** * Get available aggregation types for given column type * * @param int $columntype * @param array $exclude List of types to exclude, if omitted then include all available types * @return string[] Aggregation types indexed by [shortname => name] */ public static function get_column_aggregations(int $columntype, array $exclude = []): array { $types = []; $classes = core_component::get_component_classes_in_namespace('core_reportbuilder', 'local\\aggregation'); foreach ($classes as $class => $path) { /** @var base $aggregationclass */ $aggregationclass = $class; if (static::valid($aggregationclass) && $aggregationclass::compatible($columntype) && !in_array($aggregationclass::get_class_name(), $exclude)) { $types[$aggregationclass::get_class_name()] = (string) $aggregationclass::get_name(); } } core_collator::asort($types, core_collator::SORT_STRING); return $types; } }