From dc98aaa2246c0b084151f8b62af144ab419fcd0e Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Thu, 30 Jul 2020 12:50:04 +0200 Subject: [PATCH] contactsmanager shall limit number of results early Signed-off-by: Arthur Schiwon --- .../Contacts/ContactsMenu/ContactsStore.php | 24 ++++++++++++++----- lib/private/Contacts/ContactsMenu/Manager.php | 2 +- .../Contacts/ContactsMenu/IContactsStore.php | 6 +++-- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lib/private/Contacts/ContactsMenu/ContactsStore.php b/lib/private/Contacts/ContactsMenu/ContactsStore.php index b0bd99b844..81c4f5d6ba 100644 --- a/lib/private/Contacts/ContactsMenu/ContactsStore.php +++ b/lib/private/Contacts/ContactsMenu/ContactsStore.php @@ -73,11 +73,23 @@ class ContactsStore implements IContactsStore { * @param string|null $filter * @return IEntry[] */ - public function getContacts(IUser $user, $filter) { - $allContacts = $this->contactsManager->search($filter ?: '', [ - 'FN', - 'EMAIL' - ]); + public function getContacts(IUser $user, $filter, ?int $limit = null, ?int $offset = null) { + $options = []; + if ($limit !== null) { + $options['limit'] = $limit; + } + if ($offset !== null) { + $options['offset'] = $offset; + } + + $allContacts = $this->contactsManager->search( + $filter ?: '', + [ + 'FN', + 'EMAIL' + ], + $options + ); $entries = array_map(function (array $contact) { return $this->contactArrayToEntry($contact); @@ -122,7 +134,7 @@ class ContactsStore implements IContactsStore { if ($excludedGroups) { $excludedGroups = $this->config->getAppValue('core', 'shareapi_exclude_groups_list', ''); $decodedExcludeGroups = json_decode($excludedGroups, true); - $excludeGroupsList = ($decodedExcludeGroups !== null) ? $decodedExcludeGroups : []; + $excludeGroupsList = ($decodedExcludeGroups !== null) ? $decodedExcludeGroups : []; if (count(array_intersect($excludeGroupsList, $selfGroups)) !== 0) { // a group of the current user is excluded -> filter all local users diff --git a/lib/private/Contacts/ContactsMenu/Manager.php b/lib/private/Contacts/ContactsMenu/Manager.php index 293f1366b0..c3d4e74e43 100644 --- a/lib/private/Contacts/ContactsMenu/Manager.php +++ b/lib/private/Contacts/ContactsMenu/Manager.php @@ -66,7 +66,7 @@ class Manager { $minSearchStringLength = $this->config->getSystemValueInt('sharing.minSearchStringLength', 0); $topEntries = []; if (strlen($filter) >= $minSearchStringLength) { - $entries = $this->store->getContacts($user, $filter); + $entries = $this->store->getContacts($user, $filter, $maxAutocompleteResults); $sortedEntries = $this->sortEntries($entries); $topEntries = array_slice($sortedEntries, 0, $maxAutocompleteResults); diff --git a/lib/public/Contacts/ContactsMenu/IContactsStore.php b/lib/public/Contacts/ContactsMenu/IContactsStore.php index c64b95fb85..fceb507f0c 100644 --- a/lib/public/Contacts/ContactsMenu/IContactsStore.php +++ b/lib/public/Contacts/ContactsMenu/IContactsStore.php @@ -33,11 +33,13 @@ interface IContactsStore { /** * @param IUser $user - * @param $filter + * @param string $filter + * @param int $limit added 19.0.2 + * @param int $offset added 19.0.2 * @return IEntry[] * @since 13.0.0 */ - public function getContacts(IUser $user, $filter); + public function getContacts(IUser $user, $filter, ?int $limit = null, ?int $offset = null); /** * @brief finds a contact by specifying the property to search on ($shareType) and the value ($shareWith)