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_Resolve::resolve( DatabaseImpl* lib ) { QList<Tomahawk::result_ptr> res; // 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->queryTrack()->toString(); 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() ) { QString url = files_query.value( 0 ).toString(); source_ptr s = SourceList::instance()->get( files_query.value( 16 ).toUInt() ); if ( !s ) { tDebug() << "Could not find source" << files_query.value( 16 ).toUInt(); continue; } if ( !s->isLocal() ) url = QString( "servent://%1\t%2" ).arg( s->nodeId() ).arg( url ); Tomahawk::result_ptr result = Tomahawk::Result::getCached( url ); if ( result ) { tDebug( LOGVERBOSE ) << "Result already cached:" << result->toString(); res << result; continue; } track_ptr track = Track::get( files_query.value( 9 ).toUInt(), files_query.value( 12 ).toString(), files_query.value( 14 ).toString(), files_query.value( 13 ).toString(), files_query.value( 5 ).toUInt(), files_query.value( 15 ).toString(), files_query.value( 17 ).toUInt(), files_query.value( 11 ).toUInt() ); if ( !track ) continue; track->loadAttributes(); result = Result::get( url, track ); if ( !result ) continue; result->setModificationTime( files_query.value( 1 ).toUInt() ); result->setSize( files_query.value( 2 ).toUInt() ); result->setMimetype( files_query.value( 4 ).toString() ); result->setBitrate( files_query.value( 6 ).toUInt() ); result->setRID( uuid() ); result->setCollection( s->dbCollection() ); res << result; } emit results( m_query->id(), res ); }