Skip to content

Commit

Permalink
Implement people fetching
Browse files Browse the repository at this point in the history
  • Loading branch information
Kicer86 committed May 18, 2024
1 parent 1d2715c commit ca9d0c4
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 4 deletions.
12 changes: 8 additions & 4 deletions src/database/backends/sql_backends/photo_operator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@
#include <database/general_flags.hpp>

#include "isql_query_executor.hpp"
#include "query_structs.hpp"
#include "sql_filter_query_generator.hpp"
#include "tables.hpp"
#include "query_structs.hpp"
#include "utils.hpp"


namespace Database
Expand Down Expand Up @@ -504,7 +505,7 @@ namespace Database

std::unordered_map<Photo::Id, std::vector<PersonFullInfo>> PhotoOperator::getPeople(const Filter& filter) const
{
const QString query = QString("SELECT %1.photo_id, %1.person_id, %1.fingerprint_id, %1.location, %2.name, %3.fingerprint FROM %1 "
const QString query = QString("SELECT %1.id, %1.photo_id, %1.person_id, %1.fingerprint_id, %1.location, %2.name, %3.fingerprint FROM %1 "
"JOIN %2 ON (%2.id = %1.person_id) "
"JOIN %3 ON (%3.id = %1.fingerprint_id)")
.arg(TAB_PEOPLE)
Expand All @@ -513,8 +514,11 @@ namespace Database

const auto peopleOfMatchingPhotos = getAny<std::vector<PersonFullInfo>>(filter, query, [](const QSqlQuery& sqlQuery)
{
const auto [photo_id, person_id, fingerprint_id, location, name, fingerprint] = readValues<Photo::Id, Person::Id, PersonFingerprint::Id, QString, QString, QByteArray>(sqlQuery);
return std::tuple{photo_id, PersonFullInfo()};
const auto [personInfo_id, photo_id, person_id, fingerprint_id, location, name, fingerprint] = readValues<PersonInfo::Id, Photo::Id, Person::Id, PersonFingerprint::Id, QString, QString, QByteArray>(sqlQuery);
const auto locationRect = decodeFaceLocation(location);
const auto personFingerprint = decodeFingerprint(fingerprint);

return std::tuple{photo_id, PersonFullInfo(PersonName(person_id, name), PersonFingerprint(fingerprint_id, personFingerprint), locationRect, personInfo_id)};
});

return peopleOfMatchingPhotos;
Expand Down
25 changes: 25 additions & 0 deletions src/database/unit_tests_for_backends/photo_operator_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@
#include "unit_tests_utils/sample_db.json.hpp"
#include "unit_tests_utils/sample_db2.json.hpp"
#include "unit_tests_utils/phash_db.json.hpp"
#include "unit_tests_utils/rich_db.json.hpp"
#include "database/ut_printers.hpp"

#include "common.hpp"


using testing::Contains;
using testing::ElementsAre;
using testing::UnorderedElementsAreArray;


MATCHER_P(IsPhotoWithPath, _path, "") {
Expand Down Expand Up @@ -205,3 +209,24 @@ TYPED_TEST(PhotoOperatorTest, fetchDeltasForSomePhotos)

ASSERT_EQ(photos.size(), 7);
}


TYPED_TEST(PhotoOperatorTest, compareCompletness)
{
Database::JsonToBackend converter(*this->m_backend);
converter.append(RichDB::db1);

const auto filter = Database::FilterPhotosWithTag(Tag::Types::Time, QTime(10, 0, 0));
const auto fetchedPhotos = this->m_backend->photoOperator().fetchData(filter);
const auto ids = this->m_backend->photoOperator().getPhotos(filter);

std::vector<Photo::DataDelta> gotPhotos;
for (const auto id: ids)
{
const auto delta = this->m_backend->getPhotoDelta(id);
gotPhotos.push_back(delta);
}

// both methods should return the same set of data (possibily in different order)
EXPECT_THAT(fetchedPhotos, UnorderedElementsAreArray(gotPhotos));
}

0 comments on commit ca9d0c4

Please sign in to comment.