Optimized artwork association with tracks
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user