1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-06 22:26:32 +02:00

Slightly improve Query::howSimilar performance.

This commit is contained in:
Christian Muehlhaeuser
2015-04-10 05:20:43 +02:00
parent ad160d456c
commit cea45a9bf4

View File

@@ -559,14 +559,16 @@ Query::checkResults()
bool bool
Query::equals( const Tomahawk::query_ptr& other, bool ignoreCase, bool ignoreAlbum ) const Query::equals( const Tomahawk::query_ptr& other, bool ignoreCase, bool ignoreAlbum ) const
{ {
if ( other.isNull() ) if ( !other )
return false; return false;
if ( ignoreCase ) if ( ignoreCase )
{
return ( queryTrack()->artist().toLower() == other->queryTrack()->artist().toLower() && return ( queryTrack()->artist().toLower() == other->queryTrack()->artist().toLower() &&
( ignoreAlbum || queryTrack()->album().toLower() == other->queryTrack()->album().toLower() ) && ( ignoreAlbum || queryTrack()->album().toLower() == other->queryTrack()->album().toLower() ) &&
queryTrack()->track().toLower() == other->queryTrack()->track().toLower() ); queryTrack()->track().toLower() == other->queryTrack()->track().toLower() );
else }
return ( queryTrack()->artist() == other->queryTrack()->artist() && return ( queryTrack()->artist() == other->queryTrack()->artist() &&
( ignoreAlbum || queryTrack()->album() == other->queryTrack()->album() ) && ( ignoreAlbum || queryTrack()->album() == other->queryTrack()->album() ) &&
queryTrack()->track() == other->queryTrack()->track() ); queryTrack()->track() == other->queryTrack()->track() );
@@ -622,9 +624,8 @@ Query::howSimilar( const Tomahawk::result_ptr& r )
Q_D( Query ); Q_D( Query );
// result values // result values
const QString& rArtistname = r->track()->artistSortname(); const QString& rArtistname = r->track()->artistSortname();
const QString rAlbumname = r->track()->albumSortname(); const QString& rAlbumname = r->track()->albumSortname();
const QString& rTrackname = r->track()->trackSortname(); const QString& rTrackname = r->track()->trackSortname();
QString qArtistname; QString qArtistname;
QString qAlbumname; QString qAlbumname;
QString qTrackname; QString qTrackname;
@@ -643,42 +644,41 @@ Query::howSimilar( const Tomahawk::result_ptr& r )
} }
// normal edit distance // normal edit distance
int artdist = TomahawkUtils::levenshtein( qArtistname, rArtistname ); const int artdist = TomahawkUtils::levenshtein( qArtistname, rArtistname );
int albdist = TomahawkUtils::levenshtein( qAlbumname, rAlbumname ); const int trkdist = TomahawkUtils::levenshtein( qTrackname, rTrackname );
int trkdist = TomahawkUtils::levenshtein( qTrackname, rTrackname );
// max length of name // max length of name
int mlart = qMax( qArtistname.length(), rArtistname.length() ); const int mlart = qMax( qArtistname.length(), rArtistname.length() );
int mlalb = qMax( qAlbumname.length(), rAlbumname.length() ); const int mltrk = qMax( qTrackname.length(), rTrackname.length() );
int mltrk = qMax( qTrackname.length(), rTrackname.length() );
// distance scores // distance scores
float dcart = (float)( mlart - artdist ) / mlart; const float dcart = (float)( mlart - artdist ) / mlart;
float dcalb = (float)( mlalb - albdist ) / mlalb; const float dctrk = (float)( mltrk - trkdist ) / mltrk;
float dctrk = (float)( mltrk - trkdist ) / mltrk;
// don't penalize for missing album name
float dcalb = 1.0;
if ( !qAlbumname.isEmpty() )
{
const int albdist = TomahawkUtils::levenshtein( qAlbumname, rAlbumname );
const int mlalb = qMax( qAlbumname.length(), rAlbumname.length() );
dcalb = (float)( mlalb - albdist ) / mlalb;
}
if ( isFullTextQuery() ) if ( isFullTextQuery() )
{ {
const QString artistTrackname = DatabaseImpl::sortname( fullTextQuery() ); const QString artistTrackname = DatabaseImpl::sortname( fullTextQuery() );
const QString rArtistTrackname = DatabaseImpl::sortname( r->track()->artist() + " " + r->track()->track() ); const QString rArtistTrackname = DatabaseImpl::sortname( r->track()->artist() + " " + r->track()->track() );
int atrdist = TomahawkUtils::levenshtein( artistTrackname, rArtistTrackname ); const int atrdist = TomahawkUtils::levenshtein( artistTrackname, rArtistTrackname );
int mlatr = qMax( artistTrackname.length(), rArtistTrackname.length() ); const int mlatr = qMax( artistTrackname.length(), rArtistTrackname.length() );
float dcatr = (float)( mlatr - atrdist ) / mlatr; const float dcatr = (float)( mlatr - atrdist ) / mlatr;
float res = qMax( dcart, dcalb ); return qMax( dctrk, qMax( dcatr, qMax( dcart, dcalb ) ) );
res = qMax( res, dcatr );
return qMax( res, dctrk );
} }
else else
{ {
// don't penalize for missing album name
if ( queryTrack()->albumSortname().isEmpty() )
dcalb = 1.0;
// weighted, so album match is worth less than track title // weighted, so album match is worth less than track title
float combined = ( dcart * 4 + dcalb + dctrk * 5 ) / 10; return ( dcart * 4 + dcalb + dctrk * 5 ) / 10;
return combined;
} }
} }