Reverted collision checker changes and removed unnecearry joins

This commit is contained in:
Ivymaster
2026-09-15 10:47:30 +02:00
parent c28ad0e782
commit bb6832a4e9
6 changed files with 286 additions and 385 deletions
+2 -2
View File
@@ -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);
}
@@ -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));
}
}
}
@@ -88,7 +88,7 @@ class ResourcesCollisionCheck implements ICollisionCheck
{
$grouped[$row->kalender_id][] = true;
}
log_message('error', 'ResourcesCollisionCheck::checkAll() 1');
return $grouped;
}
}
@@ -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;
}
}
}
@@ -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;
}
}
}
@@ -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
)
)";
}
}
}