void TestMemoryQueryMaker::testFilterTitle() { Meta::TrackList tracks; // -- just get all the tracks Collections::MemoryQueryMaker *qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); tracks = executeQueryMaker( qm ); QCOMPARE( tracks.count(), 3 ); // -- filter for title qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); qm->addFilter( Meta::valTitle, "Skater", true, false ); tracks = executeQueryMaker( qm ); QCOMPARE( tracks.count(), 1 ); QCOMPARE( tracks.first()->name(), QString("Skater Boy" ) ); // -- filter for album qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); qm->addFilter( Meta::valAlbum, "S", false, false ); tracks = executeQueryMaker( qm ); QCOMPARE( tracks.count(), 1 ); QCOMPARE( tracks.first()->name(), QString("Substitute" ) ); // -- filter for artist qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); qm->addFilter( Meta::valArtist, "Lavigne", false, true ); tracks = executeQueryMaker( qm ); QCOMPARE( tracks.count(), 1 ); QCOMPARE( tracks.first()->name(), QString("Skater Boy" ) ); }
Dynamic::TrackSet Dynamic::AlbumPlayBias::matchingTracks( const Meta::TrackList& playlist, int contextCount, int finalCount, Dynamic::TrackCollectionPtr universe ) const { Q_UNUSED( contextCount ); Q_UNUSED( finalCount ); if( playlist.isEmpty() ) // no track means we can't find any tracks in the same album return Dynamic::TrackSet( universe, false ); Meta::TrackPtr track = playlist.last(); Meta::AlbumPtr album = track->album(); if( !album ) // no album means we can't find any tracks in the same album return Dynamic::TrackSet( universe, false ); Meta::TrackList albumTracks = album->tracks(); if( ( albumTracks.count() <= 1 ) || // the album has only one track (or even less) so there can't be any other tracks in the same album ( m_follow != DontCare && sameTrack( track, albumTracks.last() ) ) ) // track is the last one and we want to find a later one. return Dynamic::TrackSet( universe, false ); // we assume that the album tracks are sorted by cd and track number which // is at least true for the SqlCollection TrackSet result( universe, false ); if( m_follow == DirectlyFollow ) { for( int i = 1; i < albumTracks.count(); i++ ) if( sameTrack( albumTracks[i-1], track ) ) result.unite( albumTracks[i] ); } else if( m_follow == Follow ) { bool found = false; for( int i = 0; i < albumTracks.count(); i++ ) { if( found ) result.unite( albumTracks[i] ); if( sameTrack( albumTracks[i], track ) ) found = true; } } else if( m_follow == DontCare ) { for( int i = 0; i < albumTracks.count(); i++ ) { if( !sameTrack( albumTracks[i], track ) ) result.unite( albumTracks[i] ); } } return result; }
Dynamic::TrackSet Dynamic::AlbumPlayBias::matchingTracks( int position, const Meta::TrackList& playlist, int contextCount, Dynamic::TrackCollectionPtr universe ) const { Q_UNUSED( contextCount ); if( position < 1 || position >= playlist.count() ) return Dynamic::TrackSet( universe, false ); Meta::TrackPtr track = playlist[position-1]; Meta::AlbumPtr album = track->album(); if( !album ) return Dynamic::TrackSet( universe, false ); Meta::TrackList albumTracks = album->tracks(); if( albumTracks.count() == 1 || (track == albumTracks.last() && m_follow != DontCare) ) return Dynamic::TrackSet( universe, false ); // we assume that the album tracks are sorted by cd and track number which // is at least true for the SqlCollection TrackSet result( universe, false ); if( m_follow == DirectlyFollow ) { for( int i = 1; i < albumTracks.count(); i++ ) if( albumTracks[i-1] == track ) result.unite( albumTracks[i] ); } else if( m_follow == Follow ) { bool found = false; for( int i = 0; i < albumTracks.count(); i++ ) { if( found ) result.unite( albumTracks[i] ); if( albumTracks[i] == track ) found = true; } } else if( m_follow == DontCare ) { for( int i = 0; i < albumTracks.count(); i++ ) { if( albumTracks[i] != track ) result.unite( albumTracks[i] ); } } return result; }
bool Dynamic::AlbumPlayBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); if( position <= 0 || playlist.count() <= position ) return true; Meta::TrackPtr track = playlist[position-1]; Meta::AlbumPtr album = track->album(); Meta::TrackPtr currentTrack = playlist[position]; Meta::AlbumPtr currentAlbum = currentTrack->album(); if( !album || album->tracks().isEmpty() ) return false; Meta::TrackList albumTracks = album->tracks(); if( sameTrack( track, albumTracks.last() ) && m_follow != DontCare ) return false; // we assume that the album tracks are sorted by cd and track number which // is at least true for the SqlCollection if( m_follow == DirectlyFollow ) { for( int i = 1; i < albumTracks.count(); i++ ) if( sameTrack( albumTracks[i-1], track ) ) return sameTrack( albumTracks[i], currentTrack ); return false; } else if( m_follow == Follow ) { bool found = false; for( int i = 0; i < albumTracks.count(); i++ ) { if( found && sameTrack( albumTracks[i], currentTrack ) ) return true; if( sameTrack( albumTracks[i], track ) ) found = true; } return false; } else if( m_follow == DontCare ) { return album == currentAlbum; } return false; }
bool Dynamic::EchoNestBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); // collect the artist QStringList artists = currentArtists( position, playlist ); if( artists.isEmpty() ) return true; // the artist of this track if( position < 0 || position >= playlist.count() ) return false; Meta::TrackPtr track = playlist[position]; Meta::ArtistPtr artist = track->artist(); if( !artist || artist->name().isEmpty() ) return false; { QMutexLocker locker( &m_mutex ); QString key = artists.join("|"); if( m_similarArtistMap.contains( key ) ) return m_similarArtistMap.value( key ).contains( artist->name() ); } warning() << "didn't have artist suggestions saved for this artist:" << artist->name(); return false; }
double Dynamic::AbstractBias::energy( const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); if( playlist.count() <= contextCount ) return 0.0; int matchCount = 0; for( int i = contextCount; i < playlist.count(); i++ ) { if( trackMatches( i, playlist, contextCount ) ) matchCount++; } return 1.0 - (double(matchCount) / (playlist.count() - contextCount)); }
void TestMemoryQueryMaker::testFilterRating() { Meta::TrackList tracks; Collections::MemoryQueryMaker *qm = 0; // -- filter for Rating qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); qm->addNumberFilter( Meta::valRating, 3, Collections::QueryMaker::Equals ); tracks = executeQueryMaker( qm ); QCOMPARE( tracks.count(), 1 ); QCOMPARE( tracks.first()->name(), QString("Skater Boy" ) ); // -- filter for Rating qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); qm->addNumberFilter( Meta::valRating, 4, Collections::QueryMaker::LessThan ); tracks = executeQueryMaker( qm ); QCOMPARE( tracks.count(), 2 ); }
bool Dynamic::LastFmBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); if( position <= 0 || position >= playlist.count()) return false; // determine the last track and artist Meta::TrackPtr lastTrack = playlist[position-1]; Meta::ArtistPtr lastArtist = lastTrack->artist(); QString lastTrackName = lastTrack->name(); QString lastArtistName = lastArtist ? lastArtist->name() : QString(); Meta::TrackPtr currentTrack = playlist[position]; Meta::ArtistPtr currentArtist = currentTrack->artist(); QString currentTrackName = currentTrack->name(); QString currentArtistName = currentArtist ? currentArtist->name() : QString(); { QMutexLocker locker( &m_mutex ); if( m_match == SimilarArtist ) { if( lastArtistName.isEmpty() ) return true; if( currentArtistName.isEmpty() ) return false; if( lastArtistName == currentArtistName ) return true; if( m_similarArtistMap.contains( lastArtistName ) ) return m_similarArtistMap.value( lastArtistName ).contains( currentArtistName ); } else if( m_match == SimilarTrack ) { if( lastTrackName.isEmpty() ) return true; if( currentTrackName.isEmpty() ) return false; if( lastTrackName == currentTrackName ) return true; TitleArtistPair lastKey( lastTrackName, lastArtistName ); TitleArtistPair currentKey( currentTrackName, currentArtistName ); if( m_similarTrackMap.contains( lastKey ) ) return m_similarTrackMap.value( lastKey ).contains( currentKey ); } } debug() << "didn't have a cached suggestions for track:" << lastTrackName; return false; }
void TestMemoryQueryMaker::testFilterFormat() { Meta::TrackList tracks; Collections::MemoryQueryMaker *qm = 0; // -- filter for title qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); qm->addNumberFilter( Meta::valFormat, int(Amarok::Mp3), Collections::QueryMaker::Equals ); tracks = executeQueryMaker( qm ); QCOMPARE( tracks.count(), 0 ); }
void TestMemoryQueryMaker::testFilterAnd() { Meta::TrackList tracks; Collections::MemoryQueryMaker *qm = 0; qm = new Collections::MemoryQueryMaker( m_mc.toWeakRef(), "test" ); qm->beginAnd(); qm->addNumberFilter( Meta::valTrackNr, 1, Collections::QueryMaker::Equals ); qm->addFilter( Meta::valAlbum, "o", false, false ); qm->endAndOr(); tracks = executeQueryMaker( qm ); QCOMPARE( tracks.count(), 1 ); QCOMPARE( tracks.first()->album()->name(), QString("Rodeo Radio" ) ); }
bool Dynamic::WeeklyTopBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); if( position < 0 || position >= playlist.count()) return false; // - determine the current artist Meta::TrackPtr currentTrack = playlist[position-1]; Meta::ArtistPtr currentArtist = currentTrack->artist(); QString currentArtistName = currentArtist ? currentArtist->name() : QString(); // - collect all the artists QStringList artists; bool weeksMissing = false; uint fromTime = m_range.from.toTime_t(); uint toTime = m_range.to.toTime_t(); uint lastWeekTime = 0; foreach( uint weekTime, m_weeklyFromTimes ) { if( weekTime > fromTime && weekTime < toTime && lastWeekTime ) { if( m_weeklyArtistMap.contains( lastWeekTime ) ) { artists.append( m_weeklyArtistMap.value( lastWeekTime ) ); // debug() << "found already-saved data for week:" << lastWeekTime << m_weeklyArtistMap.value( lastWeekTime ); } else { weeksMissing = true; } } lastWeekTime = weekTime; } if( weeksMissing ) warning() << "didn't have a cached suggestions for weeks:" << m_range.from << "to" << m_range.to; return artists.contains( currentArtistName ); }
Dynamic::TrackSet Dynamic::LastFmBias::matchingTracks( int position, const Meta::TrackList& playlist, int contextCount, Dynamic::TrackCollectionPtr universe ) const { Q_UNUSED( contextCount ); if( position <= 0 || position > playlist.count()) return Dynamic::TrackSet( universe, true ); // determine the last track and artist Meta::TrackPtr lastTrack = playlist[position-1]; Meta::ArtistPtr lastArtist = lastTrack->artist(); m_currentTrack = lastTrack->name(); m_currentArtist = lastArtist ? lastArtist->name() : QString(); { QMutexLocker locker( &m_mutex ); if( m_match == SimilarArtist ) { if( m_currentArtist.isEmpty() ) return Dynamic::TrackSet( universe, true ); if( m_tracksValid && m_tracksMap.contains( m_currentArtist ) ) return m_tracksMap.value( m_currentArtist ); } else if( m_match == SimilarTrack ) { if( m_currentTrack.isEmpty() ) return Dynamic::TrackSet( universe, true ); QString key = m_currentTrack + '|' + m_currentArtist; if( m_tracksValid && m_tracksMap.contains( key ) ) return m_tracksMap.value( key ); } } m_tracks = Dynamic::TrackSet( universe, false ); QTimer::singleShot(0, const_cast<LastFmBias*>(this), SLOT(newQuery())); // create the new query from my parent thread return Dynamic::TrackSet(); }
bool Dynamic::QuizPlayBias::trackMatches( int position, const Meta::TrackList& playlist, int contextCount ) const { Q_UNUSED( contextCount ); if( position <= 0 || position >= playlist.count()) return true; // -- determine the last character we need to quiz Meta::TrackPtr lastTrack = playlist[position-1]; Meta::DataPtr lastData; if( m_follow == TitleToTitle ) lastData = Meta::DataPtr::staticCast<Meta::Track>(lastTrack); else if( m_follow == ArtistToArtist ) lastData = Meta::DataPtr::staticCast<Meta::Artist>(lastTrack->artist()); else if( m_follow == AlbumToAlbum ) lastData = Meta::DataPtr::staticCast<Meta::Album>(lastTrack->album()); if( !lastData || lastData->name().isEmpty() ) return true; // -- determine the first character Meta::TrackPtr track = playlist[position]; Meta::DataPtr data; if( m_follow == TitleToTitle ) data = Meta::DataPtr::staticCast<Meta::Track>(track); else if( m_follow == ArtistToArtist ) data = Meta::DataPtr::staticCast<Meta::Artist>(track->artist()); else if( m_follow == AlbumToAlbum ) data = Meta::DataPtr::staticCast<Meta::Album>(track->album()); if( !data || data->name().isEmpty() ) return false; // -- now compare QString lastName = lastData->name(); QString name = data->name(); return lastChar( lastName ).toLower() == name[0].toLower(); }
Dynamic::TrackSet Dynamic::QuizPlayBias::matchingTracks( int position, const Meta::TrackList& playlist, int contextCount, Dynamic::TrackCollectionPtr universe ) const { Q_UNUSED( contextCount ); if( position <= 0 || position > playlist.count()) return Dynamic::TrackSet( universe, true ); // determine the last character we need to quiz Meta::TrackPtr lastTrack = playlist[position-1]; Meta::DataPtr lastData; if( m_follow == TitleToTitle ) lastData = Meta::DataPtr::staticCast<Meta::Track>(lastTrack); else if( m_follow == ArtistToArtist ) lastData = Meta::DataPtr::staticCast<Meta::Artist>(lastTrack->artist()); else if( m_follow == AlbumToAlbum ) lastData = Meta::DataPtr::staticCast<Meta::Album>(lastTrack->album()); if( !lastData || lastData->name().isEmpty() ) { // debug() << "QuizPlay: no data for"<<lastTrack->name(); return Dynamic::TrackSet( universe, true ); } m_currentCharacter = lastChar(lastData->name()).toLower(); // debug() << "QuizPlay: data for"<<lastTrack->name()<<"is"<<m_currentCharacter; // -- look if we already buffered it if( m_tracksValid && m_characterTrackMap.contains( m_currentCharacter ) ) return m_characterTrackMap.value( m_currentCharacter ); // -- start a new query m_tracks = Dynamic::TrackSet( universe, false ); QTimer::singleShot(0, const_cast<QuizPlayBias*>(this), SLOT(newQuery())); // create the new query from my parent thread return Dynamic::TrackSet(); }