diff --git a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h --- a/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h +++ b/native/cpp/CommonCpp/DatabaseManagers/DatabaseQueryExecutor.h @@ -181,6 +181,8 @@ std::string threadID, std::optional timestampCursor, std::optional messageIDCursor) const = 0; + virtual std::vector getRelatedMessagesForSearch( + const std::vector &messageIDs) const = 0; #ifdef EMSCRIPTEN virtual std::vector getAllThreadsWeb() const = 0; diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h --- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h +++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.h @@ -11,6 +11,7 @@ #include "entities/LocalMessageInfo.h" #include "entities/Media.h" #include "entities/Message.h" +#include "entities/MessageSearchResult.h" #include "entities/SQLiteStatementWrapper.h" #include "entities/ThreadActivityEntry.h" #include "entities/UserInfo.h" @@ -194,6 +195,8 @@ std::string threadID, std::optional timestampCursor, std::optional messageIDCursor) const override; + std::vector getRelatedMessagesForSearch( + const std::vector &messageIDs) const override; #ifdef EMSCRIPTEN std::vector getAllThreadsWeb() const override; diff --git a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp --- a/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp +++ b/native/cpp/CommonCpp/DatabaseManagers/SQLiteQueryExecutor.cpp @@ -2594,6 +2594,50 @@ bindStringToSQL(messageIDCursor.value(), preparedSQL, 7); } + std::vector messages = + this->processMessagesResults(preparedSQL); + std::vector messageIDs; + for (const auto &message : messages) { + messageIDs.push_back(message.first.id); + } + std::vector relatedMessages = + this->getRelatedMessagesForSearch(messageIDs); + + for (auto &entity : relatedMessages) { + messages.push_back(std::move(entity)); + } + return messages; +} + +std::vector SQLiteQueryExecutor::getRelatedMessagesForSearch( + const std::vector &messageIDs) const { + std::stringstream selectRelatedMessagesSQLStream; + selectRelatedMessagesSQLStream << "SELECT * " + "FROM messages " + "LEFT JOIN media " + " ON messages.id = media.container " + "WHERE messages.target_message IN " + << getSQLStatementArray(messageIDs.size()) + << "ORDER BY messages.time DESC"; + + std::string selectRelatedMessagesSQL = selectRelatedMessagesSQLStream.str(); + + SQLiteStatementWrapper preparedSQL( + SQLiteQueryExecutor::getConnection(), + selectRelatedMessagesSQL, + "Failed to fetch related messages."); + + for (int i = 0; i < messageIDs.size(); i++) { + int bindResult = bindStringToSQL(messageIDs[i], preparedSQL, i + 1); + if (bindResult != SQLITE_OK) { + std::stringstream error_message; + error_message << "Failed to bind key to SQL statement. Details: " + << sqlite3_errstr(bindResult) << std::endl; + sqlite3_finalize(preparedSQL); + throw std::runtime_error(error_message.str()); + } + } + return this->processMessagesResults(preparedSQL); } diff --git a/web/shared-worker/_generated/comm_query_executor.wasm b/web/shared-worker/_generated/comm_query_executor.wasm index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@