aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Blake <oak99sky@yahoo.co.uk>2019-01-27 17:14:01 +0000
committerGitHub <noreply@github.com>2019-01-27 17:14:01 +0000
commit7f93d8b22c3406560ce0bee9fda761317b4e86a1 (patch)
tree7a1aab373128c5eae2d0498e8f8c6bf145c0b1d0
parentd465913c3449211d5a4ecfd841b8c47a213594fc (diff)
parentff60d9f151ff420d40d4082a076b6db3df94f610 (diff)
Merge pull request #15340 from DaveTBlake/RandomLimitedArtists
[Music]Fix slow random artist and albums home screen widgets
-rw-r--r--xbmc/music/MusicDatabase.cpp66
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 (...)