makes Stundenplan query BLAZINGLY fast

This commit is contained in:
SimonGschnell
2024-10-10 20:59:55 +02:00
parent d2ed82cb37
commit 5359539a09
3 changed files with 86 additions and 55 deletions
@@ -109,14 +109,8 @@ class Stundenplan extends FHCAPI_Controller
*/
public function getStundenplan(){
// Query fuer Studenten prototyp ok
// Query fuer Studenten MVP
//TODO: getStundenplan fuer Mitarbeiter anpassen
//TODO: viele edge cases die es nicht moeglich machen besseren tbl_stundenplan index zu verwenden als idx_stundenplan_datum
// include Student model to fetch Studiengang_kz and Semester
$this->load->model('crm/Student_model', 'StudentModel');
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
// form validation
$this->load->library('form_validation');
@@ -130,14 +124,81 @@ class Stundenplan extends FHCAPI_Controller
$start_date = $this->input->get('start_date', TRUE);
$end_date = $this->input->get('end_date', TRUE);
// get Student_uid / Studiengang_kz / Semester in order to use index idx_stundenplan_datum_stgsem
$student_uid = get_uid();
$student_data = $this->StudentModel->load([$student_uid]);
$student_data = getData($student_data)[0];
$this->addMeta('studg',$student_data->studiengang_kz);
$this->addMeta('sem', $student_data->semester);
$student_uid = getAuthUID();
if(is_null($student_uid))
{
$this->terminateWithError("No UID");
}
$stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getStundenplanQuery(get_uid(),$start_date,$end_date,$student_data->studiengang_kz,$student_data->semester));
//semester des Studenten ermitteln
$lvplan_load_ueber_semesterhaelfte = false;
if (defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE === true)
$lvplan_load_ueber_semesterhaelfte = true;
else
$lvplan_load_ueber_semesterhaelfte = false;
$this->load->model('organisation/Studiensemester_model','StudiensemesterModel');
$aktuelle_studiensemester = current(getData($this->StudiensemesterModel->getAkt()))->studiensemester_kurzbz;
if($lvplan_load_ueber_semesterhaelfte)
{
$next_studiensemester = current(getData($this->StudiensemesterModel->getNext()))->studiensemester_kurzbz;
$previous_studiensemester = current(getData($this->StudiensemesterModel->getPreviousFrom($aktuelle_studiensemester)))->studiensemester_kurzbz;
}
else
{
$nearest_studiensemester = current(getData($this->StudiensemesterModel->getNearestFrom($aktuelle_studiensemester)))->studiensemester_kurzbz;
}
// getting the gruppen_kurzbz of the student in the different studiensemester
$this->load->model('person/Benutzergruppe_model','BenutzergruppeModel');
$benutzer_gruppen = null;
if ($lvplan_load_ueber_semesterhaelfte)
{
$benutzer_gruppen = $this->BenutzergruppeModel->execReadOnlyQuery("
SELECT * FROM tbl_benutzergruppe where uid = ? AND studiensemester_kurzbz IN ?",[$student_uid, [$aktuelle_studiensemester, $next_studiensemester, $previous_studiensemester]]);
$benutzer_gruppen = array_map(function($item){ return "'".$item->gruppe_kurzbz. "'";},getData($benutzer_gruppen));
}
else
{
$benutzer_gruppen = $this->BenutzergruppeModel->execReadOnlyQuery("
SELECT * FROM tbl_benutzergruppe where uid = ? AND studiensemester_kurzbz IN ?", [$student_uid, [$aktuelle_studiensemester,$nearest_studiensemester]]);
$benutzer_gruppen = array_map(function ($item) { return "'".$item->gruppe_kurzbz. "'";}, getData($benutzer_gruppen));
}
// getting the student_lehrverbaende of the student in the different studiensemester
$this->load->model('education/Studentlehrverband_model', 'StudentlehrverbandModel');
$student_lehrverbaende = null;
if ($lvplan_load_ueber_semesterhaelfte) {
$student_lehrverbaende = $this->BenutzergruppeModel->execReadOnlyQuery("
SELECT * FROM tbl_studentlehrverband where student_uid = ? AND studiensemester_kurzbz IN ?", [$student_uid, [$aktuelle_studiensemester,$next_studiensemester, $previous_studiensemester]]);
$student_lehrverbaende = array_map(
function ($item)
{
$result = new stdClass();
$result->studiengang_kz = $item->studiengang_kz;
$result->semester = $item->semester;
$result->verband = $item->verband;
$result->gruppe = $item->gruppe;
return $result;
},
getData($student_lehrverbaende));
} else {
$student_lehrverbaende = $this->BenutzergruppeModel->execReadOnlyQuery("
SELECT * FROM tbl_studentlehrverband where student_uid = ? AND studiensemester_kurzbz IN ?", [$student_uid, [$aktuelle_studiensemester,$nearest_studiensemester]]);
$student_lehrverbaende = array_map(
function ($item) {
$result = new stdClass();
$result->studiengang_kz = $item->studiengang_kz;
$result->semester = $item->semester;
$result->verband = $item->verband;
$result->gruppe = $item->gruppe;
return $result;
},
getData($student_lehrverbaende)
);
}
$stundenplan_data = $this->StundenplanModel->stundenplanGruppierung($this->StundenplanModel->getStundenplanQuery($start_date, $end_date, $benutzer_gruppen, $student_lehrverbaende));
$stundenplan_data = $this->getDataOrTerminateWithError($stundenplan_data) ?? [];
$this->expand_object_information($stundenplan_data);
@@ -192,52 +192,22 @@ class Stundenplan_model extends DB_Model
*
* @return string
*/
public function getStundenplanQuery($uid, $start_date, $end_date,$studiengang_kz,$semester){
public function getStundenplanQuery($start_date, $end_date,$gruppen,$studentlehrverbaende){
$studiensemester = null;
$check_with_start_date = $this->execReadOnlyQuery("SELECT * FROM public.tbl_studiensemester WHERE " . $this->escape($start_date) . " BETWEEN start AND ende ;");
$check_with_start_date = getData($check_with_start_date);
if (count($check_with_start_date)>0)
{
$studiensemester = current($check_with_start_date)->studiensemester_kurzbz;
}
else
{
$check_with_end_date = $this->execReadOnlyQuery("SELECT * FROM public.tbl_studiensemester WHERE " . $this->escape($end_date) . " BETWEEN start AND ende ;");
$check_with_end_date = getData($check_with_end_date);
if (count($check_with_start_date) > 0)
{
$studiensemester = current($check_with_end_date)->studiensemester_kurzbz;
}
}
if(!is_null($studiensemester))
{
$semester_with_studiensemester = $this->execReadOnlyQuery("SELECT * FROM public.tbl_studentlehrverband WHERE student_uid = " . $this->escape($uid) . " AND studiensemester_kurzbz = " . $this->escape($studiensemester));
$semester_with_studiensemester = getData($semester_with_studiensemester);
$semester_with_studiensemester = current($semester_with_studiensemester)->semester;
return
$query =
"select sp.*
from lehre.vw_stundenplan sp
left join public.tbl_benutzergruppe bg ON sp.gruppe_kurzbz=bg.gruppe_kurzbz AND bg.uid =".$this->escape($uid)."
left join public.tbl_studiensemester ss1 ON bg.studiensemester_kurzbz=ss1.studiensemester_kurzbz AND ss1.start <=sp.datum AND ss1.ende>= sp.datum
left join public.tbl_studentlehrverband slv ON sp.studiengang_kz=slv.studiengang_kz and slv.student_uid=".$this->escape($uid)." and (slv.semester=sp.semester OR sp.semester IS NULL) AND (slv.verband=sp.verband OR sp.verband IS NULL OR sp.verband='' OR sp.verband='0') AND
(slv.gruppe=sp.gruppe OR sp.gruppe IS NULL OR sp.gruppe='' OR sp.gruppe='0') AND sp.gruppe_kurzbz IS NULL
left join public.tbl_studiensemester ss2 ON slv.studiensemester_kurzbz=ss2.studiensemester_kurzbz AND ss2.start<=sp.datum and ss2.ende >= sp.datum
WHERE
WHERE
sp.datum >= ".$this->escape($start_date)."
AND sp.datum <= ".$this->escape($end_date)."
AND sp.studiengang_kz = ".$this->escape($studiengang_kz)."
AND sp.semester = ".$this->escape($semester_with_studiensemester)."
AND (ss1.studiensemester_kurzbz IS NOT NULL or ss2.studiensemester_kurzbz IS NOT NULL)";
AND (
sp.gruppe_kurzbz IN (".implode(',',$gruppen).")";
foreach($studentlehrverbaende as $lehrverband){
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe).")";
}
$query .= ")";
}
else
{
return error("studiensemester could not be retrieved with the student_uid: ".$uid);
}
return $query;
}
/**
+1 -1
View File
@@ -97,7 +97,7 @@ export default {
template: `
<div class="fhc-calendar-week-page">
<div class="d-flex flex-column border-top">
<div class="d-flex flex-column">
<div class="fhc-calendar-week-page-header d-grid border-2 border-bottom text-center" :style="{'z-index':2,'grid-template-columns': 'repeat(' + days.length + ', 1fr)', 'grid-template-rows':1}" style="position:sticky; top:0; " >
<div type="button" v-for="day in days" :key="day" class="flex-grow-1" :title="day.toLocaleString(undefined, {dateStyle:'short'})" @click.prevent="changeToMonth(day)">
<div class="fw-bold">{{day.toLocaleString(undefined, {weekday: size < 2 ? 'narrow' : (size < 3 ? 'short' : 'long')})}}</div>