From b1b139ffcc1d60cf5aa0a5cf701741bd73d8da37 Mon Sep 17 00:00:00 2001 From: emeric Date: Mon, 23 May 2016 20:06:46 +0200 Subject: [PATCH] [DB] Reworked feature extraction --- src/database/Track.cpp | 45 ++++++++---------------------------- src/database/Track.hpp | 52 ++++++++---------------------------------- 2 files changed, 20 insertions(+), 77 deletions(-) diff --git a/src/database/Track.cpp b/src/database/Track.cpp index a46a570b..a423abbf 100644 --- a/src/database/Track.cpp +++ b/src/database/Track.cpp @@ -17,6 +17,8 @@ * along with LMS. If not, see . */ +#include + #include #include "logger/Logger.hpp" @@ -47,6 +49,7 @@ Track::getAll(Wt::Dbo::Session& session) std::vector Track::getAllIds(Wt::Dbo::Session& session) { + Wt::Dbo::Transaction transaction(session); Wt::Dbo::collection res = session.query("SELECT id from track"); return std::vector(res.begin(), res.end()); } @@ -105,14 +108,6 @@ Track::getClusters(void) const return clusters; } -std::vector< Wt::Dbo::ptr > -Track::getFeatures(void) const -{ - std::vector< Wt::Dbo::ptr > features; - std::copy(_features.begin(), _features.end(), std::back_inserter(features)); - return features; -} - Wt::Dbo::Query< Track::pointer > Track::getQuery(Wt::Dbo::Session& session, SearchFilter filter) { @@ -248,12 +243,12 @@ Cluster::create(Wt::Dbo::Session& session, std::string type, std::string name) } void -Cluster::removeByType(Wt::Dbo::Session& session, std::string type) +Cluster::remove(Wt::Dbo::Session& session, std::string type) { - session.execute( "DELETE FROM cluster WHERE type = ?").bind(type); + Wt::Dbo::Transaction transaction(session); + session.execute("DELETE FROM cluster WHERE type = ?").bind(type); } - Wt::Dbo::Query Cluster::getQuery(Wt::Dbo::Session& session, SearchFilter filter) { @@ -274,7 +269,7 @@ Cluster::getUIQuery(Wt::Dbo::Session& session, SearchFilter filter) SqlQuery sqlQuery = generatePartialQuery(filter); Wt::Dbo::Query query - = session.query( "SELECT c.id, c.type, c.name, COUNT(DISTINCT t.id) FROM cluster c INNER JOIN track_cluster t_c ON t_c.cluster_id = c.id INNER JOIN artist a ON t.artist_id = a.id INNER JOIN release r ON r.id = t.release_id INNER JOIN track t ON t.id = t_c.track_id " + sqlQuery.where().get()).groupBy("c.name").orderBy("c.name"); + = session.query( "SELECT c.id, c.name, COUNT(DISTINCT t.id) FROM cluster c INNER JOIN track_cluster t_c ON t_c.cluster_id = c.id INNER JOIN artist a ON t.artist_id = a.id INNER JOIN release r ON r.id = t.release_id INNER JOIN track t ON t.id = t_c.track_id " + sqlQuery.where().get()).groupBy("c.name").orderBy("c.name"); for (const std::string& bindArg : sqlQuery.where().getBindArgs()) query.bind(bindArg); @@ -289,11 +284,10 @@ Cluster::updateUIQueryModel(Wt::Dbo::Session& session, Wt::Dbo::QueryModel(res.begin(), res.end()); } -Feature::Feature(Wt::Dbo::ptr track, const std::string& type, const std::string& value) -: _type(type), -_value(value), -_track(track) -{ -} - -Feature::pointer -Feature::create(Wt::Dbo::Session& session, Wt::Dbo::ptr track, const std::string& type, const std::string& value) -{ - return session.add(new Feature(track, type, value)); -} - -std::vector -Feature::getByTrack(Wt::Dbo::Session& session, Track::id_type trackId, const std::string& type) -{ - Wt::Dbo::collection res = session.find().where("track_id = ? AND type = ?").bind( trackId).bind(type); - return std::vector(res.begin(), res.end()); -} } // namespace Database diff --git a/src/database/Track.hpp b/src/database/Track.hpp index 004eec11..3d523814 100644 --- a/src/database/Track.hpp +++ b/src/database/Track.hpp @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -38,7 +39,6 @@ class Artist; class Release; class Track; class PlaylistEntry; -class Feature; class Cluster { @@ -59,7 +59,7 @@ class Cluster // MVC models for the user interface // ClusterID, type, name, track count - typedef boost::tuple UIQueryResult; + typedef boost::tuple UIQueryResult; static Wt::Dbo::Query getUIQuery(Wt::Dbo::Session& session, SearchFilter filter); static void updateUIQueryModel(Wt::Dbo::Session& session, Wt::Dbo::QueryModel& model, SearchFilter filter, const std::vector& columnNames = std::vector()); @@ -67,7 +67,7 @@ class Cluster static pointer create(Wt::Dbo::Session& session, std::string type, std::string name); // Remove utility - static void removeByType(Wt::Dbo::Session& session, std::string type); + static void remove(Wt::Dbo::Session& session, std::string type); // nested transaction // Accessors const std::string& getName(void) const { return _name; } @@ -75,7 +75,7 @@ class Cluster bool isNone(void) const; const Wt::Dbo::collection< Wt::Dbo::ptr >& getTracks() const { return _tracks;} - void addTrack(Wt::Dbo::dbo_traits::IdType trackId); + void addTrack(Wt::Dbo::Session& session, Wt::Dbo::dbo_traits::IdType trackId); void addTrack(Wt::Dbo::ptr track) { _tracks.insert(track); } template @@ -121,15 +121,15 @@ class Track static std::vector getByFilter(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1); static std::vector getByFilter(Wt::Dbo::Session& session, SearchFilter filter, int offset, int size, bool &moreResults); static Wt::Dbo::collection< pointer > getAll(Wt::Dbo::Session& session); - static std::vector getAllIds(Wt::Dbo::Session& session); - static std::vector getAllPaths(Wt::Dbo::Session& session); + static std::vector getAllIds(Wt::Dbo::Session& session); // nested transaction + static std::vector getAllPaths(Wt::Dbo::Session& session); // nested transaction static std::vector getMBIDDuplicates(Wt::Dbo::Session& session); static std::vector getChecksumDuplicates(Wt::Dbo::Session& session); // Utility fonctions // MVC models for the user interface // ID, Artist name, Release Name, DiscNumber, TrackNumber, Name, duration, date, original date, genre list - typedef boost::tuple artist) { _artist = artist; } void setRelease(Wt::Dbo::ptr release) { _release = release; } - void addFeature(Wt::Dbo::ptr feature); int getTrackNumber(void) const { return _trackNumber; } int getTotalTrackNumber(void) const { return _totalTrackNumber; } @@ -189,7 +191,6 @@ class Track Wt::Dbo::ptr getArtist(void) const { return _artist; } Wt::Dbo::ptr getRelease(void) const { return _release; } std::vector< Cluster::pointer > getClusters(void) const; - std::vector< Wt::Dbo::ptr > getFeatures(void) const; template void persist(Action& a) @@ -213,7 +214,6 @@ class Track Wt::Dbo::belongsTo(a, _artist, "artist", Wt::Dbo::OnDeleteCascade); Wt::Dbo::hasMany(a, _clusters, Wt::Dbo::ManyToMany, "track_cluster", "", Wt::Dbo::OnDeleteCascade); Wt::Dbo::hasMany(a, _playlistEntries, Wt::Dbo::ManyToOne, "track"); - Wt::Dbo::hasMany(a, _features, Wt::Dbo::ManyToOne, "track"); } private: @@ -242,43 +242,11 @@ class Track Wt::Dbo::ptr _artist; Wt::Dbo::ptr _release; - Wt::Dbo::collection< Wt::Dbo::ptr > _features; Wt::Dbo::collection< Wt::Dbo::ptr > _clusters; Wt::Dbo::collection< Wt::Dbo::ptr > _playlistEntries; }; -/* A track feature */ -class Feature -{ - public: - typedef Wt::Dbo::ptr pointer; - - Feature() {} - Feature(Wt::Dbo::ptr track, const std::string& type, const std::string& value); - - static pointer create(Wt::Dbo::Session& session, Wt::Dbo::ptr track, const std::string& type, const std::string& value); - - static std::vector getByTrack(Wt::Dbo::Session& session, Track::id_type trackId, const std::string& type); - - std::string getType(void) const { return _type; } - std::string getValue(void) const { return _value; } - - template - void persist(Action& a) - { - Wt::Dbo::field(a, _type, "type"); - Wt::Dbo::field(a, _value, "value"); - Wt::Dbo::belongsTo(a, _track, "track", Wt::Dbo::OnDeleteCascade); - } - - private: - std::string _type; - std::string _value; - - Wt::Dbo::ptr _track; -}; - } // namespace database