Optimized artwork association with tracks

This commit is contained in:
emeric
2025-06-29 18:26:44 +02:00
parent d89f50d811
commit e6f0f55b95
10 changed files with 51 additions and 88 deletions
+14
View File
@@ -27,6 +27,7 @@
#include "Utils.hpp"
#include "traits/IdTypeTraits.hpp"
#include "traits/PathTraits.hpp"
namespace lms::db
{
@@ -87,4 +88,17 @@ namespace lms::db
return utils::fetchQuerySingleResult(query);
}
std::filesystem::path Artwork::getAbsoluteFilePath() const
{
auto query{ session()->query<std::filesystem::path>("SELECT COALESCE(image.absolute_file_path, track.absolute_file_path) AS absolute_file_path FROM artwork") };
query.leftJoin("image ON artwork.image_id = image.id");
query.leftJoin("track_embedded_image ON artwork.track_embedded_image_id = track_embedded_image.id");
query.leftJoin("track_embedded_image_link ON track_embedded_image.id = track_embedded_image_link.track_embedded_image_id");
query.leftJoin("track ON track.id = track_embedded_image_link.track_id");
query.limit(1); // there may be several tracks matching this artwork...
query.where("artwork.id = ?").bind(getId());
return utils::fetchQuerySingleResult(query);
}
} // namespace lms::db
+1
View File
@@ -234,6 +234,7 @@ namespace lms::db
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_embedded_image_link_id_idx ON track_embedded_image_link(id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_embedded_image_link_track_id_idx ON track_embedded_image_link(track_id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_embedded_image_link_track_embedded_image_id_track_id_idx ON track_embedded_image_link(track_embedded_image_id, track_id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_embedded_image_link_track_type_track_embedded_image_id_idx ON track_embedded_image_link(track_id, type, track_embedded_image_id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS track_embedded_image_link_type_track_embedded_image_id_track_id_idx ON track_embedded_image_link(type,track_embedded_image_id,track_id)");
utils::executeCommand(_session, "CREATE INDEX IF NOT EXISTS image_directory_stem_idx ON image(directory_id, stem COLLATE NOCASE)");
@@ -19,6 +19,8 @@
#pragma once
#include <filesystem>
#include <Wt/Dbo/Dbo.h>
#include <Wt/WDateTime.h>
@@ -48,6 +50,7 @@ namespace lms::db
TrackEmbeddedImageId getTrackEmbeddedImageId() const { return _trackEmbeddedImage.id(); }
ImageId getImageId() const { return _image.id(); }
Wt::WDateTime getLastWrittenTime() const;
std::filesystem::path getAbsoluteFilePath() const;
template<class Action>
void persist(Action& a)
@@ -40,8 +40,6 @@ namespace lms::db
public:
TrackEmbeddedImageLink() = default;
using HashType = std::uint64_t;
// find
static std::size_t getCount(Session& session);
static pointer find(Session& session, TrackEmbeddedImageLinkId id);
+4
View File
@@ -48,11 +48,13 @@ namespace lms::db::tests
{
auto transaction{ session.createWriteTransaction() };
image.get().modify()->setLastWriteTime(dateTime);
image.get().modify()->setAbsoluteFilePath("/tmp/foo");
}
{
auto transaction{ session.createReadTransaction() };
EXPECT_EQ(artwork.get()->getLastWrittenTime(), dateTime);
EXPECT_EQ(artwork.get()->getAbsoluteFilePath(), "/tmp/foo");
}
}
@@ -73,11 +75,13 @@ namespace lms::db::tests
auto transaction{ session.createWriteTransaction() };
session.create<db::TrackEmbeddedImageLink>(track.get(), image.get());
track.get().modify()->setLastWriteTime(dateTime);
track.get().modify()->setAbsoluteFilePath("/tmp/foo");
}
{
auto transaction{ session.createReadTransaction() };
EXPECT_EQ(artwork.get()->getLastWrittenTime(), dateTime);
EXPECT_EQ(artwork.get()->getAbsoluteFilePath(), "/tmp/foo");
}
}
} // namespace lms::db::tests