File indexing completed on 2024-05-19 04:50:18
0001 /**************************************************************************************** 0002 * Copyright (c) 2008 Nikolaj Hald Nielsen <nhn@kde.org> * 0003 * * 0004 * This program is free software; you can redistribute it and/or modify it under * 0005 * the terms of the GNU General Public License as published by the Free Software * 0006 * Foundation; either version 2 of the License, or (at your option) any later * 0007 * version. * 0008 * * 0009 * This program is distributed in the hope that it will be useful, but WITHOUT ANY * 0010 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * 0011 * PARTICULAR PURPOSE. See the GNU General Public License for more details. * 0012 * * 0013 * You should have received a copy of the GNU General Public License along with * 0014 * this program. If not, see <http://www.gnu.org/licenses/>. * 0015 ****************************************************************************************/ 0016 0017 #include "MagnatuneDatabaseWorker.h" 0018 0019 #include <core-impl/storage/StorageManager.h> 0020 #include <core/storage/SqlStorage.h> 0021 0022 MagnatuneDatabaseWorker::MagnatuneDatabaseWorker() 0023 : QObject() 0024 , ThreadWeaver::Job() 0025 , m_registry( nullptr ) 0026 { 0027 connect( this, &MagnatuneDatabaseWorker::done, this, &MagnatuneDatabaseWorker::completeJob ); 0028 } 0029 0030 0031 MagnatuneDatabaseWorker::~MagnatuneDatabaseWorker() 0032 { 0033 } 0034 0035 0036 void 0037 MagnatuneDatabaseWorker::run(ThreadWeaver::JobPointer self, ThreadWeaver::Thread *thread) 0038 { 0039 Q_UNUSED(self); 0040 Q_UNUSED(thread); 0041 0042 DEBUG_BLOCK 0043 switch ( m_task ) { 0044 case FETCH_MODS: 0045 doFetchMoodMap(); 0046 break; 0047 case FETCH_MOODY_TRACKS: 0048 doFetchTrackswithMood(); 0049 break; 0050 case ALBUM_BY_SKU: 0051 doFetchAlbumBySku(); 0052 break; 0053 default: 0054 break; 0055 } 0056 } 0057 0058 void 0059 MagnatuneDatabaseWorker::defaultBegin(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread) 0060 { 0061 Q_EMIT started(self); 0062 ThreadWeaver::Job::defaultBegin(self, thread); 0063 } 0064 0065 void 0066 MagnatuneDatabaseWorker::defaultEnd(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread) 0067 { 0068 ThreadWeaver::Job::defaultEnd(self, thread); 0069 if (!self->success()) { 0070 Q_EMIT failed(self); 0071 } 0072 Q_EMIT done(self); 0073 } 0074 0075 void MagnatuneDatabaseWorker::completeJob() 0076 { 0077 DEBUG_BLOCK 0078 switch ( m_task ) { 0079 case FETCH_MODS: 0080 Q_EMIT( gotMoodMap( m_moodMap ) ); 0081 break; 0082 case FETCH_MOODY_TRACKS: 0083 Q_EMIT( gotMoodyTracks( m_moodyTracks ) ); 0084 break; 0085 case ALBUM_BY_SKU: 0086 Q_EMIT( gotAlbumBySku( m_album ) ); 0087 break; 0088 default: 0089 break; 0090 } 0091 deleteLater(); 0092 } 0093 0094 0095 void MagnatuneDatabaseWorker::fetchMoodMap() 0096 { 0097 m_task = FETCH_MODS; 0098 m_moodMap.clear(); 0099 } 0100 0101 void MagnatuneDatabaseWorker::fetchTrackswithMood( const QString &mood, int noOfTracks, ServiceSqlRegistry * registry ) 0102 { 0103 m_task = FETCH_MOODY_TRACKS; 0104 m_mood = mood; 0105 m_noOfTracks = noOfTracks; 0106 0107 m_registry = registry; 0108 0109 m_moodyTracks.clear(); 0110 } 0111 0112 void MagnatuneDatabaseWorker::fetchAlbumBySku( const QString & sku, ServiceSqlRegistry * registry ) 0113 { 0114 DEBUG_BLOCK 0115 m_task = ALBUM_BY_SKU; 0116 m_sku = sku; 0117 m_registry = registry; 0118 } 0119 0120 0121 void MagnatuneDatabaseWorker::doFetchMoodMap() 0122 { 0123 auto sqlDb = StorageManager::instance()->sqlStorage(); 0124 QString queryString = "select count( mood ), mood from magnatune_moods GROUP BY mood;"; 0125 debug() << "Querying for moods: " << queryString; 0126 QStringList result = sqlDb->query( queryString ); 0127 debug() << "result: " << result; 0128 0129 while ( !result.isEmpty() ) { 0130 int count = result.takeFirst().toInt(); 0131 QString string = result.takeFirst(); 0132 m_moodMap.insert( string, count ); 0133 } 0134 0135 } 0136 0137 void MagnatuneDatabaseWorker::doFetchTrackswithMood() 0138 { 0139 auto sqlDb = StorageManager::instance()->sqlStorage(); 0140 0141 0142 0143 //ok, a huge join turned out to be _really_ slow, so lets chop up the query a bit... 0144 0145 QString queryString = "SELECT DISTINCT track_id FROM magnatune_moods WHERE mood =\"" + m_mood + "\" ORDER BY RANDOM() LIMIT " + QString::number( m_noOfTracks, 10 ) + ';'; 0146 0147 QStringList result = sqlDb->query( queryString ); 0148 0149 int rowCount = ( m_registry->factory()->getTrackSqlRowCount() + 0150 m_registry->factory()->getAlbumSqlRowCount() + 0151 m_registry->factory()->getArtistSqlRowCount() + 0152 m_registry->factory()->getGenreSqlRowCount() ); 0153 0154 foreach( const QString &idString, result ) { 0155 0156 QString queryString = "SELECT DISTINCT "; 0157 0158 0159 queryString += m_registry->factory()->getTrackSqlRows() + QLatin1Char(',') + 0160 m_registry->factory()->getAlbumSqlRows() + QLatin1Char(',') + 0161 m_registry->factory()->getArtistSqlRows() + QLatin1Char(',') + 0162 m_registry->factory()->getGenreSqlRows(); 0163 0164 queryString += " FROM magnatune_tracks LEFT JOIN magnatune_albums ON magnatune_tracks.album_id = magnatune_albums.id LEFT JOIN magnatune_artists ON magnatune_albums.artist_id = magnatune_artists.id LEFT JOIN magnatune_genre ON magnatune_genre.album_id = magnatune_albums.id"; 0165 0166 queryString += " WHERE magnatune_tracks.id = " + idString; 0167 queryString += " GROUP BY magnatune_tracks.id"; 0168 0169 //debug() << "Querying for moody tracks: " << queryString; 0170 0171 QStringList result = sqlDb->query( queryString ); 0172 //debug() << "result: " << result; 0173 0174 0175 0176 int resultRows = result.count() / rowCount; 0177 0178 for( int i = 0; i < resultRows; i++ ) 0179 { 0180 QStringList row = result.mid( i*rowCount, rowCount ); 0181 0182 Meta::TrackPtr trackptr = m_registry->getTrack( row ); 0183 0184 m_moodyTracks.append( trackptr ); 0185 } 0186 } 0187 0188 } 0189 0190 void MagnatuneDatabaseWorker::doFetchAlbumBySku() 0191 { 0192 DEBUG_BLOCK 0193 0194 ServiceMetaFactory * metaFactory = m_registry->factory(); 0195 0196 QString rows = metaFactory->getAlbumSqlRows() 0197 + ',' 0198 + metaFactory->getArtistSqlRows(); 0199 0200 auto sqlDb = StorageManager::instance()->sqlStorage(); 0201 QString queryString = "SELECT " + rows + " FROM magnatune_albums LEFT JOIN magnatune_artists ON magnatune_albums.artist_id = magnatune_artists.id WHERE album_code = '" + m_sku + "';"; 0202 debug() << "Querying for album: " << queryString; 0203 QStringList result = sqlDb->query( queryString ); 0204 debug() << "result: " << result; 0205 0206 if ( result.count() == metaFactory->getAlbumSqlRowCount() + metaFactory->getArtistSqlRowCount() ) 0207 { 0208 Meta::AlbumPtr albumPtr = m_registry->getAlbum( result ); 0209 //make a magnatune album out of this... 0210 0211 m_album = dynamic_cast<Meta::MagnatuneAlbum *>( albumPtr.data() ); 0212 0213 } 0214 else 0215 { 0216 m_album = nullptr; 0217 } 0218 } 0219 0220