From 1bd5633202d1a80d3b98ca38e41fba97d262a85b Mon Sep 17 00:00:00 2001 From: emeric Date: Tue, 5 Jun 2018 14:02:45 +0200 Subject: [PATCH] Added missing files --- src/database/TrackStats.cpp | 75 +++++++++++++++++++++++++++++++++++++ src/database/TrackStats.hpp | 68 +++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 src/database/TrackStats.cpp create mode 100644 src/database/TrackStats.hpp diff --git a/src/database/TrackStats.cpp b/src/database/TrackStats.cpp new file mode 100644 index 00000000..c8844503 --- /dev/null +++ b/src/database/TrackStats.cpp @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2014 Emeric Poupon + * + * This file is part of LMS. + * + * LMS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LMS. If not, see . + */ + +#include "TrackStats.hpp" + +#include "Artist.hpp" +#include "Release.hpp" +#include "Track.hpp" +#include "User.hpp" + +namespace Database { + +TrackStats::TrackStats(Wt::Dbo::ptr track, Wt::Dbo::ptr user) +: _track(track), + _user(user) +{} + +std::vector +TrackStats::getMostPlayedArtists(Wt::Dbo::Session& session, User::pointer user, int limit) +{ + Wt::Dbo::collection res = session.query + ("SELECT a FROM artist a INNER JOIN track t ON a.id = t.artist_id INNER JOIN track_stats t_s ON t.id = t_s.track_id") + .where("t_s.user_id = ?").bind(user.id()) + .groupBy("a.id") + .orderBy("SUM(t_s.play_count) DESC") + .limit(limit); + + return std::vector(res.begin(), res.end()); +} + +std::vector +TrackStats::getMostPlayedReleases(Wt::Dbo::Session& session, User::pointer user, int limit) +{ + Wt::Dbo::collection res = session.query + ("SELECT r FROM release r INNER JOIN track t ON r.id = t.release_id INNER JOIN track_stats t_s ON t.id = t_s.track_id") + .where("t_s.user_id = ?").bind(user.id()) + .groupBy("r.id") + .orderBy("SUM(t_s.play_count) DESC") + .limit(limit); + + return std::vector(res.begin(), res.end()); +} + +TrackStats::pointer +TrackStats::get(Wt::Dbo::Session& session, Track::pointer track, User::pointer user) +{ + Wt::Dbo::Transaction transaction(session); + + TrackStats::pointer res = session.find() + .where("track_id = ?").bind(track.id()) + .where("user_id = ?").bind(user.id()); + if (!res) + res = session.add(std::make_unique(track, user)); + + return res; +} + +} // namespace Database + diff --git a/src/database/TrackStats.hpp b/src/database/TrackStats.hpp new file mode 100644 index 00000000..c599abc8 --- /dev/null +++ b/src/database/TrackStats.hpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2014 Emeric Poupon + * + * This file is part of LMS. + * + * LMS is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * LMS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with LMS. If not, see . + */ + +#pragma once + +#include + +#include + +#include "Types.hpp" + +namespace Database { + +class Artist; +class Release; +class Track; +class User; + +class TrackStats +{ + public: + using pointer = Wt::Dbo::ptr; + + TrackStats() {} + TrackStats(Wt::Dbo::ptr track, Wt::Dbo::ptr user); + + static std::vector> getMostPlayedArtists(Wt::Dbo::Session& session, Wt::Dbo::ptr, int limit = 1); + static std::vector> getMostPlayedReleases(Wt::Dbo::Session& session, Wt::Dbo::ptr, int limit = 1); + + // Get utility (will create if does not exist) + static pointer get(Wt::Dbo::Session& session, Wt::Dbo::ptr track, Wt::Dbo::ptr user); + + void incPlayCount() { _playCount++; } + + template + void persist(Action& a) + { + Wt::Dbo::field(a, _playCount, "play_count"); + Wt::Dbo::belongsTo(a, _track, "track", Wt::Dbo::OnDeleteCascade); + Wt::Dbo::belongsTo(a, _user, "user", Wt::Dbo::OnDeleteCascade); + } + + private: + + int _playCount = 0; + Wt::Dbo::ptr _track; + Wt::Dbo::ptr _user; +}; + + +} // namespace Database +