Revert "[messaging] Refactor commonly used functions" 24/201524/2
authorLukasz Bardeli <l.bardeli@samsung.com>
Fri, 15 Mar 2019 07:50:06 +0000 (07:50 +0000)
committerLukasz Bardeli <l.bardeli@samsung.com>
Fri, 15 Mar 2019 08:29:30 +0000 (08:29 +0000)
This reverts commit b3b63e72ae9d1b4d909e5c213830427e8ecc6ed6.

Reason for revert: <INSERT REASONING HERE>

Change-Id: Ief8acc66b387fc8783978e8ce8b2f0474a8511fa

src/messaging/messaging_database_manager.cc

index 25a6bba..dbdf03e 100644 (file)
@@ -721,68 +721,6 @@ PlatformResult MessagingDatabaseManager::addFilters(AbstractFilterPtr filter, So
   return PlatformResult(ErrorCode::NO_ERROR);
 }
 
-namespace {
-
-template <typename T>
-using SharedPtrVector = std::vector<std::shared_ptr<T>>;
-
-template <typename T>
-void filterVector(const AbstractFilter& filter, SharedPtrVector<T>* vec) {
-  ScopeLogger();
-
-  auto toBeFilteredOut = [&filter](const std::shared_ptr<T>& object_ptr) {
-    return !filter.isMatching(object_ptr.get());
-  };
-
-  vec->erase(std::remove_if(vec->begin(), vec->end(), toBeFilteredOut), vec->end());
-}
-
-template <typename T>
-void sortVector(const SortMode& sortMode, SharedPtrVector<T>* 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<int>* 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);