diff options
author | Dave Blake <oak99sky@yahoo.co.uk> | 2019-01-27 17:14:01 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-27 17:14:01 +0000 |
commit | 7f93d8b22c3406560ce0bee9fda761317b4e86a1 (patch) | |
tree | 7a1aab373128c5eae2d0498e8f8c6bf145c0b1d0 | |
parent | d465913c3449211d5a4ecfd841b8c47a213594fc (diff) | |
parent | ff60d9f151ff420d40d4082a076b6db3df94f610 (diff) |
Merge pull request #15340 from DaveTBlake/RandomLimitedArtists
[Music]Fix slow random artist and albums home screen widgets
-rw-r--r-- | xbmc/music/MusicDatabase.cpp | 66 |
1 files changed, 44 insertions, 22 deletions
diff --git a/xbmc/music/MusicDatabase.cpp b/xbmc/music/MusicDatabase.cpp index 16562b4962..59c8319b37 100644 --- a/xbmc/music/MusicDatabase.cpp +++ b/xbmc/music/MusicDatabase.cpp @@ -4166,8 +4166,6 @@ bool CMusicDatabase::GetArtistsNav(const std::string& strBaseDir, CFileItemList& if (NULL == m_pDS.get()) return false; try { - unsigned int time = XbmcThreads::SystemClockMillis(); - CMusicDbUrl musicUrl; if (!musicUrl.FromString(strBaseDir)) return false; @@ -4185,7 +4183,6 @@ bool CMusicDatabase::GetArtistsNav(const std::string& strBaseDir, CFileItemList& musicUrl.AddOption("albumartistsonly", albumArtistsOnly); bool result = GetArtistsByWhere(musicUrl.ToString(), filter, items, sortDescription, countOnly); - CLog::Log(LOGDEBUG,"Time to retrieve artists from dataset = %i", XbmcThreads::SystemClockMillis() - time); return result; } @@ -4204,6 +4201,8 @@ bool CMusicDatabase::GetArtistsByWhere(const std::string& strBaseDir, const Filt try { + unsigned int querytime = 0; + unsigned int time = XbmcThreads::SystemClockMillis(); int total = -1; std::string strSQL = "SELECT %s FROM artistview "; @@ -4245,12 +4244,15 @@ bool CMusicDatabase::GetArtistsByWhere(const std::string& strBaseDir, const Filt if (!BuildSQL(strSQLExtra, extFilter, strSQLExtra)) return false; - // Apply the limiting directly here if there's no special sorting but limiting - if (extFilter.limit.empty() && - sortDescription.sortBy == SortByNone && - (sortDescription.limitStart > 0 || sortDescription.limitEnd > 0)) + // Apply limits and sort order directly in SQL when random sort or none + bool limitedInSQL = extFilter.limit.empty() && + (sortDescription.sortBy == SortByNone || sortDescription.sortBy == SortByRandom) && + (sortDescription.limitStart > 0 || sortDescription.limitEnd > 0); + if (limitedInSQL) { total = (int)strtol(GetSingleValue(PrepareSQL(strSQL, "COUNT(1)") + strSQLExtra, m_pDS).c_str(), NULL, 10); + if (sortDescription.sortBy == SortByRandom) + strSQLExtra += PrepareSQL(" ORDER BY RANDOM()"); strSQLExtra += DatabaseUtils::BuildLimitClause(sortDescription.limitEnd, sortDescription.limitStart); } @@ -4258,13 +4260,16 @@ bool CMusicDatabase::GetArtistsByWhere(const std::string& strBaseDir, const Filt // run query CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); - if (!m_pDS->query(strSQL)) return false; + querytime = XbmcThreads::SystemClockMillis(); + if (!m_pDS->query(strSQL)) + return false; int iRowsFound = m_pDS->num_rows(); if (iRowsFound == 0) { m_pDS->close(); return true; } + querytime = XbmcThreads::SystemClockMillis() - querytime; if (countOnly) { @@ -4283,9 +4288,14 @@ bool CMusicDatabase::GetArtistsByWhere(const std::string& strBaseDir, const Filt DatabaseResults results; results.reserve(iRowsFound); - if (!SortUtils::SortFromDataset(sortDescription, MediaTypeArtist, m_pDS, results)) - return false; + // Random order with limits already applied in SQL, just fetch results from dataset + sorting = sortDescription; + if (limitedInSQL && sortDescription.sortBy == SortByRandom) + sorting.sortBy = SortByNone; + if (!SortUtils::SortFromDataset(sorting, MediaTypeSong, m_pDS, results)) + return false; + // get data from returned rows items.Reserve(results.size()); const dbiplus::query_data &data = m_pDS->get_result_set().records; @@ -4320,6 +4330,8 @@ bool CMusicDatabase::GetArtistsByWhere(const std::string& strBaseDir, const Filt // cleanup m_pDS->close(); + CLog::Log(LOGDEBUG, "{0}: Time to fill list with artists {1}ms query took {2}ms", + __FUNCTION__, XbmcThreads::SystemClockMillis() - time, querytime); return true; } catch (...) @@ -4382,6 +4394,8 @@ bool CMusicDatabase::GetAlbumsByWhere(const std::string &baseDir, const Filter & try { + unsigned int querytime = 0; + unsigned int time = XbmcThreads::SystemClockMillis(); int total = -1; std::string strSQL = "SELECT %s FROM albumview "; @@ -4404,31 +4418,32 @@ bool CMusicDatabase::GetAlbumsByWhere(const std::string &baseDir, const Filter & if (!BuildSQL(strSQLExtra, extFilter, strSQLExtra)) return false; - // Apply the limiting directly here if there's no special sorting but limiting - if (extFilter.limit.empty() && - sortDescription.sortBy == SortByNone && - (sortDescription.limitStart > 0 || sortDescription.limitEnd > 0)) + // Apply limits and sort order directly in SQL when random sort or none + bool limitedInSQL = extFilter.limit.empty() && + (sortDescription.sortBy == SortByNone || sortDescription.sortBy == SortByRandom) && + (sortDescription.limitStart > 0 || sortDescription.limitEnd > 0); + if (limitedInSQL) { total = (int)strtol(GetSingleValue(PrepareSQL(strSQL, "COUNT(1)") + strSQLExtra, m_pDS).c_str(), NULL, 10); + if (sortDescription.sortBy == SortByRandom) + strSQLExtra += PrepareSQL(" ORDER BY RANDOM()"); strSQLExtra += DatabaseUtils::BuildLimitClause(sortDescription.limitEnd, sortDescription.limitStart); } strSQL = PrepareSQL(strSQL, !filter.fields.empty() && filter.fields.compare("*") != 0 ? filter.fields.c_str() : "albumview.*") + strSQLExtra; - CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); // run query - unsigned int time = XbmcThreads::SystemClockMillis(); - if (!m_pDS->query(strSQL)) + CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str()); + querytime = XbmcThreads::SystemClockMillis(); + if (!m_pDS->query(strSQL)) return false; - CLog::Log(LOGDEBUG, "%s - query took %i ms", - __FUNCTION__, XbmcThreads::SystemClockMillis() - time); time = XbmcThreads::SystemClockMillis(); - int iRowsFound = m_pDS->num_rows(); - if (iRowsFound <= 0) + if (iRowsFound == 0) { m_pDS->close(); return true; } + querytime = XbmcThreads::SystemClockMillis() - querytime; // store the total value of items as a property if (total < iRowsFound) @@ -4447,7 +4462,12 @@ bool CMusicDatabase::GetAlbumsByWhere(const std::string &baseDir, const Filter & DatabaseResults results; results.reserve(iRowsFound); - if (!SortUtils::SortFromDataset(sortDescription, MediaTypeAlbum, m_pDS, results)) + + // Random order with limits already applied in SQL, just fetch results from dataset + sorting = sortDescription; + if (limitedInSQL && sortDescription.sortBy == SortByRandom) + sorting.sortBy = SortByNone; + if (!SortUtils::SortFromDataset(sorting, MediaTypeSong, m_pDS, results)) return false; // get data from returned rows @@ -4477,6 +4497,8 @@ bool CMusicDatabase::GetAlbumsByWhere(const std::string &baseDir, const Filter & // cleanup m_pDS->close(); + CLog::Log(LOGDEBUG, "{0}: Time to fill list with albums {1}ms query took {2}ms", + __FUNCTION__, XbmcThreads::SystemClockMillis() - time, querytime); return true; } catch (...) |