From bb6832a4e92dd5513d1867cf028a917dc4acad33 Mon Sep 17 00:00:00 2001 From: Ivymaster Date: Tue, 15 Sep 2026 10:47:30 +0200 Subject: [PATCH] Reverted collision checker changes and removed unnecearry joins --- application/libraries/CollisionChecker.php | 4 +- .../checks/LectureCollisionCheck.php | 189 ++++++++------- .../checks/ResourcesCollisionCheck.php | 2 +- .../collision/checks/RoomCollisionCheck.php | 54 ++--- .../checks/StudentCollisionCheck.php | 195 ++++++--------- .../checks/VerbandCollisionCheck.php | 227 +++++++----------- 6 files changed, 286 insertions(+), 385 deletions(-) diff --git a/application/libraries/CollisionChecker.php b/application/libraries/CollisionChecker.php index fb7acc24a..9338745bc 100644 --- a/application/libraries/CollisionChecker.php +++ b/application/libraries/CollisionChecker.php @@ -18,12 +18,12 @@ class CollisionChecker $this->_ci->load->library('collision/checks/LectureCollisionCheck'); $this->_ci->load->library('collision/checks/VerbandCollisionCheck'); $this->_ci->load->library('collision/checks/StudentCollisionCheck'); - // $this->_ci->load->library('collision/checks/ResourcesCollisionCheck'); + $this->_ci->load->library('collision/checks/ResourcesCollisionCheck'); $this->register($this->_ci->roomcollisioncheck); $this->register($this->_ci->lecturecollisioncheck); $this->register($this->_ci->verbandcollisioncheck); $this->register($this->_ci->studentcollisioncheck); - // $this->register($this->_ci->resourcescollisioncheck); + $this->register($this->_ci->resourcescollisioncheck); Events::trigger('collision_register', $this); } diff --git a/application/libraries/collision/checks/LectureCollisionCheck.php b/application/libraries/collision/checks/LectureCollisionCheck.php index 50480c278..4cff6944c 100644 --- a/application/libraries/collision/checks/LectureCollisionCheck.php +++ b/application/libraries/collision/checks/LectureCollisionCheck.php @@ -50,111 +50,110 @@ class LectureCollisionCheck implements ICollisionCheck { if (empty($kalender_ids)) return []; - $kalender_ids = array_values(array_unique(array_map('intval', $kalender_ids))); - $postgres_array = '{' . implode(',', $kalender_ids) . '}'; - $kollisionsfreie_user = array_values(array_filter((array) unserialize(KOLLISIONSFREIE_USER))); - $excluded_user_condition = ''; - $params = [$postgres_array]; + $kollisionsfreie_user = unserialize(KOLLISIONSFREIE_USER); + $grouped = []; - if (!empty($kollisionsfreie_user)) + $this->_ci->KalenderModel->addSelect('DISTINCT ON (tbl_kalender.kalender_id) tbl_kalender.kalender_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit current_kalender_le', 'current_kalender_le.kalender_id = tbl_kalender.kalender_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter current_lehreinheit_ma', 'current_lehreinheit_ma.lehreinheit_id = current_kalender_le.lehreinheit_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter other_lehreinheithreinheit_ma', 'other_lehreinheithreinheit_ma.mitarbeiter_uid = current_lehreinheit_ma.mitarbeiter_uid'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit other_lehreinheit', 'other_lehreinheit.lehreinheit_id = other_lehreinheithreinheit_ma.lehreinheit_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit other_kalender_le', 'other_kalender_le.lehreinheit_id = other_lehreinheit.lehreinheit_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender other_kalender', 'other_kalender.kalender_id = other_kalender_le.kalender_id'); + + $this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false); + $this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false); + $this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false); + $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')); + $this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user); + + $this->_ci->KalenderModel->db->group_start(); + $where_ids_chunks = array_chunk($kalender_ids,25); + foreach($where_ids_chunks as $where_ids) { - $placeholders = implode(',', array_fill(0, count($kollisionsfreie_user), '?')); - $excluded_user_condition = "AND current_lecturer.mitarbeiter_uid NOT IN ($placeholders)"; - $params = array_merge($params, $kollisionsfreie_user); + $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids); + } + $this->_ci->KalenderModel->db->group_end(); + + $this->_ci->KalenderModel->db->where( + 'other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', + null, false + ); + $result = $this->_ci->KalenderModel->load(); + if (!isError($result) && hasData($result)) + { + foreach (getData($result) as $row) + { + $grouped[$row->kalender_id][] = true; + } } - $sql = " - WITH current_kalender AS MATERIALIZED ( - SELECT kalender_id, von, bis - FROM lehre.tbl_kalender - WHERE kalender_id = ANY(?::bigint[]) - ), - current_lecturer AS MATERIALIZED ( - SELECT - current_kalender.kalender_id, - current_kalender.von, - current_kalender.bis, - current_lehreinheit_ma.mitarbeiter_uid - FROM current_kalender - JOIN lehre.tbl_kalender_lehreinheit current_kalender_le - ON current_kalender_le.kalender_id = current_kalender.kalender_id - JOIN lehre.tbl_lehreinheit current_lehreinheit - ON current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id - JOIN lehre.tbl_lehreinheitmitarbeiter current_lehreinheit_ma - ON current_lehreinheit_ma.lehreinheit_id = current_lehreinheit.lehreinheit_id - ) - SELECT current_kalender.kalender_id - FROM current_kalender - WHERE EXISTS ( - SELECT 1 - FROM current_lecturer - WHERE current_lecturer.kalender_id = current_kalender.kalender_id - $excluded_user_condition - AND ( - EXISTS ( - SELECT 1 - FROM lehre.tbl_lehreinheitmitarbeiter other_lehreinheit_ma - JOIN lehre.tbl_lehreinheit other_lehreinheit - ON other_lehreinheit.lehreinheit_id = other_lehreinheit_ma.lehreinheit_id - JOIN lehre.tbl_kalender_lehreinheit other_kalender_le - ON other_kalender_le.lehreinheit_id = other_lehreinheit.lehreinheit_id - JOIN lehre.tbl_kalender other_kalender - ON other_kalender.kalender_id = other_kalender_le.kalender_id - WHERE other_lehreinheit_ma.mitarbeiter_uid = current_lecturer.mitarbeiter_uid - AND other_kalender.kalender_id != current_lecturer.kalender_id - AND other_kalender.von < current_lecturer.bis - AND other_kalender.bis > current_lecturer.von - AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') - AND NOT EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender nachfolger - WHERE nachfolger.vorgaenger_kalender_id = other_kalender.kalender_id - ) - ) - OR EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender_event_teilnehmer other_teilnehmer - JOIN lehre.tbl_kalender_event other_event - ON other_event.kalender_id = other_teilnehmer.kalender_id - JOIN lehre.tbl_kalender other_kalender - ON other_kalender.kalender_id = other_event.kalender_id - WHERE other_teilnehmer.uid = current_lecturer.mitarbeiter_uid - AND other_kalender.kalender_id != current_lecturer.kalender_id - AND other_kalender.von < current_lecturer.bis - AND other_kalender.bis > current_lecturer.von - AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') - AND NOT EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender nachfolger - WHERE nachfolger.vorgaenger_kalender_id = other_kalender.kalender_id - ) - ) - OR EXISTS ( - SELECT 1 - FROM campus.tbl_zeitsperre zeitsperre - LEFT JOIN lehre.tbl_stunde vonstunde_z - ON vonstunde_z.stunde = zeitsperre.vonstunde - LEFT JOIN lehre.tbl_stunde bisstunde_z - ON bisstunde_z.stunde = zeitsperre.bisstunde - WHERE zeitsperre.mitarbeiter_uid = current_lecturer.mitarbeiter_uid - AND zeitsperre.zeitsperretyp_kurzbz != 'ZVerfueg' - AND (zeitsperre.vondatum + COALESCE(vonstunde_z.beginn, '00:00'))::timestamp < current_lecturer.bis - AND (zeitsperre.bisdatum + COALESCE(bisstunde_z.ende, '23:59'))::timestamp > current_lecturer.von - ) - ) - )"; + $this->_ci->KalenderModel->addSelect('DISTINCT ON (tbl_kalender.kalender_id) tbl_kalender.kalender_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit current_kalender_le', 'current_kalender_le.kalender_id = tbl_kalender.kalender_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit current_lehreinheit', 'current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter current_lehreinheit_ma', 'current_lehreinheit_ma.lehreinheit_id = current_lehreinheit.lehreinheit_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event_teilnehmer other_t', 'other_t.uid = current_lehreinheit_ma.mitarbeiter_uid'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_event other_e', 'other_e.kalender_id = other_t.kalender_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender other_kalender', 'other_kalender.kalender_id = other_e.kalender_id'); + + $this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false); + $this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false); + $this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false); + $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', ['archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview']); + $this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user); + + $this->_ci->KalenderModel->db->group_start(); + $where_ids_chunks = array_chunk($kalender_ids,25); + foreach($where_ids_chunks as $where_ids) + { + $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids); + } + $this->_ci->KalenderModel->db->group_end(); + + $this->_ci->KalenderModel->db->where( + 'other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', + null, false + ); + $result = $this->_ci->KalenderModel->load(); + if (!isError($result) && hasData($result)) + { + foreach (getData($result) as $row) + { + $grouped[$row->kalender_id][] = true; + } + } + + $this->_ci->KalenderModel->addSelect('DISTINCT ON (tbl_kalender.kalender_id) tbl_kalender.kalender_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_lehreinheit current_kalender_le', 'current_kalender_le.kalender_id = tbl_kalender.kalender_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheit current_lehreinheit', 'current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_lehreinheitmitarbeiter current_lehreinheit_ma', 'current_lehreinheit_ma.lehreinheit_id = current_lehreinheit.lehreinheit_id'); + $this->_ci->KalenderModel->addJoin('campus.tbl_zeitsperre z', + "z.mitarbeiter_uid = current_lehreinheit_ma.mitarbeiter_uid + AND z.zeitsperretyp_kurzbz != 'ZVerfueg'"); + $this->_ci->KalenderModel->addJoin('lehre.tbl_stunde vonstunde_z', 'vonstunde_z.stunde = z.vonstunde', 'LEFT'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_stunde bisstunde_z', 'bisstunde_z.stunde = z.bisstunde', 'LEFT'); + + $this->_ci->KalenderModel->db->where('(z.vondatum + COALESCE(vonstunde_z.beginn, \'00:00\'))::timestamp < tbl_kalender.bis', null, false); + $this->_ci->KalenderModel->db->where('(z.bisdatum + COALESCE(bisstunde_z.ende, \'23:59\'))::timestamp > tbl_kalender.von', null, false); + $this->_ci->KalenderModel->db->where_not_in('current_lehreinheit_ma.mitarbeiter_uid', $kollisionsfreie_user); + $this->_ci->KalenderModel->db->group_start(); + $where_ids_chunks = array_chunk($kalender_ids,25); + foreach($where_ids_chunks as $where_ids) + { + $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids); + } + $this->_ci->KalenderModel->db->group_end(); + $result = $this->_ci->KalenderModel->load(); - $dbModel = new DB_Model(); - $result = $dbModel->execReadOnlyQuery($sql, $params); - $grouped = []; if (!isError($result) && hasData($result)) { foreach (getData($result) as $row) - $grouped[$row->kalender_id] = [true]; + { + $grouped[$row->kalender_id][] = true; + } } - log_message('error', 'LectureCollisionCheck::checkAll() 1'); return $grouped; } @@ -300,4 +299,4 @@ class LectureCollisionCheck implements ICollisionCheck }, getData($result)); } -} +} \ No newline at end of file diff --git a/application/libraries/collision/checks/ResourcesCollisionCheck.php b/application/libraries/collision/checks/ResourcesCollisionCheck.php index f5a351ca9..da163977e 100644 --- a/application/libraries/collision/checks/ResourcesCollisionCheck.php +++ b/application/libraries/collision/checks/ResourcesCollisionCheck.php @@ -88,7 +88,7 @@ class ResourcesCollisionCheck implements ICollisionCheck { $grouped[$row->kalender_id][] = true; } - log_message('error', 'ResourcesCollisionCheck::checkAll() 1'); + return $grouped; } } \ No newline at end of file diff --git a/application/libraries/collision/checks/RoomCollisionCheck.php b/application/libraries/collision/checks/RoomCollisionCheck.php index 2e5356014..6e25f3ef0 100644 --- a/application/libraries/collision/checks/RoomCollisionCheck.php +++ b/application/libraries/collision/checks/RoomCollisionCheck.php @@ -54,39 +54,29 @@ class RoomCollisionCheck implements ICollisionCheck { if (empty($kalender_ids)) return []; - $kalender_ids = array_values(array_unique(array_map('intval', $kalender_ids))); - $postgres_array = '{' . implode(',', $kalender_ids) . '}'; - $dbModel = new DB_Model(); - $sql = " - WITH current_kalender AS MATERIALIZED ( - SELECT kalender_id, von, bis - FROM lehre.tbl_kalender - WHERE kalender_id = ANY(?::bigint[]) - ) - SELECT current_kalender.kalender_id - FROM current_kalender - WHERE EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender_ort current_ort - JOIN lehre.tbl_kalender_ort other_ort - ON other_ort.ort_kurzbz = current_ort.ort_kurzbz - JOIN lehre.tbl_kalender other_kalender - ON other_kalender.kalender_id = other_ort.kalender_id - WHERE current_ort.kalender_id = current_kalender.kalender_id - AND other_kalender.kalender_id != current_kalender.kalender_id - AND other_kalender.von < current_kalender.bis - AND other_kalender.bis > current_kalender.von - AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') - AND NOT EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender nachfolger - WHERE nachfolger.vorgaenger_kalender_id = other_kalender.kalender_id - ) - )"; + $this->_ci->KalenderModel->addSelect('DISTINCT ON (tbl_kalender.kalender_id) tbl_kalender.kalender_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort current_ort', 'current_ort.kalender_id = tbl_kalender.kalender_id'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender_ort other_ort', 'other_ort.ort_kurzbz = current_ort.ort_kurzbz'); + $this->_ci->KalenderModel->addJoin('lehre.tbl_kalender other_kalender', 'other_kalender.kalender_id = other_ort.kalender_id'); + + $this->_ci->KalenderModel->db->where('other_kalender.kalender_id != tbl_kalender.kalender_id', null, false); + $this->_ci->KalenderModel->db->where('other_kalender.von < tbl_kalender.bis', null, false); + $this->_ci->KalenderModel->db->where('other_kalender.bis > tbl_kalender.von', null, false); + $this->_ci->KalenderModel->db->where_not_in('other_kalender.status_kurzbz', array('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview')); + + $this->_ci->KalenderModel->db->group_start(); + $where_ids_chunks = array_chunk($kalender_ids,25); + foreach($where_ids_chunks as $where_ids) + { + $this->_ci->KalenderModel->db->or_where_in('tbl_kalender.kalender_id', $where_ids); + } + $this->_ci->KalenderModel->db->group_end(); + + $this->_ci->KalenderModel->db->where('other_kalender.kalender_id NOT IN (SELECT vorgaenger_kalender_id FROM lehre.tbl_kalender WHERE vorgaenger_kalender_id IS NOT NULL)', null, false); + + $result = $this->_ci->KalenderModel->load(); - $result = $dbModel->execReadOnlyQuery($sql, [$postgres_array]); - log_message('error', 'RoomCollisionCheck::checkAll() 1'); if (isError($result) || !hasData($result)) return []; $grouped = []; @@ -97,4 +87,4 @@ class RoomCollisionCheck implements ICollisionCheck return $grouped; } -} +} \ No newline at end of file diff --git a/application/libraries/collision/checks/StudentCollisionCheck.php b/application/libraries/collision/checks/StudentCollisionCheck.php index 83ce72f04..bb9ce10db 100644 --- a/application/libraries/collision/checks/StudentCollisionCheck.php +++ b/application/libraries/collision/checks/StudentCollisionCheck.php @@ -190,134 +190,97 @@ class StudentCollisionCheck implements ICollisionCheck public function checkAll($kalender_ids) { + if (empty($kalender_ids)) return []; if ($this->_ci->variablelib->getVar('kollision_student') !== 'true') return []; - $kalender_ids = array_values(array_unique(array_map('intval', $kalender_ids))); - $postgres_array = '{' . implode(',', $kalender_ids) . '}'; $dbModel = new DB_Model(); + $placeholders = implode(',', array_fill(0, count($kalender_ids), '?')); + $sql = " - WITH current_kalender AS MATERIALIZED ( - SELECT kalender_id, von, bis - FROM lehre.tbl_kalender - WHERE kalender_id = ANY(?::bigint[]) - ) - SELECT current_kalender.kalender_id - FROM current_kalender - WHERE EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender_lehreinheit current_kalender_le - JOIN lehre.tbl_lehreinheit current_lehreinheit - ON current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id - JOIN lehre.tbl_lehreinheitgruppe current_lehreinheitgruppe - ON current_lehreinheitgruppe.lehreinheit_id = current_lehreinheit.lehreinheit_id - JOIN public.tbl_gruppe current_gruppe - ON current_gruppe.studiengang_kz = current_lehreinheitgruppe.studiengang_kz - AND current_gruppe.semester = current_lehreinheitgruppe.semester - AND current_gruppe.gruppe_kurzbz = current_lehreinheitgruppe.gruppe_kurzbz - JOIN public.tbl_benutzergruppe current_benutzergruppe - ON current_benutzergruppe.gruppe_kurzbz = current_gruppe.gruppe_kurzbz + SELECT DISTINCT current_kalender.kalender_id, current_benutzergruppe.uid + FROM lehre.tbl_kalender current_kalender + JOIN lehre.tbl_kalender_lehreinheit current_kalender_le ON current_kalender_le.kalender_id = current_kalender.kalender_id + JOIN lehre.tbl_lehreinheit current_lehreinheit ON current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id + JOIN lehre.tbl_lehreinheitgruppe current_lehreinheitgruppe ON current_lehreinheitgruppe.lehreinheit_id = current_lehreinheit.lehreinheit_id + JOIN public.tbl_gruppe current_gruppe + ON current_gruppe.studiengang_kz = current_lehreinheitgruppe.studiengang_kz + AND current_gruppe.semester = current_lehreinheitgruppe.semester + AND current_gruppe.gruppe_kurzbz = current_lehreinheitgruppe.gruppe_kurzbz + JOIN public.tbl_benutzergruppe current_benutzergruppe ON current_benutzergruppe.gruppe_kurzbz = current_gruppe.gruppe_kurzbz AND current_benutzergruppe.studiensemester_kurzbz = current_lehreinheit.studiensemester_kurzbz - WHERE current_kalender_le.kalender_id = current_kalender.kalender_id - AND EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender other_kalender - JOIN lehre.tbl_kalender_lehreinheit other_kalender_le - ON other_kalender_le.kalender_id = other_kalender.kalender_id - JOIN lehre.tbl_lehreinheit other_lehreinheit - ON other_lehreinheit.lehreinheit_id = other_kalender_le.lehreinheit_id - JOIN lehre.tbl_lehreinheitgruppe other_lehreinheitgruppe - ON other_lehreinheitgruppe.lehreinheit_id = other_lehreinheit.lehreinheit_id - JOIN public.tbl_gruppe other_gruppe - ON other_gruppe.studiengang_kz = other_lehreinheitgruppe.studiengang_kz - AND other_gruppe.semester = other_lehreinheitgruppe.semester - AND other_gruppe.gruppe_kurzbz = other_lehreinheitgruppe.gruppe_kurzbz - JOIN public.tbl_benutzergruppe other_benutzergruppe - ON other_benutzergruppe.gruppe_kurzbz = other_gruppe.gruppe_kurzbz - AND other_benutzergruppe.studiensemester_kurzbz = other_lehreinheit.studiensemester_kurzbz - AND other_benutzergruppe.uid = current_benutzergruppe.uid - WHERE other_kalender.kalender_id != current_kalender.kalender_id - AND other_kalender.von < current_kalender.bis - AND other_kalender.bis > current_kalender.von - AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') - AND NOT EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender nachfolger - WHERE nachfolger.vorgaenger_kalender_id = other_kalender.kalender_id - ) - ) - ) - OR EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender_lehreinheit current_kalender_le - JOIN lehre.tbl_lehreinheit current_lehreinheit - ON current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id - JOIN lehre.tbl_lehreinheitgruppe current_lehreinheitgruppe - ON current_lehreinheitgruppe.lehreinheit_id = current_lehreinheit.lehreinheit_id - JOIN public.tbl_studentlehrverband current_studentlehrverband - ON current_studentlehrverband.studiengang_kz = current_lehreinheitgruppe.studiengang_kz - AND current_studentlehrverband.semester = current_lehreinheitgruppe.semester - AND current_studentlehrverband.studiensemester_kurzbz = current_lehreinheit.studiensemester_kurzbz - AND ( - current_lehreinheitgruppe.verband = current_studentlehrverband.verband - OR current_lehreinheitgruppe.verband IS NULL - OR btrim(current_lehreinheitgruppe.verband::text) = '' - OR current_studentlehrverband.verband IS NULL - ) - AND ( - current_lehreinheitgruppe.gruppe = current_studentlehrverband.gruppe - OR current_lehreinheitgruppe.gruppe IS NULL - OR btrim(current_lehreinheitgruppe.gruppe::text) = '' - OR current_studentlehrverband.gruppe IS NULL - ) - WHERE current_kalender_le.kalender_id = current_kalender.kalender_id - AND EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender other_kalender - JOIN lehre.tbl_kalender_lehreinheit other_kalender_le - ON other_kalender_le.kalender_id = other_kalender.kalender_id - JOIN lehre.tbl_lehreinheit other_lehreinheit - ON other_lehreinheit.lehreinheit_id = other_kalender_le.lehreinheit_id - JOIN lehre.tbl_lehreinheitgruppe other_lehreinheitgruppe - ON other_lehreinheitgruppe.lehreinheit_id = other_lehreinheit.lehreinheit_id - JOIN public.tbl_studentlehrverband other_studentlehrverband - ON other_studentlehrverband.studiengang_kz = other_lehreinheitgruppe.studiengang_kz - AND other_studentlehrverband.semester = other_lehreinheitgruppe.semester - AND other_studentlehrverband.studiensemester_kurzbz = other_lehreinheit.studiensemester_kurzbz - AND other_studentlehrverband.student_uid = current_studentlehrverband.student_uid - AND ( - other_lehreinheitgruppe.verband = other_studentlehrverband.verband - OR other_lehreinheitgruppe.verband IS NULL - OR btrim(other_lehreinheitgruppe.verband::text) = '' - OR other_studentlehrverband.verband IS NULL - ) - AND ( - other_lehreinheitgruppe.gruppe = other_studentlehrverband.gruppe - OR other_lehreinheitgruppe.gruppe IS NULL - OR btrim(other_lehreinheitgruppe.gruppe::text) = '' - OR other_studentlehrverband.gruppe IS NULL - ) - WHERE other_kalender.kalender_id != current_kalender.kalender_id - AND other_kalender.von < current_kalender.bis - AND other_kalender.bis > current_kalender.von - AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') - AND NOT EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender nachfolger - WHERE nachfolger.vorgaenger_kalender_id = other_kalender.kalender_id - ) - ) - )"; + JOIN lehre.tbl_kalender other_kalender + ON other_kalender.kalender_id != current_kalender.kalender_id + AND other_kalender.von < current_kalender.bis + AND other_kalender.bis > current_kalender.von + AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') + AND NOT EXISTS ( + SELECT 1 FROM lehre.tbl_kalender vorgaenger + WHERE vorgaenger.vorgaenger_kalender_id = other_kalender.kalender_id + ) + JOIN lehre.tbl_kalender_lehreinheit other_kalender_le ON other_kalender_le.kalender_id = other_kalender.kalender_id + JOIN lehre.tbl_lehreinheit other_lehreinheit ON other_lehreinheit.lehreinheit_id = other_kalender_le.lehreinheit_id + JOIN lehre.tbl_lehreinheitgruppe other_lehreinheitgruppe ON other_lehreinheitgruppe.lehreinheit_id = other_lehreinheit.lehreinheit_id + JOIN public.tbl_gruppe other_gruppe + ON other_gruppe.studiengang_kz = other_lehreinheitgruppe.studiengang_kz + AND other_gruppe.semester = other_lehreinheitgruppe.semester + AND other_gruppe.gruppe_kurzbz = other_lehreinheitgruppe.gruppe_kurzbz + JOIN public.tbl_benutzergruppe other_benutzergruppe + ON other_benutzergruppe.gruppe_kurzbz = other_gruppe.gruppe_kurzbz + AND other_benutzergruppe.uid = current_benutzergruppe.uid + AND other_benutzergruppe.studiensemester_kurzbz = other_lehreinheit.studiensemester_kurzbz + + + WHERE current_kalender.kalender_id IN ($placeholders) + + UNION ALL + + SELECT DISTINCT current_kalender.kalender_id, current_studentlehrverband.student_uid AS uid + FROM lehre.tbl_kalender current_kalender + JOIN lehre.tbl_kalender_lehreinheit current_kalender_le ON current_kalender_le.kalender_id = current_kalender.kalender_id + JOIN lehre.tbl_lehreinheit current_lehreinheit ON current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id + JOIN lehre.tbl_lehreinheitgruppe current_lehreinheitgruppe ON current_lehreinheitgruppe.lehreinheit_id = current_lehreinheit.lehreinheit_id + JOIN public.tbl_studentlehrverband current_studentlehrverband + ON current_studentlehrverband.studiengang_kz = current_lehreinheitgruppe.studiengang_kz + AND current_studentlehrverband.semester = current_lehreinheitgruppe.semester + AND current_studentlehrverband.studiensemester_kurzbz = current_lehreinheit.studiensemester_kurzbz + AND (current_lehreinheitgruppe.verband = current_studentlehrverband.verband OR current_lehreinheitgruppe.verband IS NULL OR btrim(current_lehreinheitgruppe.verband::text) = '' OR current_studentlehrverband.verband IS NULL) + AND (current_lehreinheitgruppe.gruppe = current_studentlehrverband.gruppe OR current_lehreinheitgruppe.gruppe IS NULL OR btrim(current_lehreinheitgruppe.gruppe::text) = '' OR current_studentlehrverband.gruppe IS NULL) + + JOIN lehre.tbl_kalender other_kalender + ON other_kalender.kalender_id != current_kalender.kalender_id + AND other_kalender.von < current_kalender.bis + AND other_kalender.bis > current_kalender.von + AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') + AND NOT EXISTS ( + SELECT 1 FROM lehre.tbl_kalender vorgaenger + WHERE vorgaenger.vorgaenger_kalender_id = other_kalender.kalender_id + ) + JOIN lehre.tbl_kalender_lehreinheit other_kalender_le ON other_kalender_le.kalender_id = other_kalender.kalender_id + JOIN lehre.tbl_lehreinheit other_lehreinheit ON other_lehreinheit.lehreinheit_id = other_kalender_le.lehreinheit_id + JOIN lehre.tbl_lehreinheitgruppe other_lehreinheitgruppe ON other_lehreinheitgruppe.lehreinheit_id = other_lehreinheit.lehreinheit_id + JOIN public.tbl_studentlehrverband other_slv + ON other_slv.studiengang_kz = other_lehreinheitgruppe.studiengang_kz + AND other_slv.semester = other_lehreinheitgruppe.semester + AND other_slv.studiensemester_kurzbz = other_lehreinheit.studiensemester_kurzbz + AND other_slv.student_uid = current_studentlehrverband.student_uid + AND (other_lehreinheitgruppe.verband = other_slv.verband OR other_lehreinheitgruppe.verband IS NULL OR btrim(other_lehreinheitgruppe.verband::text) = '' OR other_slv.verband IS NULL) + AND (other_lehreinheitgruppe.gruppe = other_slv.gruppe OR other_lehreinheitgruppe.gruppe IS NULL OR btrim(other_lehreinheitgruppe.gruppe::text) = '' OR other_slv.gruppe IS NULL) + + WHERE current_kalender.kalender_id IN ($placeholders) + "; + + $result = $dbModel->execReadOnlyQuery($sql, array_merge($kalender_ids, $kalender_ids)); - $result = $dbModel->execReadOnlyQuery($sql, [$postgres_array]); if (isError($result) || !hasData($result)) return []; $grouped = []; foreach (getData($result) as $row) - $grouped[$row->kalender_id] = [true]; + { + $grouped[$row->kalender_id][] = true; + } - log_message('error', 'StudentCollisionCheck::checkAll() 1'); return $grouped; } -} +} \ No newline at end of file diff --git a/application/libraries/collision/checks/VerbandCollisionCheck.php b/application/libraries/collision/checks/VerbandCollisionCheck.php index 2d4e706ca..3bfb06337 100644 --- a/application/libraries/collision/checks/VerbandCollisionCheck.php +++ b/application/libraries/collision/checks/VerbandCollisionCheck.php @@ -308,155 +308,104 @@ class VerbandCollisionCheck implements ICollisionCheck { if (empty($kalender_ids)) return []; - $kalender_ids = array_values(array_unique(array_map('intval', $kalender_ids))); - $postgres_array = '{' . implode(',', $kalender_ids) . '}'; $dbModel = new DB_Model(); - $lehreinheit_group_match = $this->_buildGroupMatchCondition( - 'current_group_assignment', - 'other_lehreinheitgruppe', - 'current_group_assignment.direktinskription', - 'other_gruppe.direktinskription' - ); - $event_group_match = $this->_buildGroupMatchCondition( - 'current_group_assignment', - 'other_event_teilnehmer', - 'current_group_assignment.direktinskription', - 'other_gruppe.direktinskription' - ); + + $placeholders = implode(',', array_fill(0, count($kalender_ids), '?')); $sql = " - WITH current_kalender AS MATERIALIZED ( - SELECT kalender_id, von, bis - FROM lehre.tbl_kalender - WHERE kalender_id = ANY(?::bigint[]) - ), - current_group_assignment AS MATERIALIZED ( - SELECT - current_kalender.kalender_id, - current_lehreinheitgruppe.studiengang_kz, - current_lehreinheitgruppe.semester, - current_lehreinheitgruppe.verband, - current_lehreinheitgruppe.gruppe, - current_lehreinheitgruppe.gruppe_kurzbz, - current_gruppe.direktinskription - FROM current_kalender - JOIN lehre.tbl_kalender_lehreinheit current_kalender_le - ON current_kalender_le.kalender_id = current_kalender.kalender_id - JOIN lehre.tbl_lehreinheit current_lehreinheit - ON current_lehreinheit.lehreinheit_id = current_kalender_le.lehreinheit_id - JOIN lehre.tbl_lehreinheitgruppe current_lehreinheitgruppe - ON current_lehreinheitgruppe.lehreinheit_id = current_lehreinheit.lehreinheit_id - LEFT JOIN public.tbl_gruppe current_gruppe - ON current_gruppe.gruppe_kurzbz = current_lehreinheitgruppe.gruppe_kurzbz - - UNION ALL - - SELECT - current_kalender.kalender_id, - current_event_teilnehmer.studiengang_kz, - current_event_teilnehmer.semester, - current_event_teilnehmer.verband, - current_event_teilnehmer.gruppe, - current_event_teilnehmer.gruppe_kurzbz, - current_gruppe.direktinskription - FROM current_kalender - JOIN lehre.tbl_kalender_event_teilnehmer current_event_teilnehmer - ON current_event_teilnehmer.kalender_id = current_kalender.kalender_id - LEFT JOIN public.tbl_gruppe current_gruppe - ON current_gruppe.gruppe_kurzbz = current_event_teilnehmer.gruppe_kurzbz - ) - SELECT current_kalender.kalender_id - FROM current_kalender - WHERE EXISTS ( - SELECT 1 - FROM current_group_assignment - WHERE current_group_assignment.kalender_id = current_kalender.kalender_id - AND EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender other_kalender - WHERE other_kalender.kalender_id != current_kalender.kalender_id - AND other_kalender.von < current_kalender.bis - AND other_kalender.bis > current_kalender.von - AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') - AND NOT EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender nachfolger - WHERE nachfolger.vorgaenger_kalender_id = other_kalender.kalender_id - ) - AND ( - EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender_lehreinheit other_kalender_le - JOIN lehre.tbl_lehreinheit other_lehreinheit - ON other_lehreinheit.lehreinheit_id = other_kalender_le.lehreinheit_id - JOIN lehre.tbl_lehreinheitgruppe other_lehreinheitgruppe - ON other_lehreinheitgruppe.lehreinheit_id = other_lehreinheit.lehreinheit_id - LEFT JOIN public.tbl_gruppe other_gruppe - ON other_gruppe.gruppe_kurzbz = other_lehreinheitgruppe.gruppe_kurzbz - WHERE other_kalender_le.kalender_id = other_kalender.kalender_id - AND $lehreinheit_group_match - ) - OR EXISTS ( - SELECT 1 - FROM lehre.tbl_kalender_event_teilnehmer other_event_teilnehmer - LEFT JOIN public.tbl_gruppe other_gruppe - ON other_gruppe.gruppe_kurzbz = other_event_teilnehmer.gruppe_kurzbz - WHERE other_event_teilnehmer.kalender_id = other_kalender.kalender_id - AND $event_group_match - ) - ) + SELECT DISTINCT ON (current_kalender.kalender_id) current_kalender.kalender_id + FROM lehre.tbl_kalender current_kalender + + JOIN ( + SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe, + tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id + FROM lehre.tbl_kalender_lehreinheit + JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id + UNION + SELECT tbl_kalender_event_teilnehmer.studiengang_kz, tbl_kalender_event_teilnehmer.semester, tbl_kalender_event_teilnehmer.verband, tbl_kalender_event_teilnehmer.gruppe, + tbl_kalender_event_teilnehmer.gruppe_kurzbz, tbl_kalender_event_teilnehmer.kalender_id + FROM lehre.tbl_kalender_event_teilnehmer + ) current_lehreinheitguppe ON current_lehreinheitguppe.kalender_id = current_kalender.kalender_id + + LEFT JOIN public.tbl_gruppe current_gruppe + ON current_gruppe.gruppe_kurzbz = current_lehreinheitguppe.gruppe_kurzbz + + JOIN lehre.tbl_kalender other_kalender + ON other_kalender.kalender_id != current_kalender.kalender_id + AND other_kalender.von < current_kalender.bis + AND other_kalender.bis > current_kalender.von + + JOIN ( + SELECT tbl_lehreinheitgruppe.studiengang_kz, tbl_lehreinheitgruppe.semester, tbl_lehreinheitgruppe.verband, tbl_lehreinheitgruppe.gruppe, + tbl_lehreinheitgruppe.gruppe_kurzbz, tbl_kalender_lehreinheit.kalender_id + FROM lehre.tbl_kalender_lehreinheit + JOIN lehre.tbl_lehreinheitgruppe ON tbl_lehreinheitgruppe.lehreinheit_id = tbl_kalender_lehreinheit.lehreinheit_id + UNION + SELECT tbl_kalender_event_teilnehmer.studiengang_kz, tbl_kalender_event_teilnehmer.semester, tbl_kalender_event_teilnehmer.verband, tbl_kalender_event_teilnehmer.gruppe, + tbl_kalender_event_teilnehmer.gruppe_kurzbz, tbl_kalender_event_teilnehmer.kalender_id + FROM lehre.tbl_kalender_event_teilnehmer + ) other_lehreinheitguppe ON other_lehreinheitguppe.kalender_id = other_kalender.kalender_id + + LEFT JOIN public.tbl_gruppe other_gruppe + ON other_gruppe.gruppe_kurzbz = other_lehreinheitguppe.gruppe_kurzbz + + WHERE current_kalender.kalender_id IN ({$placeholders}) + AND other_kalender.status_kurzbz NOT IN ('archived', 'deleted', 'to_delete', 'to_delete_live', 'to_delete_preview') + AND current_lehreinheitguppe.studiengang_kz = other_lehreinheitguppe.studiengang_kz + AND current_lehreinheitguppe.semester = other_lehreinheitguppe.semester + AND ( + ( + current_lehreinheitguppe.gruppe_kurzbz IS NULL + AND other_lehreinheitguppe.gruppe_kurzbz IS NULL + AND ( + current_lehreinheitguppe.verband IS NULL + OR ( + current_lehreinheitguppe.verband = other_lehreinheitguppe.verband + AND (current_lehreinheitguppe.gruppe IS NULL OR other_lehreinheitguppe.gruppe IS NULL OR current_lehreinheitguppe.gruppe = other_lehreinheitguppe.gruppe) + ) ) - )"; + ) + OR + ( + current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL + AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL + AND current_gruppe.direktinskription IS NOT TRUE + AND other_gruppe.direktinskription IS NOT TRUE + ) + OR + ( + ( + current_lehreinheitguppe.gruppe_kurzbz IS NULL + AND other_lehreinheitguppe.gruppe_kurzbz IS NOT NULL + AND other_gruppe.direktinskription IS NOT TRUE + ) + OR + ( + current_lehreinheitguppe.gruppe_kurzbz IS NOT NULL + AND other_lehreinheitguppe.gruppe_kurzbz IS NULL + AND current_gruppe.direktinskription IS NOT TRUE + ) + ) + ) + AND other_kalender.kalender_id NOT IN ( + SELECT vorgaenger_kalender_id + FROM lehre.tbl_kalender + WHERE vorgaenger_kalender_id IS NOT NULL + ) + + "; + + $result = $dbModel->execReadOnlyQuery($sql, $kalender_ids); - $result = $dbModel->execReadOnlyQuery($sql, [$postgres_array]); if (isError($result) || !hasData($result)) return []; $grouped = []; foreach (getData($result) as $row) - $grouped[$row->kalender_id] = [true]; + { + $grouped[$row->kalender_id][] = true; + } - log_message('error', 'VerbandCollisionCheck::checkAll() 1'); return $grouped; } - private function _buildGroupMatchCondition($current_alias, $other_alias, $current_direct, $other_direct) - { - return " - $current_alias.studiengang_kz = $other_alias.studiengang_kz - AND $current_alias.semester = $other_alias.semester - AND ( - ( - $current_alias.gruppe_kurzbz IS NULL - AND $other_alias.gruppe_kurzbz IS NULL - AND ( - $current_alias.verband IS NULL - OR ( - $current_alias.verband = $other_alias.verband - AND ( - $current_alias.gruppe IS NULL - OR $other_alias.gruppe IS NULL - OR $current_alias.gruppe = $other_alias.gruppe - ) - ) - ) - ) - OR ( - $current_alias.gruppe_kurzbz IS NOT NULL - AND $other_alias.gruppe_kurzbz IS NOT NULL - AND $current_direct IS NOT TRUE - AND $other_direct IS NOT TRUE - ) - OR ( - $current_alias.gruppe_kurzbz IS NULL - AND $other_alias.gruppe_kurzbz IS NOT NULL - AND $other_direct IS NOT TRUE - ) - OR ( - $current_alias.gruppe_kurzbz IS NOT NULL - AND $other_alias.gruppe_kurzbz IS NULL - AND $current_direct IS NOT TRUE - ) - )"; - } - -} +} \ No newline at end of file