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

Loading…
Cancel
Save