Social: Optimize queries to make personal wall faster (+fix issue with send_date) - refs BT#16059

pull/3023/head
Yannick Warnier 6 years ago
parent 35aaaf4a16
commit f45f20a853
  1. 151
      main/inc/lib/social.lib.php

@ -1640,13 +1640,12 @@ class SocialManager extends UserManager
"; ";
if ($getCount) { if ($getCount) {
$select = ' SELECT count(id) count '; $select = ' SELECT count(id) as count_items ';
} }
$sql = "$select $sqlBase = "$select FROM $tblMessage m WHERE ";
FROM $tblMessage m $sql = [];
WHERE $sql[1] = $sqlBase."msg_status <> ".MESSAGE_STATUS_WALL_DELETE.' AND ';
msg_status <> ".MESSAGE_STATUS_WALL_DELETE.' AND ';
// Get my own posts // Get my own posts
$userReceiverCondition = ' ( $userReceiverCondition = ' (
@ -1655,22 +1654,25 @@ class SocialManager extends UserManager
parent_id = '.$parentId.' parent_id = '.$parentId.'
)'; )';
$sql .= $userReceiverCondition; $sql[1] .= $userReceiverCondition;
$sql .= ' OR ( msg_status = '.MESSAGE_STATUS_PROMOTED.' ) '; $sql[2] = $sqlBase.' msg_status = '.MESSAGE_STATUS_PROMOTED.' ';
// Get my group posts // Get my group posts
$groupCondition = ''; $groupCondition = '';
if (!empty($groupId)) { if (!empty($groupId)) {
if (is_array($groupId)) { if (is_array($groupId)) {
$groupId = array_map('intval', $groupId); $groupId = array_map('intval', $groupId);
$groupId = implode("','", $groupId); $groupId = implode(",", $groupId);
$groupCondition = " OR ( group_id IN ('$groupId') "; $groupCondition = " ( group_id IN ($groupId) ";
} else { } else {
$groupId = (int) $groupId; $groupId = (int) $groupId;
$groupCondition = " OR ( group_id = '$groupId' "; $groupCondition = " ( group_id = $groupId ";
} }
$groupCondition .= ' AND msg_status IN ('.MESSAGE_STATUS_NEW.', '.MESSAGE_STATUS_UNREAD.')) '; $groupCondition .= ' AND (msg_status = '.MESSAGE_STATUS_NEW.' OR msg_status = '.MESSAGE_STATUS_UNREAD.')) ';
}
if (!empty($groupCondition)) {
$sql[3] = $sqlBase.$groupCondition;
} }
// Get my friend posts // Get my friend posts
@ -1678,17 +1680,16 @@ class SocialManager extends UserManager
if (!empty($friendId)) { if (!empty($friendId)) {
if (is_array($friendId)) { if (is_array($friendId)) {
$friendId = array_map('intval', $friendId); $friendId = array_map('intval', $friendId);
$friendId = implode("','", $friendId); $friendId = implode(",", $friendId);
$friendCondition = " OR ( user_receiver_id IN ('$friendId') "; $friendCondition = " ( user_receiver_id IN ($friendId) ";
} else { } else {
$friendId = (int) $friendId; $friendId = (int) $friendId;
$friendCondition = " OR ( user_receiver_id = '$friendId' "; $friendCondition = " ( user_receiver_id = $friendId ";
} }
$friendCondition .= ' AND msg_status = '.MESSAGE_STATUS_WALL_POST.' AND parent_id = 0) '; $friendCondition .= ' AND msg_status = '.MESSAGE_STATUS_WALL_POST.' AND parent_id = 0) ';
} }
if (!empty($friendCondition)) {
if (!empty($groupCondition) || !empty($friendCondition)) { $sql[4] = $sqlBase.$friendCondition;
$sql .= " $groupCondition $friendCondition ";
} }
if (!empty($threadList)) { if (!empty($threadList)) {
@ -1713,76 +1714,90 @@ class SocialManager extends UserManager
$threadList = array_map('intval', $threadList); $threadList = array_map('intval', $threadList);
$threadList = implode("','", $threadList); $threadList = implode("','", $threadList);
$condition = " thread_id IN ('$threadList') "; $condition = " thread_id IN ('$threadList') ";
$sql .= " $sql[5] = "$select
UNION (
$select
FROM c_forum_post FROM c_forum_post
WHERE $condition WHERE $condition
)
"; ";
} }
if ($getCount) { if ($getCount) {
$res = Database::query($sql); $count = 0;
$row = Database::fetch_array($res); foreach ($sql as $oneQuery) {
if (!empty($oneQuery)) {
return (int) $row['count']; $res = Database::query($oneQuery);
$row = Database::fetch_array($res);
$count += (int) $row['count_items'];
}
}
return $count;
} }
$sql .= ' ORDER BY send_date DESC '; $sqlOrder = ' ORDER BY send_date DESC ';
$sql .= " LIMIT $start, $length "; $sqlLimit = " LIMIT $start, $length ";
$messages = []; $messages = [];
$res = Database::query($sql); foreach ($sql as $index => $oneQuery) {
$em = Database::getManager(); if ($index === 5) {
if (Database::num_rows($res) > 0) { // Exception only for the forum query above (field name change)
$repo = $em->getRepository('ChamiloCourseBundle:CForumPost'); $oneQuery .= ' ORDER BY post_date DESC '.$sqlLimit;
$repoThread = $em->getRepository('ChamiloCourseBundle:CForumThread'); } else {
$groups = []; $oneQuery .= $sqlOrder.$sqlLimit;
$userGroup = new UserGroup(); }
$urlGroup = api_get_path(WEB_CODE_PATH).'social/group_view.php?id='; $res = Database::query($oneQuery);
while ($row = Database::fetch_array($res, 'ASSOC')) { $em = Database::getManager();
$row['group_info'] = []; if (Database::num_rows($res) > 0) {
if (!empty($row['group_id'])) { $repo = $em->getRepository('ChamiloCourseBundle:CForumPost');
if (!in_array($row['group_id'], $groups)) { $repoThread = $em->getRepository('ChamiloCourseBundle:CForumThread');
$group = $userGroup->get($row['group_id']); $groups = [];
$group['url'] = $urlGroup.$group['id']; $userGroup = new UserGroup();
$groups[$row['group_id']] = $group; $urlGroup = api_get_path(WEB_CODE_PATH).'social/group_view.php?id=';
$row['group_info'] = $group; while ($row = Database::fetch_array($res, 'ASSOC')) {
} else { $row['group_info'] = [];
$row['group_info'] = $groups[$row['group_id']]; if (!empty($row['group_id'])) {
if (!in_array($row['group_id'], $groups)) {
$group = $userGroup->get($row['group_id']);
$group['url'] = $urlGroup.$group['id'];
$groups[$row['group_id']] = $group;
$row['group_info'] = $group;
} else {
$row['group_info'] = $groups[$row['group_id']];
}
} }
}
// Forums // Forums
$row['post_title'] = ''; $row['post_title'] = '';
$row['forum_title'] = ''; $row['forum_title'] = '';
$row['thread_url'] = ''; $row['thread_url'] = '';
if ($row['msg_status'] == MESSAGE_STATUS_FORUM) { if ($row['msg_status'] == MESSAGE_STATUS_FORUM) {
/** @var CForumPost $post */ /** @var CForumPost $post */
$post = $repo->find($row['id']); $post = $repo->find($row['id']);
/** @var CForumThread $thread */ /** @var CForumThread $thread */
$thread = $repoThread->find($row['thread_id']); $thread = $repoThread->find($row['thread_id']);
if ($post && $thread) { if ($post && $thread) {
$courseInfo = api_get_course_info_by_id($post->getCId()); $courseInfo = api_get_course_info_by_id($post->getCId());
$row['post_title'] = $post->getForumId(); $row['post_title'] = $post->getForumId();
$row['forum_title'] = $thread->getThreadTitle(); $row['forum_title'] = $thread->getThreadTitle();
$row['thread_url'] = api_get_path(WEB_CODE_PATH).'forum/viewthread.php?'.http_build_query([ $row['thread_url'] = api_get_path(WEB_CODE_PATH).'forum/viewthread.php?'.http_build_query([
'cidReq' => $courseInfo['code'], 'cidReq' => $courseInfo['code'],
'forum' => $post->getForumId(), 'forum' => $post->getForumId(),
'thread' => $post->getThreadId(), 'thread' => $post->getThreadId(),
'post_id' => $post->getIid(), 'post_id' => $post->getIid(),
]).'#post_id_'.$post->getIid(); ]).'#post_id_'.$post->getIid();
}
} }
}
$messages[] = $row; $messages[$row['id']] = $row;
}
} }
} }
// Reordering messages by ID (reverse order) is enough to have the
// latest first, as there is currently no option to edit messages
// afterwards
krsort($messages);
return $messages; return $messages;
} }
/** /**
* Gets all messages from someone's wall (within specific limits), formatted. * Gets all messages from someone's wall (within specific limits), formatted.
* *

Loading…
Cancel
Save