[DB] Reworked feature extraction
This commit is contained in:
+10
-35
@@ -17,6 +17,8 @@
|
|||||||
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
|
* along with LMS. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <boost/property_tree/json_parser.hpp>
|
||||||
|
|
||||||
#include <Wt/Dbo/QueryModel>
|
#include <Wt/Dbo/QueryModel>
|
||||||
|
|
||||||
#include "logger/Logger.hpp"
|
#include "logger/Logger.hpp"
|
||||||
@@ -47,6 +49,7 @@ Track::getAll(Wt::Dbo::Session& session)
|
|||||||
std::vector<Track::id_type>
|
std::vector<Track::id_type>
|
||||||
Track::getAllIds(Wt::Dbo::Session& session)
|
Track::getAllIds(Wt::Dbo::Session& session)
|
||||||
{
|
{
|
||||||
|
Wt::Dbo::Transaction transaction(session);
|
||||||
Wt::Dbo::collection<Track::id_type> res = session.query<Track::id_type>("SELECT id from track");
|
Wt::Dbo::collection<Track::id_type> res = session.query<Track::id_type>("SELECT id from track");
|
||||||
return std::vector<Track::id_type>(res.begin(), res.end());
|
return std::vector<Track::id_type>(res.begin(), res.end());
|
||||||
}
|
}
|
||||||
@@ -105,14 +108,6 @@ Track::getClusters(void) const
|
|||||||
return clusters;
|
return clusters;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector< Wt::Dbo::ptr<Feature> >
|
|
||||||
Track::getFeatures(void) const
|
|
||||||
{
|
|
||||||
std::vector< Wt::Dbo::ptr<Feature> > features;
|
|
||||||
std::copy(_features.begin(), _features.end(), std::back_inserter(features));
|
|
||||||
return features;
|
|
||||||
}
|
|
||||||
|
|
||||||
Wt::Dbo::Query< Track::pointer >
|
Wt::Dbo::Query< Track::pointer >
|
||||||
Track::getQuery(Wt::Dbo::Session& session, SearchFilter filter)
|
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
|
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::pointer>
|
Wt::Dbo::Query<Cluster::pointer>
|
||||||
Cluster::getQuery(Wt::Dbo::Session& session, SearchFilter filter)
|
Cluster::getQuery(Wt::Dbo::Session& session, SearchFilter filter)
|
||||||
{
|
{
|
||||||
@@ -274,7 +269,7 @@ Cluster::getUIQuery(Wt::Dbo::Session& session, SearchFilter filter)
|
|||||||
SqlQuery sqlQuery = generatePartialQuery(filter);
|
SqlQuery sqlQuery = generatePartialQuery(filter);
|
||||||
|
|
||||||
Wt::Dbo::Query<UIQueryResult> query
|
Wt::Dbo::Query<UIQueryResult> query
|
||||||
= session.query<UIQueryResult>( "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<UIQueryResult>( "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())
|
for (const std::string& bindArg : sqlQuery.where().getBindArgs())
|
||||||
query.bind(bindArg);
|
query.bind(bindArg);
|
||||||
@@ -289,11 +284,10 @@ Cluster::updateUIQueryModel(Wt::Dbo::Session& session, Wt::Dbo::QueryModel<UIQu
|
|||||||
model.setQuery(query, columnNames.empty() ? true : false);
|
model.setQuery(query, columnNames.empty() ? true : false);
|
||||||
|
|
||||||
// TODO do something better
|
// TODO do something better
|
||||||
if (columnNames.size() == 3)
|
if (columnNames.size() == 2)
|
||||||
{
|
{
|
||||||
model.addColumn( "c.type", columnNames[0] );
|
model.addColumn( "c.name", columnNames[0] );
|
||||||
model.addColumn( "c.name", columnNames[1] );
|
model.addColumn( "COUNT(DISTINCT t.id)", columnNames[1] );
|
||||||
model.addColumn( "COUNT(DISTINCT t.id)", columnNames[2] );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,25 +299,6 @@ Cluster::getByFilter(Wt::Dbo::Session& session, SearchFilter filter, int offset,
|
|||||||
return std::vector<pointer>(res.begin(), res.end());
|
return std::vector<pointer>(res.begin(), res.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
Feature::Feature(Wt::Dbo::ptr<Track> 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> track, const std::string& type, const std::string& value)
|
|
||||||
{
|
|
||||||
return session.add(new Feature(track, type, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<Feature::pointer>
|
|
||||||
Feature::getByTrack(Wt::Dbo::Session& session, Track::id_type trackId, const std::string& type)
|
|
||||||
{
|
|
||||||
Wt::Dbo::collection<pointer> res = session.find<Feature>().where("track_id = ? AND type = ?").bind( trackId).bind(type);
|
|
||||||
return std::vector<pointer>(res.begin(), res.end());
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Database
|
} // namespace Database
|
||||||
|
|
||||||
|
|||||||
+10
-42
@@ -23,6 +23,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
|
#include <boost/property_tree/ptree.hpp>
|
||||||
|
|
||||||
#include <Wt/Dbo/Dbo>
|
#include <Wt/Dbo/Dbo>
|
||||||
#include <Wt/Dbo/WtSqlTraits>
|
#include <Wt/Dbo/WtSqlTraits>
|
||||||
@@ -38,7 +39,6 @@ class Artist;
|
|||||||
class Release;
|
class Release;
|
||||||
class Track;
|
class Track;
|
||||||
class PlaylistEntry;
|
class PlaylistEntry;
|
||||||
class Feature;
|
|
||||||
|
|
||||||
class Cluster
|
class Cluster
|
||||||
{
|
{
|
||||||
@@ -59,7 +59,7 @@ class Cluster
|
|||||||
|
|
||||||
// MVC models for the user interface
|
// MVC models for the user interface
|
||||||
// ClusterID, type, name, track count
|
// ClusterID, type, name, track count
|
||||||
typedef boost::tuple<id_type, std::string, std::string, int> UIQueryResult;
|
typedef boost::tuple<id_type, std::string, int> UIQueryResult;
|
||||||
static Wt::Dbo::Query<UIQueryResult> getUIQuery(Wt::Dbo::Session& session, SearchFilter filter);
|
static Wt::Dbo::Query<UIQueryResult> getUIQuery(Wt::Dbo::Session& session, SearchFilter filter);
|
||||||
static void updateUIQueryModel(Wt::Dbo::Session& session, Wt::Dbo::QueryModel<UIQueryResult>& model, SearchFilter filter, const std::vector<Wt::WString>& columnNames = std::vector<Wt::WString>());
|
static void updateUIQueryModel(Wt::Dbo::Session& session, Wt::Dbo::QueryModel<UIQueryResult>& model, SearchFilter filter, const std::vector<Wt::WString>& columnNames = std::vector<Wt::WString>());
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ class Cluster
|
|||||||
static pointer create(Wt::Dbo::Session& session, std::string type, std::string name);
|
static pointer create(Wt::Dbo::Session& session, std::string type, std::string name);
|
||||||
|
|
||||||
// Remove utility
|
// 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
|
// Accessors
|
||||||
const std::string& getName(void) const { return _name; }
|
const std::string& getName(void) const { return _name; }
|
||||||
@@ -75,7 +75,7 @@ class Cluster
|
|||||||
bool isNone(void) const;
|
bool isNone(void) const;
|
||||||
const Wt::Dbo::collection< Wt::Dbo::ptr<Track> >& getTracks() const { return _tracks;}
|
const Wt::Dbo::collection< Wt::Dbo::ptr<Track> >& getTracks() const { return _tracks;}
|
||||||
|
|
||||||
void addTrack(Wt::Dbo::dbo_traits<Track>::IdType trackId);
|
void addTrack(Wt::Dbo::Session& session, Wt::Dbo::dbo_traits<Track>::IdType trackId);
|
||||||
void addTrack(Wt::Dbo::ptr<Track> track) { _tracks.insert(track); }
|
void addTrack(Wt::Dbo::ptr<Track> track) { _tracks.insert(track); }
|
||||||
|
|
||||||
template<class Action>
|
template<class Action>
|
||||||
@@ -121,15 +121,15 @@ class Track
|
|||||||
static std::vector<pointer> getByFilter(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1);
|
static std::vector<pointer> getByFilter(Wt::Dbo::Session& session, SearchFilter filter, int offset = -1, int size = -1);
|
||||||
static std::vector<pointer> getByFilter(Wt::Dbo::Session& session, SearchFilter filter, int offset, int size, bool &moreResults);
|
static std::vector<pointer> getByFilter(Wt::Dbo::Session& session, SearchFilter filter, int offset, int size, bool &moreResults);
|
||||||
static Wt::Dbo::collection< pointer > getAll(Wt::Dbo::Session& session);
|
static Wt::Dbo::collection< pointer > getAll(Wt::Dbo::Session& session);
|
||||||
static std::vector<id_type> getAllIds(Wt::Dbo::Session& session);
|
static std::vector<id_type> getAllIds(Wt::Dbo::Session& session); // nested transaction
|
||||||
static std::vector<boost::filesystem::path> getAllPaths(Wt::Dbo::Session& session);
|
static std::vector<boost::filesystem::path> getAllPaths(Wt::Dbo::Session& session); // nested transaction
|
||||||
static std::vector<pointer> getMBIDDuplicates(Wt::Dbo::Session& session);
|
static std::vector<pointer> getMBIDDuplicates(Wt::Dbo::Session& session);
|
||||||
static std::vector<pointer> getChecksumDuplicates(Wt::Dbo::Session& session);
|
static std::vector<pointer> getChecksumDuplicates(Wt::Dbo::Session& session);
|
||||||
|
|
||||||
// Utility fonctions
|
// Utility fonctions
|
||||||
// MVC models for the user interface
|
// MVC models for the user interface
|
||||||
// ID, Artist name, Release Name, DiscNumber, TrackNumber, Name, duration, date, original date, genre list
|
// ID, Artist name, Release Name, DiscNumber, TrackNumber, Name, duration, date, original date, genre list
|
||||||
typedef boost::tuple<id_type, //ID
|
typedef boost::tuple<id_type, // ID
|
||||||
std::string, // Artist name
|
std::string, // Artist name
|
||||||
std::string, // Release Name
|
std::string, // Release Name
|
||||||
int, // Disc Number
|
int, // Disc Number
|
||||||
@@ -153,6 +153,9 @@ class Track
|
|||||||
// Create utility
|
// Create utility
|
||||||
static pointer create(Wt::Dbo::Session& session, const boost::filesystem::path& p);
|
static pointer create(Wt::Dbo::Session& session, const boost::filesystem::path& p);
|
||||||
|
|
||||||
|
// Remove utility
|
||||||
|
static void removeClusters(std::string type);
|
||||||
|
|
||||||
// Accessors
|
// Accessors
|
||||||
void setTrackNumber(int num) { _trackNumber = num; }
|
void setTrackNumber(int num) { _trackNumber = num; }
|
||||||
void setTotalTrackNumber(int num) { _totalTrackNumber = num; }
|
void setTotalTrackNumber(int num) { _totalTrackNumber = num; }
|
||||||
@@ -170,7 +173,6 @@ class Track
|
|||||||
void setMBID(const std::string& MBID) { _MBID = MBID; }
|
void setMBID(const std::string& MBID) { _MBID = MBID; }
|
||||||
void setArtist(Wt::Dbo::ptr<Artist> artist) { _artist = artist; }
|
void setArtist(Wt::Dbo::ptr<Artist> artist) { _artist = artist; }
|
||||||
void setRelease(Wt::Dbo::ptr<Release> release) { _release = release; }
|
void setRelease(Wt::Dbo::ptr<Release> release) { _release = release; }
|
||||||
void addFeature(Wt::Dbo::ptr<Feature> feature);
|
|
||||||
|
|
||||||
int getTrackNumber(void) const { return _trackNumber; }
|
int getTrackNumber(void) const { return _trackNumber; }
|
||||||
int getTotalTrackNumber(void) const { return _totalTrackNumber; }
|
int getTotalTrackNumber(void) const { return _totalTrackNumber; }
|
||||||
@@ -189,7 +191,6 @@ class Track
|
|||||||
Wt::Dbo::ptr<Artist> getArtist(void) const { return _artist; }
|
Wt::Dbo::ptr<Artist> getArtist(void) const { return _artist; }
|
||||||
Wt::Dbo::ptr<Release> getRelease(void) const { return _release; }
|
Wt::Dbo::ptr<Release> getRelease(void) const { return _release; }
|
||||||
std::vector< Cluster::pointer > getClusters(void) const;
|
std::vector< Cluster::pointer > getClusters(void) const;
|
||||||
std::vector< Wt::Dbo::ptr<Feature> > getFeatures(void) const;
|
|
||||||
|
|
||||||
template<class Action>
|
template<class Action>
|
||||||
void persist(Action& a)
|
void persist(Action& a)
|
||||||
@@ -213,7 +214,6 @@ class Track
|
|||||||
Wt::Dbo::belongsTo(a, _artist, "artist", Wt::Dbo::OnDeleteCascade);
|
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, _clusters, Wt::Dbo::ManyToMany, "track_cluster", "", Wt::Dbo::OnDeleteCascade);
|
||||||
Wt::Dbo::hasMany(a, _playlistEntries, Wt::Dbo::ManyToOne, "track");
|
Wt::Dbo::hasMany(a, _playlistEntries, Wt::Dbo::ManyToOne, "track");
|
||||||
Wt::Dbo::hasMany(a, _features, Wt::Dbo::ManyToOne, "track");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -242,43 +242,11 @@ class Track
|
|||||||
|
|
||||||
Wt::Dbo::ptr<Artist> _artist;
|
Wt::Dbo::ptr<Artist> _artist;
|
||||||
Wt::Dbo::ptr<Release> _release;
|
Wt::Dbo::ptr<Release> _release;
|
||||||
Wt::Dbo::collection< Wt::Dbo::ptr<Feature> > _features;
|
|
||||||
Wt::Dbo::collection< Wt::Dbo::ptr<Cluster> > _clusters;
|
Wt::Dbo::collection< Wt::Dbo::ptr<Cluster> > _clusters;
|
||||||
Wt::Dbo::collection< Wt::Dbo::ptr<PlaylistEntry> > _playlistEntries;
|
Wt::Dbo::collection< Wt::Dbo::ptr<PlaylistEntry> > _playlistEntries;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* A track feature */
|
|
||||||
class Feature
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef Wt::Dbo::ptr<Feature> pointer;
|
|
||||||
|
|
||||||
Feature() {}
|
|
||||||
Feature(Wt::Dbo::ptr<Track> track, const std::string& type, const std::string& value);
|
|
||||||
|
|
||||||
static pointer create(Wt::Dbo::Session& session, Wt::Dbo::ptr<Track> track, const std::string& type, const std::string& value);
|
|
||||||
|
|
||||||
static std::vector<pointer> 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<class Action>
|
|
||||||
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> _track;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace database
|
} // namespace database
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user