add cache-table for character data instead of using database view (solves issue #324)

This commit is contained in:
coderkun 2014-06-08 14:11:21 +02:00
commit b09d4abc06
6 changed files with 233 additions and 106 deletions

View file

@ -24,7 +24,7 @@
* *
* @var array * @var array
*/ */
public $models = array('seminaries', 'characters', 'users', 'charactergroups', 'charactertypes', 'seminarycharacterfields', 'avatars', 'media', 'quests', 'questgroups', 'questtopics'); public $models = array('seminaries', 'characters', 'users', 'charactergroups', 'charactertypes', 'seminarycharacterfields', 'avatars', 'media', 'quests', 'questgroups', 'questtopics', 'xplevels');
/** /**
* Required components * Required components
* *
@ -94,7 +94,7 @@
$characters = $this->Characters->getCharactersForSeminarySorted($seminary['id'], $sortorder, $limit, $offset); $characters = $this->Characters->getCharactersForSeminarySorted($seminary['id'], $sortorder, $limit, $offset);
foreach($characters as &$character) foreach($characters as &$character)
{ {
$character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']); $character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']);
$character['user'] = $this->Users->getUserById($character['user_id']); $character['user'] = $this->Users->getUserById($character['user_id']);
$character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id'])); $character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id']));
$character['characterfields'] = array(); $character['characterfields'] = array();
@ -137,8 +137,7 @@
// Get Character // Get Character
$character = $this->Characters->getCharacterByUrl($seminary['id'], $characterUrl); $character = $this->Characters->getCharacterByUrl($seminary['id'], $characterUrl);
$character['quest_xps'] = $this->Characters->getQuestXPsOfCharacter($character['id']); $character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']);
$character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']);
$character['rank'] = $this->Characters->getXPRank($seminary['id'], $character['xps']); $character['rank'] = $this->Characters->getXPRank($seminary['id'], $character['xps']);
// Get User // Get User
@ -424,7 +423,7 @@
$characters = $this->Characters->getCharactersForSeminarySorted($seminary['id'], $sortorder); $characters = $this->Characters->getCharactersForSeminarySorted($seminary['id'], $sortorder);
foreach($characters as &$character) foreach($characters as &$character)
{ {
$character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']); $character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']);
$character['user'] = $this->Users->getUserById($character['user_id']); $character['user'] = $this->Users->getUserById($character['user_id']);
$character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id'])); $character['characterroles'] = array_map(function($r) { return $r['name']; }, $this->Characterroles->getCharacterrolesForCharacterById($character['id']));
$character['characterfields'] = array(); $character['characterfields'] = array();

View file

@ -24,7 +24,7 @@
* *
* @var array * @var array
*/ */
public $models = array('seminaries', 'questgroups', 'quests', 'questtexts', 'media', 'questtypes', 'questgroupshierarchy'); public $models = array('seminaries', 'questgroups', 'quests', 'questtexts', 'media', 'questtypes', 'questgroupshierarchy', 'xplevels');
/** /**
* User permissions * User permissions
* *
@ -638,7 +638,7 @@
$this->Quests->setQuestSolved($quest['id'], $character['id']); $this->Quests->setQuestSolved($quest['id'], $character['id']);
// Notify of XP-level change // Notify of XP-level change
$newXPLevel = $this->Characters->getXPLevelOfCharacters($character['id']); $newXPLevel = $this->Xplevels->getXPLevelById($character['xplevel_id']);
if($newXPLevel['level'] > $character['xplevel']) { if($newXPLevel['level'] > $character['xplevel']) {
$this->Notification->addNotification( $this->Notification->addNotification(
\hhu\z\controllers\components\NotificationComponent::TYPE_LEVELUP, \hhu\z\controllers\components\NotificationComponent::TYPE_LEVELUP,
@ -868,12 +868,13 @@
private function sendSubmissionMail($seminary, $questgroup, $quest, $character) private function sendSubmissionMail($seminary, $questgroup, $quest, $character)
{ {
// Get system moderators // Get system moderators
$moderators = $this->Users->getUsersWithRole('moderator'); $moderators = $this->Characters->getCharactersWithRole('moderator');
// Send notification mail // Send notification mail
try { try {
foreach($moderators as &$moderator) foreach($moderators as &$moderator)
{ {
$user = $this->Users->getUserById($moderator['user_id']);
\hhu\z\Utils::sendMail( \hhu\z\Utils::sendMail(
$moderator['email'], $moderator['email'],
'charactersubmission', 'charactersubmission',

View file

@ -25,7 +25,7 @@
* *
* @var array * @var array
*/ */
public $models = array('characters', 'quests', 'questgroups', 'achievements', 'charactergroups', 'avatars', 'media'); public $models = array('characters', 'quests', 'questgroups', 'achievements', 'charactergroups', 'avatars', 'media', 'xplevels');
@ -49,7 +49,7 @@
if(is_null($character)) { if(is_null($character)) {
return; return;
} }
$character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']); $character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']);
$character['rank'] = $this->Characters->getXPRank($seminary['id'], $character['xps']); $character['rank'] = $this->Characters->getXPRank($seminary['id'], $character['xps']);
// Get “last” Quest // Get “last” Quest

View file

@ -36,7 +36,7 @@
* *
* @var array * @var array
*/ */
public $models = array('users', 'userroles', 'characters', 'characterroles', 'avatars', 'media'); public $models = array('users', 'userroles', 'characters', 'characterroles', 'avatars', 'media', 'xplevels');
/** /**
* Required components * Required components
* *
@ -116,7 +116,7 @@
$character['characterroles'] = array_map(function($a) { return $a['name']; }, $character['characterroles']); $character['characterroles'] = array_map(function($a) { return $a['name']; }, $character['characterroles']);
// Level // Level
$character['xplevel'] = $this->Characters->getXPLevelOfCharacters($character['id']); $character['xplevel'] = $this->Xplevels->getXPLevelById($character['xplevel_id']);
// Avatar // Avatar
$avatar = $this->Avatars->getAvatarById($character['avatar_id']); $avatar = $this->Avatars->getAvatarById($character['avatar_id']);

View file

@ -43,11 +43,17 @@
public function getCharactersForUser($userId) public function getCharactersForUser($userId)
{ {
return $this->db->query( return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '. 'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE user_id = ?', 'WHERE characters.user_id = ?',
'i', 'i',
$userId $userId
); );
@ -64,7 +70,7 @@
{ {
$data = $this->db->query( $data = $this->db->query(
'SELECT count(DISTINCT characters.id) AS c '. 'SELECT count(DISTINCT characters.id) AS c '.
'FROM v_characters AS characters '. 'FROM characters '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '. 'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE seminaries.id = ?', 'WHERE seminaries.id = ?',
@ -89,9 +95,15 @@
public function getCharactersForSeminary($seminaryId, $onlyWithRole=false) public function getCharactersForSeminary($seminaryId, $onlyWithRole=false)
{ {
return $this->db->query( return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '. 'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE seminaries.id = ?'. 'WHERE seminaries.id = ?'.
($onlyWithRole ? ' AND EXISTS (SELECT character_id FROM characters_characterroles WHERE character_id = characters.id)' : null), ($onlyWithRole ? ' AND EXISTS (SELECT character_id FROM characters_characterroles WHERE character_id = characters.id)' : null),
@ -125,13 +137,20 @@
return $this->db->query( return $this->db->query(
sprintf( sprintf(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '. 'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'WHERE seminaries.id = ? '. 'WHERE seminaries.id = ? '.
'ORDER BY characters.%s %s '. 'ORDER BY %s.%s %s '.
(!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null), (!empty($limit) ? sprintf('LIMIT %d, %d', $offset, $limit) : null),
($sort == 'xps' ? 'cache_characters' : 'characters'),
$sort, $sort,
$orders[$sort] $orders[$sort]
), ),
@ -141,9 +160,15 @@
break; break;
case 'role': case 'role':
return $this->db->query( return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '. 'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'LEFT JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '. 'LEFT JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'LEFT JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id '. 'LEFT JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id '.
@ -156,9 +181,15 @@
break; break;
default: default:
return $this->db->query( return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '. 'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'LEFT JOIN characters_seminarycharacterfields ON characters_seminarycharacterfields.character_id = characters.id '. 'LEFT JOIN characters_seminarycharacterfields ON characters_seminarycharacterfields.character_id = characters.id '.
'LEFT JOIN seminarycharacterfields ON seminarycharacterfields.id = characters_seminarycharacterfields.seminarycharacterfield_id AND seminarycharacterfields.url = ? '. 'LEFT JOIN seminarycharacterfields ON seminarycharacterfields.id = characters_seminarycharacterfields.seminarycharacterfield_id AND seminarycharacterfields.url = ? '.
@ -183,12 +214,17 @@
public function getCharactersForGroup($groupId) public function getCharactersForGroup($groupId)
{ {
return $this->db->query( return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'LEFT JOIN characters_charactergroups ON characters_charactergroups.character_id = characters.id '. 'LEFT JOIN characters_charactergroups ON characters_charactergroups.character_id = characters.id '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE characters_charactergroups.charactergroup_id = ? '. 'WHERE characters_charactergroups.charactergroup_id = ? '.
'ORDER BY characters.xps DESC', 'ORDER BY cache_characters.xps DESC',
'i', 'i',
$groupId $groupId
); );
@ -206,9 +242,14 @@
public function getCharacterForUserAndSeminary($userId, $seminaryId) public function getCharacterForUserAndSeminary($userId, $seminaryId)
{ {
$data = $this->db->query( $data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE characters.user_id = ? AND charactertypes.seminary_id = ?', 'WHERE characters.user_id = ? AND charactertypes.seminary_id = ?',
'ii', 'ii',
$userId, $seminaryId $userId, $seminaryId
@ -233,9 +274,14 @@
public function getCharacterByUrl($seminaryId, $characterUrl) public function getCharacterByUrl($seminaryId, $characterUrl)
{ {
$data = $this->db->query( $data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE charactertypes.seminary_id = ? AND characters.url = ?', 'WHERE charactertypes.seminary_id = ? AND characters.url = ?',
'is', 'is',
$seminaryId, $characterUrl $seminaryId, $characterUrl
@ -259,9 +305,14 @@
public function getCharacterById($characterId) public function getCharacterById($characterId)
{ {
$data = $this->db->query( $data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE characters.id = ?', 'WHERE characters.id = ?',
'i', 'i',
$characterId $characterId
@ -275,6 +326,27 @@
} }
/**
* Get Characters with the given Character role.
*
* @param string $characterrole Character role
* @return array List of Characters
*/
public function getCharactersWithRole($characterrole)
{
return $this->db->query(
'SELECT characters.id, users.created, users.username, users.url, users.surname, users.prename, users.email '.
'FROM characters '.
'LEFT JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'LEFT JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id '.
'WHERE characterroles.name = ? '.
'ORDER BY name ASC',
's',
$userrole
);
}
/** /**
* Get Characters with the most amount of Achievements. * Get Characters with the most amount of Achievements.
* *
@ -285,13 +357,19 @@
public function getCharactersWithMostAchievements($seminaryId, $count, $alsoWithDeadline=true) public function getCharactersWithMostAchievements($seminaryId, $count, $alsoWithDeadline=true)
{ {
return $this->db->query( return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, count(DISTINCT achievement_id) AS c '. 'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'count(DISTINCT achievement_id) AS c '.
'FROM achievements_characters '. 'FROM achievements_characters '.
'INNER JOIN achievements ON achievements.id = achievements_characters.achievement_id '. 'INNER JOIN achievements ON achievements.id = achievements_characters.achievement_id '.
'INNER JOIN v_characters AS characters ON characters.id = achievements_characters.character_id '. 'INNER JOIN characters ON characters.id = achievements_characters.character_id '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '. 'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '. 'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'WHERE achievements.seminary_id = ? AND deadline IS NULL '. 'WHERE achievements.seminary_id = ? AND deadline IS NULL '.
(!$alsoWithDeadline ? 'AND achievements.deadline IS NULL ' : null). (!$alsoWithDeadline ? 'AND achievements.deadline IS NULL ' : null).
'GROUP BY achievements_characters.character_id '. 'GROUP BY achievements_characters.character_id '.
@ -305,55 +383,6 @@
} }
/**
* Calculate only XPs for a Character achieved through Quests.
*
* @param int $characterId ID of Character
* @return int Quest-XPs for Character
*/
public function getQuestXPsOfCharacter($characterId)
{
$data = $this->db->query(
'SELECT quest_xps '.
'FROM v_charactersxps '.
'WHERE character_id = ?',
'i',
$characterId
);
if(!empty($data)) {
return $data[0]['quest_xps'];
}
return 0;
}
/**
* Get the XP-level of a Character.
*
* @param string $characterId ID of the Character
* @return array XP-level of Character
*/
public function getXPLevelOfCharacters($characterId)
{
$data = $this->db->query(
'SELECT xplevels.xps, xplevels.level, xplevels.name '.
'FROM v_charactersxplevels '.
'INNER JOIN xplevels ON xplevels.id = v_charactersxplevels.xplevel_id '.
'WHERE v_charactersxplevels.character_id = ?',
'i',
$characterId
);
if(!empty($data)) {
return $data[0];
}
return null;
}
/** /**
* Get the rank of a XP-value of a Character. * Get the rank of a XP-value of a Character.
* *
@ -366,10 +395,11 @@
$data = $this->db->query( $data = $this->db->query(
'SELECT count(characters.id) AS c '. 'SELECT count(characters.id) AS c '.
'FROM charactertypes '. 'FROM charactertypes '.
'INNER JOIN v_characters AS characters ON characters.charactertype_id = charactertypes.id '. 'INNER JOIN characters ON characters.charactertype_id = charactertypes.id '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '. 'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '. 'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '.
'WHERE seminary_id = ? AND characters.xps > ?', 'WHERE seminary_id = ? AND cache_characters.xps > ?',
'sid', 'sid',
'user', 'user',
$seminaryId, $xps $seminaryId, $xps
@ -394,13 +424,18 @@
public function getSuperiorCharacters($seminaryId, $xps, $count) public function getSuperiorCharacters($seminaryId, $xps, $count)
{ {
$data = $this->db->query( $data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '. 'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '. 'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '.
'WHERE charactertypes.seminary_id = ? AND characters.xps > ? '. 'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'ORDER BY characters.xps ASC, RAND() '. 'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE charactertypes.seminary_id = ? AND cache_characters.xps > ? '.
'ORDER BY cache_characters.xps ASC, RAND() '.
'LIMIT ?', 'LIMIT ?',
'sidd', 'sidd',
'user', 'user',
@ -424,13 +459,18 @@
public function getInferiorCharacters($seminaryId, $characterId, $xps, $count) public function getInferiorCharacters($seminaryId, $characterId, $xps, $count)
{ {
return $this->db->query( return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel '.
'FROM characters '.
'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '. 'INNER JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '. 'INNER JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id AND characterroles.name = ? '.
'WHERE charactertypes.seminary_id = ? AND characters.xps <= ? AND characters.id <> ? '. 'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'ORDER BY characters.xps DESC, RAND() '. 'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE charactertypes.seminary_id = ? AND cache_characters.xps <= ? AND characters.id <> ? '.
'ORDER BY cache_characters.xps DESC, RAND() '.
'LIMIT ?', 'LIMIT ?',
'sidid', 'sidid',
'user', 'user',
@ -448,10 +488,16 @@
public function getCharactersSolvedQuest($questId) public function getCharactersSolvedQuest($questId)
{ {
return $data = $this->db->query( return $data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, quests_characters.created AS submission_created '. 'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'quests_characters.created AS submission_created '.
'FROM quests_characters '. 'FROM quests_characters '.
'INNER JOIN v_characters AS characters ON characters.id = quests_characters.character_id '. 'INNER JOIN characters ON characters.id = quests_characters.character_id '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE quests_characters.quest_id = ? AND quests_characters.status = ? AND NOT EXISTS ('. 'WHERE quests_characters.quest_id = ? AND quests_characters.status = ? AND NOT EXISTS ('.
'SELECT id '. 'SELECT id '.
'FROM quests_characters AS qc '. 'FROM quests_characters AS qc '.
@ -473,10 +519,16 @@
public function getCharactersUnsolvedQuest($questId) public function getCharactersUnsolvedQuest($questId)
{ {
return $data = $this->db->query( return $data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, quests_characters.created AS submission_created '. 'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'quests_characters.created AS submission_created '.
'FROM quests_characters '. 'FROM quests_characters '.
'INNER JOIN v_characters AS characters ON characters.id = quests_characters.character_id '. 'INNER JOIN characters ON characters.id = quests_characters.character_id '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE quests_characters.quest_id = ? AND quests_characters.status = ? AND NOT EXISTS ('. 'WHERE quests_characters.quest_id = ? AND quests_characters.status = ? AND NOT EXISTS ('.
'SELECT id '. 'SELECT id '.
'FROM quests_characters AS qc '. 'FROM quests_characters AS qc '.
@ -498,10 +550,16 @@
public function getCharactersSubmittedQuest($questId) public function getCharactersSubmittedQuest($questId)
{ {
return $data = $this->db->query( return $data = $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, quests_characters.created AS submission_created '. 'SELECT '.
'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps,cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'quests_characters.created AS submission_created '.
'FROM quests_characters '. 'FROM quests_characters '.
'INNER JOIN v_characters AS characters ON characters.id = quests_characters.character_id '. 'INNER JOIN characters ON characters.id = quests_characters.character_id '.
'INNER JOIN cache_characters ON cache_characters.character_id = characters.id '.
'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'INNER JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'INNER JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'WHERE quests_characters.quest_id = ? AND quests_characters.status = ? AND NOT EXISTS ('. 'WHERE quests_characters.quest_id = ? AND quests_characters.status = ? AND NOT EXISTS ('.
'SELECT id '. 'SELECT id '.
'FROM quests_characters AS qc '. 'FROM quests_characters AS qc '.
@ -543,9 +601,15 @@
public function getCharactersWithCharacterRole($seminaryId, $characterrole) public function getCharactersWithCharacterRole($seminaryId, $characterrole)
{ {
return $this->db->query( return $this->db->query(
'SELECT characters.id, characters.created, characters.charactertype_id, characters.name, characters.url, characters.user_id, characters.xps, characters.xplevel, characters.avatar_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, seminaries.id AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '. 'SELECT '.
'FROM v_characters AS characters '. 'characters.id, characters.created, characters.user_id, characters.name, characters.url, cache_characters.xps, cache_characters.quest_xps, cache_characters.avatar_id, '.
'charactertypes.id AS charactertype_id, charactertypes.name AS charactertype_name, charactertypes.url AS charactertype_url, '.
'xplevels.id AS xplevel_id, xplevels.level AS xplevel, '.
'seminaries.id AS seminary_id, seminaries.url AS seminary_url, seminaries.title AS seminary_title, seminaries.url AS seminary_url '.
'FROM characters '.
'LEFT JOIN cache_characters ON cache_characters.character_id = characters.id '.
'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '. 'LEFT JOIN charactertypes ON charactertypes.id = characters.charactertype_id '.
'LEFT JOIN xplevels ON xplevels.id = cache_characters.xplevel_id '.
'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '. 'LEFT JOIN seminaries ON seminaries.id = charactertypes.seminary_id '.
'LEFT JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '. 'LEFT JOIN characters_characterroles ON characters_characterroles.character_id = characters.id '.
'LEFT JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id '. 'LEFT JOIN characterroles ON characterroles.id = characters_characterroles.characterrole_id '.

63
models/XplevelsModel.inc Normal file
View file

@ -0,0 +1,63 @@
<?php
/**
* The Legend of Z
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
* @copyright 2014 Heinrich-Heine-Universität Düsseldorf
* @license http://www.gnu.org/licenses/gpl.html
* @link https://bitbucket.org/coderkun/the-legend-of-z
*/
namespace hhu\z\models;
/**
* Model for XP-levels.
*
* @author Oliver Hanraths <oliver.hanraths@uni-duesseldorf.de>
*/
class XplevelsModel extends \hhu\z\Model
{
/**
* Construct a new XplevelsModel.
*/
public function __construct()
{
parent::__construct();
}
/**
* Get XP-level by its ID.
*
* @throws IdNotFoundException
* @param int $xplevelId ID of XP-level
* @return array XP-level data
*/
public function getXPLevelById($xplevelId)
{
$data = $this->db->query(
'SELECT id, seminary_id, xps, level, name '.
'FROM xplevels '.
'WHERE id = ?',
'i',
$xplevelId
);
if(empty($data)) {
throw new \nre\exceptions\IdNotFoundException($xplevelId);
}
return $data[0];
}
}
?>