From 0b7bb123cd92303ea90dfdac6dbd0e1db13846ea Mon Sep 17 00:00:00 2001 From: Markus Frosch Date: Sun, 11 Mar 2018 13:12:48 +0100 Subject: [PATCH] GroupMembershipResolver: Parse filters before iterating through objects Massive performance improvement! Up to 10x! --- .../Objects/GroupMembershipResolver.php | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/library/Director/Objects/GroupMembershipResolver.php b/library/Director/Objects/GroupMembershipResolver.php index d3501714..30f9c7e9 100644 --- a/library/Director/Objects/GroupMembershipResolver.php +++ b/library/Director/Objects/GroupMembershipResolver.php @@ -401,7 +401,7 @@ abstract class GroupMembershipResolver // TODO: fix this last hard host dependency $resolver = HostApplyMatches::prepare($object); foreach ($groups as $groupId => $filter) { - if ($resolver->matchesFilter(Filter::fromQueryString($filter))) { + if ($resolver->matchesFilter($filter)) { if (! array_key_exists($groupId, $mappings)) { $mappings[$groupId] = array(); } @@ -456,7 +456,7 @@ abstract class GroupMembershipResolver $list[$id] = $group->get('assign_filter'); } - return $list; + return $this->parseFilters($list); } protected function fetchAppliedGroups() @@ -470,7 +470,21 @@ abstract class GroupMembershipResolver ) )->where('assign_filter IS NOT NULL'); - return $this->db->fetchPairs($query); + return $this->parseFilters($this->db->fetchPairs($query)); + } + + /** + * Parsing a list of query strings to Filter + * + * @param string[] $list List of query strings + * + * @return Filter[] + */ + protected function parseFilters($list) + { + return array_map(function ($s) { + return Filter::fromQueryString($s); + }, $list); } protected function fetchMissingSingleAssignments()