From 468568cbc8a236098a08509f798d3c6d2a8835e2 Mon Sep 17 00:00:00 2001 From: Lukasz Bardeli Date: Fri, 15 Mar 2019 07:50:06 +0000 Subject: [PATCH] Revert "[messaging] Refactor commonly used functions" This reverts commit b3b63e72ae9d1b4d909e5c213830427e8ecc6ed6. Reason for revert: Change-Id: Ief8acc66b387fc8783978e8ce8b2f0474a8511fa --- src/messaging/messaging_database_manager.cc | 113 ++++++++------------ 1 file changed, 47 insertions(+), 66 deletions(-) diff --git a/src/messaging/messaging_database_manager.cc b/src/messaging/messaging_database_manager.cc index 25a6bba1..dbdf03e4 100644 --- a/src/messaging/messaging_database_manager.cc +++ b/src/messaging/messaging_database_manager.cc @@ -721,68 +721,6 @@ PlatformResult MessagingDatabaseManager::addFilters(AbstractFilterPtr filter, So return PlatformResult(ErrorCode::NO_ERROR); } -namespace { - -template -using SharedPtrVector = std::vector>; - -template -void filterVector(const AbstractFilter& filter, SharedPtrVector* vec) { - ScopeLogger(); - - auto toBeFilteredOut = [&filter](const std::shared_ptr& object_ptr) { - return !filter.isMatching(object_ptr.get()); - }; - - vec->erase(std::remove_if(vec->begin(), vec->end(), toBeFilteredOut), vec->end()); -} - -template -void sortVector(const SortMode& sortMode, SharedPtrVector* vec) { - ScopeLogger(); - - const std::string attribute = sortMode.getAttributeName(); - auto comparator = T::getComparator(attribute); - - if (SortModeOrder::ASC == sortMode.getOrder()) { - std::sort(vec->begin(), vec->end(), comparator); - } else { - std::sort(vec->rbegin(), vec->rend(), comparator); - } -} - -std::string makeSQLLimitAndOffsetClause(long limit, long offset) { - ScopeLogger(); - - std::string limitAndOffsetClause; - limitAndOffsetClause.reserve(64); - - if (limit) { - limitAndOffsetClause += "LIMIT " + std::to_string(limit) + " "; - } - - if (offset) { - if (!limit) { - // Ugly fix proposed by mySQL team: - // http://dev.mysql.com/doc/refman/5.0/en/select.html - // To retrieve all rows from a certain offset up to the end of the result set, - // you can use some large number for the second parameter. - // - // Reason: to use OFFSET you need to have LIMIT statement - // 18446744073709551615 is 2^64-1 - max value of big int - // However we will use -1 since it will work fine for various int sizes (this - // trick have been used in old implementation). - - limitAndOffsetClause += "LIMIT -1 "; - } - limitAndOffsetClause += "OFFSET " + std::to_string(offset) + " "; - } - - return limitAndOffsetClause; -} - -} // namespace - PlatformResult MessagingDatabaseManager::findShortMessages(FindMsgCallbackUserData* callback, std::vector* result) { ScopeLogger(); @@ -945,6 +883,32 @@ void convertToMessageConversations(const email_mail_data_t* mailData, int mailDa } } +void filterMessageConversations(const AbstractFilter& filter, + ConversationPtrVector* conversations) { + ScopeLogger(); + + auto toBeFilteredOut = [&filter](const ConversationPtr& conversation) { + return !filter.isMatching(conversation.get()); + }; + + conversations->erase( + std::remove_if(std::begin(*conversations), std::end(*conversations), toBeFilteredOut), + std::end(*conversations)); +} + +void sortConversations(const SortMode& sortMode, ConversationPtrVector* conversations) { + ScopeLogger(); + + const std::string attribute = sortMode.getAttributeName(); + auto comparator = MessageConversation::getComparator(attribute); + + if (SortModeOrder::ASC == sortMode.getOrder()) { + std::sort(std::begin(*conversations), std::end(*conversations), comparator); + } else { + std::sort(std::rbegin(*conversations), std::rend(*conversations), comparator); + } +} + } // namespace PlatformResult MessagingDatabaseManager::retrieveEmailThreadsFromDatabase( @@ -952,8 +916,25 @@ PlatformResult MessagingDatabaseManager::retrieveEmailThreadsFromDatabase( ConversationPtrVector* conversations) { ScopeLogger(); - std::string limitAndOffset = makeSQLLimitAndOffsetClause(findEmailConversationsData.getLimit(), - findEmailConversationsData.getOffset()); + std::string limitAndOffset; + PlatformResult result = PlatformResult{ErrorCode::UNKNOWN_ERR}; + AttributeInfoMap emptyAttributeMap; + /* + * Sorting and filtering is done programmatically, after data retrieval from the database, + * because some parameters cannot be used in ORDER BY/WHERE or both clauses, + * passed to the email_query_mails() - e.g. there is no "unreadMessages" column in the. + * + * For that reason both filter and sort mode arguments of addFilters are null pointers. + */ + result = addFilters(AbstractFilterPtr{nullptr}, SortModePtr{nullptr}, + findEmailConversationsData.getLimit(), findEmailConversationsData.getOffset(), + emptyAttributeMap, findEmailConversationsData.getMessageServiceType(), + &limitAndOffset); + + if (result.IsError()) { + LoggerE("addFilters failed (%s)", result.message().c_str()); + return result; + } // clang-format off const std::string isLastMessageInThread = @@ -1006,10 +987,10 @@ PlatformResult MessagingDatabaseManager::findEmailConversations( return result; } - filterVector(*findEmailConversationsData.getFilter(), conversations); + filterMessageConversations(*findEmailConversationsData.getFilter(), conversations); if (findEmailConversationsData.getSortMode()) { - sortVector(*findEmailConversationsData.getSortMode(), conversations); + sortConversations(*findEmailConversationsData.getSortMode(), conversations); } return PlatformResult(ErrorCode::NO_ERROR); -- 2.34.1