CC-84: Smart Playlists

- changed db query so it's lazy loading
This commit is contained in:
James 2012-07-19 14:45:15 -04:00
parent 6fc41ee4bf
commit 82f087c84d
1 changed files with 33 additions and 23 deletions

View File

@ -933,19 +933,26 @@ class Application_Model_Playlist
$multiplier = 60; $multiplier = 60;
} }
if ($data['etc']['sp_limit_options'] == 'hours' || $data['etc']['sp_limit_options'] == 'mins') { if ($data['etc']['sp_limit_options'] == 'hours' || $data['etc']['sp_limit_options'] == 'mins') {
if ( $data['etc']['sp_limit_value'] == "" || intval($data['etc']['sp_limit_value']) == 0) { if ($data['etc']['sp_limit_value'] == "" || floatval($data['etc']['sp_limit_value']) <= 0) {
$error[] = "Limit cannot be empty or 0"; $error[] = "Limit cannot be empty or smaller than 0";
} else { } else {
$mins = $data['etc']['sp_limit_value'] * $multiplier; $mins = $data['etc']['sp_limit_value'] * $multiplier;
if ($mins > 14400) { if ($mins > 14400) {
$error[] = "Limit cannot be more than 24 hrs"; $error[] = "Limit cannot be more than 24 hrs";
} }
} }
if (count($error) > 0){ } else {
$errors[] = array("element"=>"sp_limit_value", "msg"=>$error); if ($data['etc']['sp_limit_value'] == "" || floatval($data['etc']['sp_limit_value']) <= 0) {
$error[] = "Limit cannot be empty or smaller than 0";
} else if (floatval($data['etc']['sp_limit_value']) < 1) {
$error[] = "The value should be an integer";
} }
} }
if (count($error) > 0){
$errors[] = array("element"=>"sp_limit_value", "msg"=>$error);
}
// format validation // format validation
foreach ($data['criteria'] as $key=>$d){ foreach ($data['criteria'] as $key=>$d){
$error = array(); $error = array();
@ -1029,24 +1036,32 @@ class Application_Model_Playlist
{ {
$info = $this->getListofFilesMeetCriteria(); $info = $this->getListofFilesMeetCriteria();
$files = $info['files']; $files = $info['files'];
$limit = $info['limit']; $limit = $info['limit'];
// construct ids of track candidates
$insertList = array(); $insertList = array();
$totalTime = 0; $totalTime = 0;
while ($totalTime < $limit['time'] && !empty($files)) {
$key = array_rand($files); // this moves the pointer to the first element in the collection
$insertList[$key] = $files[$key]; $files->getFirst();
$totalTime += $files[$key]; $iterator = $files->getIterator();
unset($files[$key]); while ($iterator->valid() && $totalTime < $limit['time']) {
Logging::log($iterator->current()->getDbId());
Logging::log($iterator->current()->getDbLength());
$id = $iterator->current()->getDbId();
$length = Application_Common_DateHelper::calculateLengthInSeconds($iterator->current()->getDbLength());
$insertList[$id] = $length;
$totalTime += $length;
if ( !is_null($limit['items']) && $limit['items'] == count($insertList)) { if ( !is_null($limit['items']) && $limit['items'] == count($insertList)) {
break; break;
} }
$iterator->next();
} }
return $insertList; return $insertList;
} }
// this function return list of propel object // this function return list of propel object
private function getListofFilesMeetCriteria() public function getListofFilesMeetCriteria()
{ {
$out = CcPlaylistcriteriaQuery::create()->findByDbPlaylistId($this->id); $out = CcPlaylistcriteriaQuery::create()->findByDbPlaylistId($this->id);
$storedCrit = array(); $storedCrit = array();
@ -1062,7 +1077,8 @@ class Application_Model_Playlist
$storedCrit["crit"][] = array("criteria"=>$criteria, "value"=>$value, "modifier"=>$modifier, "extra"=>$extra); $storedCrit["crit"][] = array("criteria"=>$criteria, "value"=>$value, "modifier"=>$modifier, "extra"=>$extra);
} }
} }
$qry = CcFilesQuery::create();
$qry = CcFilesQuery::create()->setFormatter(ModelCriteria::FORMAT_ON_DEMAND);
foreach ($storedCrit["crit"] as $criteria) { foreach ($storedCrit["crit"] as $criteria) {
// propel doc says we should use phpname for column name but // propel doc says we should use phpname for column name but
// it looks like we have to use actual column name // it looks like we have to use actual column name
@ -1081,8 +1097,8 @@ class Application_Model_Playlist
} }
$spCriteriaModifier = self::$modifier2CriteriaMap[$spCriteriaModifier]; $spCriteriaModifier = self::$modifier2CriteriaMap[$spCriteriaModifier];
try{ try{
//$qry->filterBy($spCriteria, $spCriteriaValue, $spCriteriaModifier);
$qry->filterBy($spCriteria, $spCriteriaValue, $spCriteriaModifier); $qry->filterBy($spCriteria, $spCriteriaValue, $spCriteriaModifier);
$qry->addAscendingOrderByColumn('random()');
}catch (Exception $e){ }catch (Exception $e){
Logging::log($e); Logging::log($e);
} }
@ -1098,13 +1114,7 @@ class Application_Model_Playlist
} }
try{ try{
$out = $qry->find(); $out = $qry->find();
Logging::log($qry->toString()); return array("files"=>$out, "limit"=>$limits, "count"=>$out->count());
$files = array();
foreach ($out as $file) {
$files[$file->getDbId()] = Application_Common_DateHelper::calculateLengthInSeconds($file->getDbLength());
}
//Logging::log($files);
return array("files"=>$files, "limit"=>$limits);
}catch(Exception $e){ }catch(Exception $e){
Logging::log($e); Logging::log($e);
} }