void DatabaseCommand_Resolve::resolve( DatabaseImpl* lib ) { QList<Tomahawk::result_ptr> res; typedef QPair<int, float> scorepair_t; // STEP 1 QList< QPair<int, float> > tracks = lib->search( m_query ); if ( tracks.length() == 0 ) { qDebug() << "No candidates found in first pass, aborting resolve" << m_query->artist() << m_query->track(); emit results( m_query->id(), res ); return; } // STEP 2 TomahawkSqlQuery files_query = lib->newquery(); QStringList trksl; for ( int k = 0; k < tracks.count(); k++ ) trksl.append( QString::number( tracks.at( k ).first ) ); QString trksToken = QString( "file_join.track IN (%1)" ).arg( trksl.join( "," ) ); QString sql = QString( "SELECT " "url, mtime, size, md5, mimetype, duration, bitrate, " //0 "file_join.artist, file_join.album, file_join.track, " //7 "file_join.composer, file_join.discnumber, " //10 "artist.name as artname, " //12 "album.name as albname, " //13 "track.name as trkname, " //14 "composer.name as cmpname, " //15 "file.source, " //16 "file_join.albumpos, " //17 "artist.id as artid, " //18 "album.id as albid, " //19 "composer.id as cmpid " //20 "FROM file, file_join, artist, track " "LEFT JOIN album ON album.id = file_join.album " "LEFT JOIN artist AS composer ON composer.id = file_join.composer " "WHERE " "artist.id = file_join.artist AND " "track.id = file_join.track AND " "file.id = file_join.file AND " "(%1)" ) .arg( trksToken ); files_query.prepare( sql ); files_query.exec(); while ( files_query.next() ) { source_ptr s; QString url = files_query.value( 0 ).toString(); if ( files_query.value( 16 ).toUInt() == 0 ) { s = SourceList::instance()->getLocal(); } else { s = SourceList::instance()->get( files_query.value( 16 ).toUInt() ); if ( s.isNull() ) { qDebug() << "Could not find source" << files_query.value( 16 ).toUInt(); continue; } url = QString( "servent://%1\t%2" ).arg( s->nodeId() ).arg( url ); } bool cached = Tomahawk::Result::isCached( url ); Tomahawk::result_ptr result = Tomahawk::Result::get( url ); if ( cached ) { qDebug() << "Result already cached:" << result->toString(); res << result; continue; } Tomahawk::artist_ptr artist = Tomahawk::Artist::get( files_query.value( 18 ).toUInt(), files_query.value( 12 ).toString() ); Tomahawk::album_ptr album = Tomahawk::Album::get( files_query.value( 19 ).toUInt(), files_query.value( 13 ).toString(), artist ); Tomahawk::artist_ptr composer = Tomahawk::Artist::get( files_query.value( 20 ).toUInt(), files_query.value( 15 ).toString() ); result->setModificationTime( files_query.value( 1 ).toUInt() ); result->setSize( files_query.value( 2 ).toUInt() ); result->setMimetype( files_query.value( 4 ).toString() ); result->setDuration( files_query.value( 5 ).toUInt() ); result->setBitrate( files_query.value( 6 ).toUInt() ); result->setArtist( artist ); result->setComposer( composer ); result->setAlbum( album ); result->setDiscNumber( files_query.value( 11 ).toUInt() ); result->setTrack( files_query.value( 14 ).toString() ); result->setRID( uuid() ); result->setAlbumPos( files_query.value( 17 ).toUInt() ); result->setTrackId( files_query.value( 9 ).toUInt() ); TomahawkSqlQuery attrQuery = lib->newquery(); QVariantMap attr; attrQuery.prepare( "SELECT k, v FROM track_attributes WHERE id = ?" ); attrQuery.bindValue( 0, result->trackId() ); attrQuery.exec(); while ( attrQuery.next() ) { attr[ attrQuery.value( 0 ).toString() ] = attrQuery.value( 1 ).toString(); } result->setAttributes( attr ); result->setCollection( s->collection() ); res << result; } emit results( m_query->id(), res ); }
void DatabaseCommand_AllTracks::exec( DatabaseImpl* dbi ) { TomahawkSqlQuery query = dbi->newquery(); QList<Tomahawk::query_ptr> ql; QString m_orderToken, sourceToken; switch ( m_sortOrder ) { case 0: break; case Album: m_orderToken = "album.name, file_join.albumpos"; break; case ModificationTime: m_orderToken = "file.mtime"; break; case AlbumPosition: m_orderToken = "file_join.albumpos"; break; } if ( !m_collection.isNull() ) sourceToken = QString( "AND file.source %1" ).arg( m_collection->source()->isLocal() ? "IS NULL" : QString( "= %1" ).arg( m_collection->source()->id() ) ); QString albumToken; if ( m_album ) { if ( m_album->id() == 0 ) { m_artist = m_album->artist().data(); albumToken = QString( "AND album.id IS NULL" ); } else albumToken = QString( "AND album.id = %1" ).arg( m_album->id() ); } QString sql = QString( "SELECT file.id, artist.name, album.name, track.name, file.size, " "file.duration, file.bitrate, file.url, file.source, file.mtime, file.mimetype, file_join.albumpos, artist.id, album.id, track.id " "FROM file, artist, track, file_join " "LEFT OUTER JOIN album " "ON file_join.album = album.id " "WHERE file.id = file_join.file " "AND file_join.artist = artist.id " "AND file_join.track = track.id " "%1 " "%2 %3 " "%4 %5 %6" ).arg( sourceToken ) .arg( !m_artist ? QString() : QString( "AND artist.id = %1" ).arg( m_artist->id() ) ) .arg( !m_album ? QString() : albumToken ) .arg( m_sortOrder > 0 ? QString( "ORDER BY %1" ).arg( m_orderToken ) : QString() ) .arg( m_sortDescending ? "DESC" : QString() ) .arg( m_amount > 0 ? QString( "LIMIT 0, %1" ).arg( m_amount ) : QString() ); query.prepare( sql ); query.exec(); while( query.next() ) { Tomahawk::source_ptr s; QString url = query.value( 7 ).toString(); if ( query.value( 8 ).toUInt() == 0 ) { s = SourceList::instance()->getLocal(); } else { s = SourceList::instance()->get( query.value( 8 ).toUInt() ); if ( s.isNull() ) { Q_ASSERT( false ); continue; } url = QString( "servent://%1\t%2" ).arg( s->userName() ).arg( url ); } QString artist, track, album; artist = query.value( 1 ).toString(); album = query.value( 2 ).toString(); track = query.value( 3 ).toString(); Tomahawk::result_ptr result = Tomahawk::Result::get( url ); Tomahawk::query_ptr qry = Tomahawk::Query::get( artist, track, album ); Tomahawk::artist_ptr artistptr = Tomahawk::Artist::get( query.value( 12 ).toUInt(), artist ); Tomahawk::album_ptr albumptr = Tomahawk::Album::get( query.value( 13 ).toUInt(), album, artistptr ); result->setTrackId( query.value( 14 ).toUInt() ); result->setArtist( artistptr ); result->setAlbum( albumptr ); result->setTrack( query.value( 3 ).toString() ); result->setSize( query.value( 4 ).toUInt() ); result->setDuration( query.value( 5 ).toUInt() ); result->setBitrate( query.value( 6 ).toUInt() ); result->setModificationTime( query.value( 9 ).toUInt() ); result->setMimetype( query.value( 10 ).toString() ); result->setAlbumPos( query.value( 11 ).toUInt() ); result->setScore( 1.0 ); result->setCollection( s->collection() ); TomahawkSqlQuery attrQuery = dbi->newquery(); QVariantMap attr; attrQuery.prepare( "SELECT k, v FROM track_attributes WHERE id = ?" ); attrQuery.bindValue( 0, result->trackId() ); attrQuery.exec(); while ( attrQuery.next() ) { attr[ attrQuery.value( 0 ).toString() ] = attrQuery.value( 1 ).toString(); } result->setAttributes( attr ); QList<Tomahawk::result_ptr> results; results << result; qry->addResults( results ); qry->setResolveFinished( true ); ql << qry; } qDebug() << Q_FUNC_INFO << ql.length(); emit tracks( ql, data() ); emit done( m_collection ); }