[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: extragear/multimedia/amarok/src/collection/sqlcollection
From: Jeff Mitchell <mitchell () kde ! org>
Date: 2009-07-15 19:03:31
Message-ID: 1247684611.126560.3881.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 997341 by mitchell:
Remove three SELECT queries per scanned track. Could provide a decent speedup. Will \
remove spammy debug output after a bit more testing.
M +128 -41 ScanResultProcessor.cpp
M +5 -0 ScanResultProcessor.h
--- trunk/extragear/multimedia/amarok/src/collection/sqlcollection/ScanResultProcessor.cpp \
#997340:997341 @@ -314,6 +314,23 @@
album = albumId( albumName, albumArtistId );
}
+ bool needToQuery = false;
+ if( !m_artists.contains( trackData.value( Field::ARTIST ).toString() ) ||
+ !m_genre.contains( trackData.value( Field::GENRE ).toString() ) ||
+ !m_composer.contains( trackData.value( Field::COMPOSER ).toString() ) ||
+ !m_year.contains( trackData.value( Field::YEAR ).toString() ) )
+ needToQuery = true;
+
+ if( needToQuery )
+ {
+ //run a single query to fetch these at once, to save time
+ //then values will be cached in local maps, so can use the same calls below
+ databaseIdFetch( trackData.value( Field::ARTIST ).toString(),
+ trackData.value( Field::GENRE ).toString(),
+ trackData.value( Field::COMPOSER ).toString(),
+ trackData.value( Field::YEAR ).toString() );
+ }
+
int artist = artistId( trackData.value( Field::ARTIST ).toString() );
int genre = genreId( trackData.value( Field::GENRE ).toString() );
int composer = composerId( trackData.value( Field::COMPOSER ).toString() );
@@ -383,85 +400,155 @@
return m_artists.value( artist );
QString query = QString( "SELECT id FROM artists_temp WHERE name = '%1';" ).arg( \
m_collection->escape( artist ) ); QStringList res = m_collection->query( query );
+ int id = 0;
if( res.isEmpty() )
- {
- QString insert = QString( "INSERT INTO artists_temp( name ) VALUES ('%1');" \
).arg( m_collection->escape( artist ) );
- int id = m_collection->insert( insert, "artists_temp" );
- m_artists.insert( artist, id );
- return id;
- }
+ id = artistInsert( artist );
else
- {
- int id = res[0].toInt();
- m_artists.insert( artist, id );
- return id;
- }
+ id = res[0].toInt();
+ m_artists.insert( artist, id );
+ return id;
}
int
+ScanResultProcessor::artistInsert( const QString &artist )
+{
+ QString insert = QString( "INSERT INTO artists_temp( name ) VALUES ('%1');" \
).arg( m_collection->escape( artist ) ); + int id = m_collection->insert( insert, \
"artists_temp" ); + return id;
+}
+
+int
ScanResultProcessor::genreId( const QString &genre )
{
if( m_genre.contains( genre ) )
return m_genre.value( genre );
QString query = QString( "SELECT id FROM genres_temp WHERE name = '%1';" ).arg( \
m_collection->escape( genre ) ); QStringList res = m_collection->query( query );
+ int id = 0;
if( res.isEmpty() )
- {
- QString insert = QString( "INSERT INTO genres_temp( name ) VALUES ('%1');" \
).arg( m_collection->escape( genre ) );
- int id = m_collection->insert( insert, "genres_temp" );
- m_genre.insert( genre, id );
- return id;
- }
+ id = genreInsert( genre );
else
- {
- int id = res[0].toInt();
- m_genre.insert( genre, id );
- return id;
- }
+ id = res[0].toInt();
+ m_genre.insert( genre, id );
+ return id;
}
int
+ScanResultProcessor::genreInsert( const QString &genre )
+{
+ QString insert = QString( "INSERT INTO genres_temp( name ) VALUES ('%1');" \
).arg( m_collection->escape( genre ) ); + int id = m_collection->insert( insert, \
"genres_temp" ); + return id;
+}
+
+int
ScanResultProcessor::composerId( const QString &composer )
{
if( m_composer.contains( composer ) )
return m_composer.value( composer );
QString query = QString( "SELECT id FROM composers_temp WHERE name = '%1';" \
).arg( m_collection->escape( composer ) ); QStringList res = m_collection->query( \
query ); + int id = 0;
if( res.isEmpty() )
- {
- QString insert = QString( "INSERT INTO composers_temp( name ) VALUES \
('%1');" ).arg( m_collection->escape( composer ) );
- int id = m_collection->insert( insert, "composers_temp" );
- m_composer.insert( composer, id );
- return id;
- }
+ id = composerInsert( composer );
else
- {
- int id = res[0].toInt();
- m_composer.insert( composer, id );
- return id;
- }
+ id = res[0].toInt();
+ m_composer.insert( composer, id );
+ return id;
}
int
+ScanResultProcessor::composerInsert( const QString &composer )
+{
+ QString insert = QString( "INSERT INTO composers_temp( name ) VALUES ('%1');" \
).arg( m_collection->escape( composer ) ); + int id = m_collection->insert( \
insert, "composers_temp" ); + return id;
+}
+
+int
ScanResultProcessor::yearId( const QString &year )
{
if( m_year.contains( year ) )
return m_year.value( year );
QString query = QString( "SELECT id FROM years_temp WHERE name = '%1';" ).arg( \
m_collection->escape( year ) ); QStringList res = m_collection->query( query );
+ int id = 0;
if( res.isEmpty() )
+ id = yearInsert( year );
+ else
+ id = res[0].toInt();
+ m_year.insert( year, id );
+ return id;
+}
+
+int
+ScanResultProcessor::yearInsert( const QString &year )
+{
+ QString insert = QString( "INSERT INTO years_temp( name ) VALUES ('%1');" ).arg( \
m_collection->escape( year ) ); + int id = m_collection->insert( insert, \
"years_temp" ); + return id;
+}
+
+void
+ScanResultProcessor::databaseIdFetch( const QString &artist, const QString &genre, \
const QString &composer, const QString &year ) +{
+ DEBUG_BLOCK
+ int a = 0;
+ int g = 0;
+ int c = 0;
+ int y = 0;
+ QString query = QString( "SELECT id, name FROM artists_temp WHERE name = '%1' " \
).arg( m_collection->escape( artist ) ); + query += QString( "UNION ALL SELECT id, \
name FROM genres_temp WHERE name = '%1' " ).arg( m_collection->escape( genre ) ); + \
query += QString( "UNION ALL SELECT id, name FROM composers_temp WHERE name = '%1' " \
).arg( m_collection->escape( composer ) ); + query += QString( "UNION ALL SELECT \
id, name FROM years_temp WHERE name = '%1';" ).arg( m_collection->escape( year ) ); + \
QStringList res = m_collection->query( query ); + debug() << "Result size = " << \
res.size(); + int index = 0;
+ QString first;
+ QString second;
+ while( index < res.size() )
{
- QString insert = QString( "INSERT INTO years_temp( name ) VALUES ('%1');" \
).arg( m_collection->escape( year ) );
- int id = m_collection->insert( insert, "years_temp" );
- m_year.insert( year, id );
- return id;
+ first = res.at( index++ );
+ second = res.at( index++ );
+ debug() << "first = " << first;
+ debug() << "second = " << second;
+ if( second == artist )
+ a = first.toInt();
+ if( second == genre )
+ g = first.toInt();
+ if( second == composer )
+ c = first.toInt();
+ if( second == year )
+ y = first.toInt();
}
- else
+ debug() << "artist = " << a;
+ debug() << "genre = " << g;
+ debug() << "composer = " << c;
+ debug() << "year = " << y;
+ if( !a )
{
- int id = res[0].toInt();
- m_year.insert( year, id );
- return id;
+ debug() << "m_artist = before " << m_artists;
+ m_artists.insert( artist, artistInsert( artist ) );
+ debug() << "m_artist after = " << m_artists;
}
+ if( !g )
+ {
+ debug() << "m_genre = before " << m_genre;
+ m_genre.insert( genre, genreInsert( genre ) );
+ debug() << "m_genre after = " << m_genre;
+ }
+ if( !c )
+ {
+ debug() << "m_composer = before " << m_composer;
+ m_composer.insert( composer, composerInsert( composer ) );
+ debug() << "m_composer after = " << m_composer;
+ }
+ if( !y )
+ {
+ debug() << "m_year = before " << m_year;
+ m_year.insert( year, yearInsert( year ) );
+ debug() << "m_year after = " << m_year;
+ }
}
int
--- trunk/extragear/multimedia/amarok/src/collection/sqlcollection/ScanResultProcessor.h \
#997340:997341 @@ -58,9 +58,14 @@
void addTrack( const QVariantMap &trackData, int albumArtistId );
int artistId( const QString &artist );
+ int artistInsert( const QString &artist );
int genreId( const QString &genre );
+ int genreInsert( const QString &genre );
int composerId( const QString &composer );
+ int composerInsert( const QString &composer );
int yearId( const QString &year );
+ int yearInsert( const QString &year );
+ void databaseIdFetch( const QString &artist, const QString &genre, const \
QString &composer, const QString &year ); int imageId( const QString &image, int \
albumId ); int albumId( const QString &album, int artistId );
int urlId( const QString &url, const QString &uid );
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic