Use inner joins, format queries, improve performance see BT#12060

pull/2487/head
jmontoyaa 9 years ago
parent 218bcc96a4
commit f5331fe085
  1. 295
      main/inc/lib/AnnouncementManager.php

@ -90,14 +90,18 @@ class AnnouncementManager
$tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT); $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
$tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY); $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
$sql = "SELECT DISTINCT announcement.id, announcement.title, announcement.content $sql = "SELECT DISTINCT
FROM $tbl_announcement announcement, $tbl_item_property toolitemproperties announcement.id,
announcement.title,
announcement.content
FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property i
ON (announcement.id = i.ref AND announcement.c_id = i.c_id)
WHERE WHERE
announcement.id = toolitemproperties.ref AND i.tool='announcement' AND
toolitemproperties.tool='announcement' AND
announcement.session_id = '$session_id' AND announcement.session_id = '$session_id' AND
announcement.c_id = $course_id AND announcement.c_id = $course_id AND
toolitemproperties.c_id = $course_id i.c_id = $course_id
ORDER BY display_order DESC"; ORDER BY display_order DESC";
$rs = Database::query($sql); $rs = Database::query($sql);
$num_rows = Database::num_rows($rs); $num_rows = Database::num_rows($rs);
@ -198,15 +202,15 @@ class AnnouncementManager
if (api_is_allowed_to_edit(false, true) || if (api_is_allowed_to_edit(false, true) ||
(api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous()) (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())
) { ) {
$dql = "SELECT CA, IP $dql = "SELECT a, ip
FROM ChamiloCourseBundle:CAnnouncement CA, ChamiloCourseBundle:CItemProperty IP FROM ChamiloCourseBundle:CAnnouncement a
WHERE JOIN ChamiloCourseBundle:CItemProperty ip
CA.id = IP.ref AND WITH a.id = ip.ref AND a.cId = ip.course
CA.id = :announcement AND WHERE
IP.tool = 'announcement' AND a.id = :announcement AND
CA.cId = IP.course AND ip.tool = 'announcement' AND
CA.cId = :course a.cId = :course
ORDER BY CA.displayOrder DESC"; ORDER BY a.displayOrder DESC";
} else { } else {
$group_list = GroupManager::get_group_ids($courseId, api_get_user_id()); $group_list = GroupManager::get_group_ids($courseId, api_get_user_id());
@ -215,41 +219,42 @@ class AnnouncementManager
} }
if (api_get_user_id() != 0) { if (api_get_user_id() != 0) {
$dql = "SELECT CA, IP $dql = "SELECT a, ip
FROM ChamiloCourseBundle:CAnnouncement CA, ChamiloCourseBundle:CItemProperty IP FROM ChamiloCourseBundle:CAnnouncement a
WHERE JOIN ChamiloCourseBundle:CItemProperty ip
CA.id = IP.ref AND WITH a.id = ip.ref AND a.cId = ip.course
CA.id = :announcement AND WHERE
IP.tool='announcement' AND a.id = :announcement AND
( ip.tool='announcement' AND
IP.toUser = $userId OR (
IP.group IN ('0', '" . implode("', '", $group_list) . "') OR ip.toUser = $userId OR
IP.group IS NULL ip.group IN ('0', '" . implode("', '", $group_list) . "') OR
) AND ip.group IS NULL
IP.visibility = '1' AND ) AND
CA.cId = IP.course AND ip.visibility = '1' AND
IP.course = :course ip.course = :course
ORDER BY CA.displayOrder DESC"; ORDER BY a.displayOrder DESC";
} else { } else {
$dql = "SELECT CA, IP $dql = "SELECT a, ip
FROM ChamiloCourseBundle:CAnnouncement CA, ChamiloCourseBundle:CItemProperty IP FROM ChamiloCourseBundle:CAnnouncement a
WHERE JOIN ChamiloCourseBundle:CItemProperty ip
CA.id = IP.ref AND WITH a.id = ip.ref AND a.cId = ip.course
CA.id = :announcement AND WHERE
IP.tool = 'announcement' AND a.id = :announcement AND
(IP.group = '0' OR IP.group IS NULL) AND ip.tool = 'announcement' AND
IP.visibility = '1' AND (ip.group = '0' OR ip.group IS NULL) AND
CA.cId = IP.course AND ip.visibility = '1' AND
IP.course = :course"; ip.course = :course";
} }
} }
$result = Database::getManager() $qb = Database::getManager()->createQuery($dql);
->createQuery($dql) $result = $qb->execute(
->execute([ [
'announcement' => $announcementId, 'announcement' => $announcementId,
'course' => $courseId 'course' => $courseId,
]); ]
);
return [ return [
'announcement' => $result[0], 'announcement' => $result[0],
@ -573,7 +578,6 @@ class AnnouncementManager
} }
// Store in item_property (first the groups, then the users // Store in item_property (first the groups, then the users
if (!isset($to_users)) { if (!isset($to_users)) {
// when no user is selected we send it to everyone // when no user is selected we send it to everyone
$send_to = CourseManager::separateUsersGroups($to); $send_to = CourseManager::separateUsersGroups($to);
@ -736,7 +740,6 @@ class AnnouncementManager
{ {
$courseCode = api_get_course_id(); $courseCode = api_get_course_id();
$_course = api_get_course_info(); $_course = api_get_course_info();
$sessionList = SessionManager::get_session_by_course(api_get_course_int_id()); $sessionList = SessionManager::get_session_by_course(api_get_course_int_id());
if (!empty($sessionList)) { if (!empty($sessionList)) {
@ -803,18 +806,22 @@ class AnnouncementManager
$tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY); $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
if (!empty($user_id) && is_numeric($user_id)) { if (!empty($user_id) && is_numeric($user_id)) {
$user_id = (int) $user_id; $user_id = (int) $user_id;
$sql = "SELECT DISTINCT announcement.title, announcement.content, display_order $sql = "SELECT DISTINCT
FROM $tbl_announcement announcement, $tbl_item_property toolitemproperties announcement.title,
announcement.content,
display_order
FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
WHERE WHERE
announcement.c_id = $course_id AND announcement.c_id = $course_id AND
toolitemproperties.c_id = $course_id AND ip.c_id = $course_id AND
announcement.id = toolitemproperties.ref AND ip.tool='announcement' AND
toolitemproperties.tool='announcement' AND
( (
toolitemproperties.insert_user_id='$user_id' AND ip.insert_user_id='$user_id' AND
(toolitemproperties.to_group_id='0' OR toolitemproperties.to_group_id IS NULL) (ip.to_group_id='0' OR ip.to_group_id IS NULL)
) )
AND toolitemproperties.visibility='1' AND ip.visibility='1'
AND announcement.session_id = 0 AND announcement.session_id = 0
ORDER BY display_order DESC"; ORDER BY display_order DESC";
$rs = Database::query($sql); $rs = Database::query($sql);
@ -855,16 +862,20 @@ class AnnouncementManager
$tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT); $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
$tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY); $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
$sql = "SELECT DISTINCT announcement.id, announcement.title, announcement.content $sql = "SELECT DISTINCT
announcement.id,
announcement.title,
announcement.content
FROM $tbl_announcement announcement FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property toolitemproperties INNER JOIN $tbl_item_property ip
ON ON
announcement.id = toolitemproperties.ref AND announcement.id = ip.ref AND
announcement.c_id = $course_id AND announcement.c_id = ip.c_id
toolitemproperties.c_id = $course_id
WHERE WHERE
toolitemproperties.tool='announcement' AND announcement.c_id = $course_id AND
announcement.id = $annoucement_id"; ip.tool='announcement' AND
announcement.id = $annoucement_id
";
$result = Database::query($sql); $result = Database::query($sql);
if (Database::num_rows($result)) { if (Database::num_rows($result)) {
return Database::fetch_array($result); return Database::fetch_array($result);
@ -1090,7 +1101,8 @@ class AnnouncementManager
$announcementId = intval($announcementId); $announcementId = intval($announcementId);
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
$row = array(); $row = array();
$sql = 'SELECT id, path, filename, comment FROM ' . $tbl_announcement_attachment . ' $sql = 'SELECT id, path, filename, comment
FROM ' . $tbl_announcement_attachment . '
WHERE c_id = ' . $course_id . ' AND announcement_id = ' . $announcementId; WHERE c_id = ' . $course_id . ' AND announcement_id = ' . $announcementId;
$result = Database::query($sql); $result = Database::query($sql);
if (Database::num_rows($result) != 0) { if (Database::num_rows($result) != 0) {
@ -1193,7 +1205,11 @@ class AnnouncementManager
$safe_file_name = Database::escape_string($file_name); $safe_file_name = Database::escape_string($file_name);
$safe_new_file_name = Database::escape_string($new_file_name); $safe_new_file_name = Database::escape_string($new_file_name);
$id_attach = intval($id_attach); $id_attach = intval($id_attach);
$sql = "UPDATE $tbl_announcement_attachment SET filename = '$safe_file_name', comment = '$safe_file_comment', path = '$safe_new_file_name', size ='" . intval($file['size']) . "' $sql = "UPDATE $tbl_announcement_attachment SET
filename = '$safe_file_name',
comment = '$safe_file_comment',
path = '$safe_new_file_name',
size ='" . intval($file['size']) . "'
WHERE c_id = $course_id AND id = '$id_attach'"; WHERE c_id = $course_id AND id = '$id_attach'";
$result = Database::query($sql); $result = Database::query($sql);
if ($result === false) { if ($result === false) {
@ -1214,10 +1230,13 @@ class AnnouncementManager
*/ */
public static function delete_announcement_attachment_file($id) public static function delete_announcement_attachment_file($id)
{ {
$tbl_announcement_attachment = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT); $table = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT);
$id = intval($id); $id = intval($id);
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
$sql = "DELETE FROM $tbl_announcement_attachment if (empty($course_id) || empty($id)) {
return false;
}
$sql = "DELETE FROM $table
WHERE c_id = $course_id AND id = $id"; WHERE c_id = $course_id AND id = $id";
Database::query($sql); Database::query($sql);
@ -1305,11 +1324,12 @@ class AnnouncementManager
if (0) { if (0) {
if (is_array($group_memberships) && count($group_memberships) > 0) { if (is_array($group_memberships) && count($group_memberships) > 0) {
$sql = "SELECT $select $sql = "SELECT $select
FROM $tbl_announcement announcement, $tbl_item_property ip FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND ip.c_id = announcement.c_id)
WHERE WHERE
announcement.c_id = $course_id AND announcement.c_id = $course_id AND
ip.c_id = $course_id AND ip.c_id = $course_id AND
announcement.id = ip.ref AND
ip.tool = 'announcement' AND ip.tool = 'announcement' AND
( (
ip.to_user_id = $user_id OR ip.to_user_id = $user_id OR
@ -1322,11 +1342,12 @@ class AnnouncementManager
ORDER BY display_order DESC"; ORDER BY display_order DESC";
} else { } else {
$sql = "SELECT $select $sql = "SELECT $select
FROM $tbl_announcement announcement, $tbl_item_property ip FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND ip.c_id = announcement.c_id)
WHERE WHERE
announcement.c_id = $course_id AND announcement.c_id = $course_id AND
ip.c_id = $course_id AND ip.c_id = $course_id AND
announcement.id = ip.ref AND
ip.tool ='announcement' AND ip.tool ='announcement' AND
(ip.to_user_id = $user_id OR ip.to_group_id='0' OR ip.to_group_id IS NULL) AND (ip.to_user_id = $user_id OR ip.to_group_id='0' OR ip.to_group_id IS NULL) AND
ip.visibility IN ('1', '0') ip.visibility IN ('1', '0')
@ -1338,9 +1359,11 @@ class AnnouncementManager
// A.2. you are a course admin with a GROUP filter // A.2. you are a course admin with a GROUP filter
// => see only the messages of this specific group // => see only the messages of this specific group
$sql = "SELECT $select $sql = "SELECT $select
FROM $tbl_announcement announcement INNER JOIN $tbl_item_property ip FROM $tbl_announcement announcement
ON (announcement.id = ip.ref AND ip.tool='announcement') INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
WHERE WHERE
ip.tool='announcement' AND
announcement.c_id = $course_id AND announcement.c_id = $course_id AND
ip.c_id = $course_id AND ip.c_id = $course_id AND
ip.visibility<>'2' AND ip.visibility<>'2' AND
@ -1355,28 +1378,31 @@ class AnnouncementManager
// => see all the messages of all the users and groups without editing possibilities // => see all the messages of all the users and groups without editing possibilities
if (isset($isStudentView) && $isStudentView == "true") { if (isset($isStudentView) && $isStudentView == "true") {
$sql = "SELECT $select $sql = "SELECT $select
FROM $tbl_announcement announcement INNER JOIN $tbl_item_property ip FROM $tbl_announcement announcement
ON (announcement.id = ip.ref AND ip.tool='announcement') INNER JOIN $tbl_item_property ip
WHERE ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
announcement.c_id = $course_id AND WHERE
ip.c_id = $course_id AND ip.tool='announcement' AND
ip.tool='announcement' AND announcement.c_id = $course_id AND
ip.visibility='1' ip.c_id = $course_id AND
$condition_session ip.visibility='1'
$searchCondition $condition_session
ORDER BY display_order DESC"; $searchCondition
ORDER BY display_order DESC";
//GROUP BY ip.ref //GROUP BY ip.ref
} else { } else {
// A.3.a you are a course admin without user or group filter and WTIHOUT studentview (= the normal course admin view) // A.3.a you are a course admin without user or group filter and WTIHOUT studentview (= the normal course admin view)
// => see all the messages of all the users and groups with editing possibilities // => see all the messages of all the users and groups with editing possibilities
$sql = "SELECT $select $sql = "SELECT $select
FROM $tbl_announcement announcement INNER JOIN $tbl_item_property ip FROM $tbl_announcement announcement
ON (announcement.id = ip.ref AND ip.tool='announcement') INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
WHERE WHERE
ip.tool='announcement' AND
announcement.c_id = $course_id AND announcement.c_id = $course_id AND
ip.c_id = $course_id AND ip.c_id = $course_id AND
(ip.visibility='0' or ip.visibility='1') (ip.visibility='0' OR ip.visibility='1')
$condition_session $condition_session
$searchCondition $searchCondition
ORDER BY display_order DESC"; ORDER BY display_order DESC";
@ -1413,13 +1439,13 @@ class AnnouncementManager
} }
$sql = "SELECT $select $sql = "SELECT $select
FROM $tbl_announcement announcement, FROM $tbl_announcement announcement INNER JOIN
$tbl_item_property ip $tbl_item_property ip
ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
WHERE WHERE
announcement.c_id = $course_id AND announcement.c_id = $course_id AND
ip.c_id = $course_id AND ip.c_id = $course_id AND
announcement.id = ip.ref ip.tool='announcement'
AND ip.tool='announcement'
$cond_user_id $cond_user_id
$condition_session $condition_session
$searchCondition $searchCondition
@ -1437,11 +1463,12 @@ class AnnouncementManager
} }
$sql = "SELECT $select $sql = "SELECT $select
FROM $tbl_announcement announcement, $tbl_item_property ip FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
WHERE WHERE
announcement.c_id = $course_id AND announcement.c_id = $course_id AND
ip.c_id = $course_id AND ip.c_id = $course_id AND
announcement.id = ip.ref AND
ip.tool='announcement' ip.tool='announcement'
$cond_user_id $cond_user_id
$condition_session $condition_session
@ -1459,18 +1486,18 @@ class AnnouncementManager
} }
$sql = "SELECT $select $sql = "SELECT $select
FROM $tbl_announcement announcement, $tbl_item_property ip FROM $tbl_announcement announcement
WHERE INNER JOIN $tbl_item_property ip
announcement.c_id = $course_id AND ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
ip.c_id = $course_id AND WHERE
announcement.id = ip.ref AND announcement.c_id = $course_id AND
ip.tool='announcement' ip.c_id = $course_id AND
$cond_user_id ip.tool='announcement'
$condition_session $cond_user_id
$searchCondition $condition_session
AND $searchCondition AND
ip.visibility='1' AND ip.visibility='1' AND
announcement.session_id IN ( 0,".api_get_session_id().")"; announcement.session_id IN ( 0,".api_get_session_id().")";
} }
} }
} }
@ -1597,7 +1624,12 @@ class AnnouncementManager
$_course = api_get_course_info(); $_course = api_get_course_info();
$course_id = $_course['real_id']; $course_id = $_course['real_id'];
$userId = api_get_user_id(); $userId = api_get_user_id();
$condition_session = api_get_session_condition($session_id, true, true, 'announcement.session_id'); $condition_session = api_get_session_condition(
$session_id,
true,
true,
'announcement.session_id'
);
if (api_is_allowed_to_edit(false,true)) { if (api_is_allowed_to_edit(false,true)) {
// check teacher status // check teacher status
@ -1608,23 +1640,25 @@ class AnnouncementManager
} else { } else {
$group_condition = " AND (ip.to_group_id='".api_get_group_id()."' OR ip.to_group_id = 0 OR ip.to_group_id IS NULL)"; $group_condition = " AND (ip.to_group_id='".api_get_group_id()."' OR ip.to_group_id = 0 OR ip.to_group_id IS NULL)";
} }
$sql = "SELECT $sql = "SELECT
announcement.*, announcement.*,
ip.visibility, ip.visibility,
ip.to_group_id, ip.to_group_id,
ip.insert_user_id ip.insert_user_id
FROM $tbl_announcement announcement INNER JOIN $tbl_item_property ip FROM $tbl_announcement announcement
ON (announcement.c_id = ip.c_id AND announcement.id = ip.ref) INNER JOIN $tbl_item_property ip
WHERE ON (announcement.c_id = ip.c_id AND announcement.id = ip.ref)
announcement.c_id = $course_id AND WHERE
ip.c_id = $course_id AND announcement.c_id = $course_id AND
ip.tool = 'announcement' AND ip.c_id = $course_id AND
ip.visibility <> '2' ip.tool = 'announcement' AND
$group_condition ip.visibility <> '2'
$condition_session $group_condition
GROUP BY ip.ref $condition_session
ORDER BY display_order DESC GROUP BY ip.ref
LIMIT 0, $maximum"; ORDER BY display_order DESC
LIMIT 0, $maximum";
} }
} else { } else {
// students only get to see the visible announcements // students only get to see the visible announcements
@ -1632,7 +1666,6 @@ class AnnouncementManager
$group_memberships = GroupManager::get_group_ids($_course['real_id'], $userId); $group_memberships = GroupManager::get_group_ids($_course['real_id'], $userId);
if ((api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) { if ((api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())) {
if (api_get_group_id() == 0) { if (api_get_group_id() == 0) {
$cond_user_id = " AND ( $cond_user_id = " AND (
ip.lastedit_user_id = '".$userId."' OR ( ip.lastedit_user_id = '".$userId."' OR (
@ -1695,19 +1728,19 @@ class AnnouncementManager
$cond_user_id = " AND ( ip.to_user_id='".$userId."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL) "; $cond_user_id = " AND ( ip.to_user_id='".$userId."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL) ";
} }
$sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
FROM $tbl_announcement announcement FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip INNER JOIN $tbl_item_property ip
ON (announcement.c_id = ip.c_id AND announcement.id = ip.ref) ON (announcement.c_id = ip.c_id AND announcement.id = ip.ref)
WHERE WHERE
announcement.c_id = $course_id AND announcement.c_id = $course_id AND
ip.c_id = $course_id AND ip.c_id = $course_id AND
ip.tool='announcement' AND ip.tool='announcement' AND
ip.visibility='1' ip.visibility='1'
$cond_user_id $cond_user_id
$condition_session $condition_session
GROUP BY ip.ref GROUP BY ip.ref
ORDER BY display_order DESC ORDER BY display_order DESC
LIMIT 0, $maximum"; LIMIT 0, $maximum";
} else { } else {
if (api_get_course_setting('allow_user_edit_announcement')) { if (api_get_course_setting('allow_user_edit_announcement')) {

Loading…
Cancel
Save