Merge branch 'feature-35411/Studstatus_Query_Performance'

This commit is contained in:
Harald Bamberger
2024-01-08 17:42:20 +01:00
4 changed files with 86 additions and 45 deletions
@@ -33,46 +33,14 @@ class Leitung extends FHC_Controller
public function getActiveStgs()
{
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe');
$stgsNeuanlage = $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag');
$stgs = [];
if ($studiengaenge) {
$result = $this->StudierendenantragModel->loadForStudiengaenge($studiengaenge);
if (isError($result))
return $this->outputJson($result);
$antraege = getData($result) ?: [];
foreach ($antraege as $antrag) {
if (!isset($stgs[$antrag->studiengang_kz])) {
$stgs[$antrag->studiengang_kz] = new stdClass();
$stgs[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung;
$stgs[$antrag->studiengang_kz]->orgform = $antrag->orgform;
$stgs[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz;
}
}
$studiengaenge = $this->permissionlib->getSTG_isEntitledFor('student/antragfreigabe') ?: [];
$studiengaenge = array_merge($studiengaenge, $this->permissionlib->getSTG_isEntitledFor('student/studierendenantrag') ?: []);
$result = $this->StudierendenantragModel->loadStgsWithAntraege($studiengaenge);
if (isError($result)) {
$this->output->set_status_header(REST_Controller::HTTP_INTERNAL_SERVER_ERROR);
}
if ($stgsNeuanlage) {
$result = $this->StudierendenantragModel->loadForStudiengaenge($stgsNeuanlage);
if (isError($result))
return $this->outputJson($result);
$antraege = getData($result) ?: [];
foreach ($antraege as $antrag) {
if (!isset($stgs[$antrag->studiengang_kz])) {
$stgs[$antrag->studiengang_kz] = new stdClass();
$stgs[$antrag->studiengang_kz]->bezeichnung = $antrag->bezeichnung;
$stgs[$antrag->studiengang_kz]->orgform = $antrag->orgform;
$stgs[$antrag->studiengang_kz]->studiengang_kz = $antrag->studiengang_kz;
}
}
}
$this->outputJsonSuccess($stgs);
$this->outputJson($result);
}
public function getAntraege($studiengang = null, $extra = null)
@@ -74,7 +74,8 @@ class Studierendenantrag_model extends DB_Model
return $this->loadWhere($where);
}
public function loadActiveForStudiengaenge($studiengaenge) {
public function loadActiveForStudiengaenge($studiengaenge)
{
// NOTE(chris): get language before changing things in the global db object because getUserLanguage() might use it and it should not have been tampered with
$sql = "SELECT index FROM public.tbl_sprache WHERE sprache='" . getUserLanguage() . "' LIMIT 1";
@@ -94,6 +95,22 @@ class Studierendenantrag_model extends DB_Model
return $this->loadForStudiengaenge($studiengaenge, null, null, $sql);
}
public function loadStgsWithAntraege($studiengaenge)
{
$this->addDistinct();
$this->addSelect('UPPER(stg.typ) || UPPER(stg.kurzbz) || \' \' || stg.bezeichnung AS bezeichnung');
$this->addSelect('p.studiengang_kz');
$this->addJoin('public.tbl_prestudent p', 'prestudent_id');
$this->addJoin('public.tbl_studiengang stg', 'p.studiengang_kz=stg.studiengang_kz');
$this->addOrder('UPPER(stg.typ) || UPPER(stg.kurzbz) || \' \' || stg.bezeichnung');
$this->db->where_in('p.studiengang_kz', $studiengaenge);
return $this->load();
}
public function isInStudiengang($studierendenantrag_id, $studiengaenge)
{
$this->addJoin('public.tbl_prestudent', 'prestudent_id');
@@ -44,7 +44,7 @@ export default {
FHC_JS_DATA_STORAGE_OBJECT.ci_router +
'/components/Antrag/Leitung/getActiveStgs'
).then(result => {
this.stgs = Object.values(result.data.retval).sort((a,b) => a.bezeichnung == b.bezeichnung ? (a.orgform == b.orgform ? 0 : (a.orgform > b.orgform ? 1 : -1)) : (a.bezeichnung > b.bezeichnung ? 1 : -1));
this.stgs = result.data.retval;
}).catch(error => {
console.error(error);
});
@@ -170,9 +170,12 @@ if($result = @$db->db_query("SELECT 1 FROM system.tbl_berechtigung WHERE berecht
}
}
if (!$result = @$db->db_query("SELECT campus.get_status_studierendenantrag(0)")) {
if (!$result = @$db->db_query("SELECT campus.get_status_studierendenantrag(0)"))
{
$qry = 'CREATE FUNCTION campus.get_status_studierendenantrag(integer) RETURNS character varying
LANGUAGE plpgsql
STABLE
RETURNS NULL ON NULL INPUT
AS $_$
DECLARE i_studierendenantrag_id ALIAS FOR $1;
DECLARE rec RECORD;
@@ -194,10 +197,25 @@ if (!$result = @$db->db_query("SELECT campus.get_status_studierendenantrag(0)"))
else
echo '<br>campus.get_status_studierendenantrag(integer): function created';
}
elseif ($result = @$db->db_query("SELECT 1 FROM pg_proc WHERE proname='get_status_studierendenantrag' AND provolatile='s'"))
{
if ($db->db_num_rows($result) == 0) {
$qry = 'ALTER FUNCTION campus.get_status_studierendenantrag(integer) STABLE;';
$qry .= 'ALTER FUNCTION campus.get_status_studierendenantrag(integer) RETURNS NULL ON NULL INPUT;';
if (!$result = @$db->db_query("SELECT campus.get_status_id_studierendenantrag(0)")) {
if(!$db->db_query($qry))
echo '<strong>campus.get_status_studierendenantrag(integer): '.$db->db_last_error().'</strong><br>';
else
echo '<br>campus.get_status_studierendenantrag(integer): function updated';
}
}
if (!$result = @$db->db_query("SELECT campus.get_status_id_studierendenantrag(0)"))
{
$qry = 'CREATE FUNCTION campus.get_status_id_studierendenantrag(integer) RETURNS integer
LANGUAGE plpgsql
STABLE
RETURNS NULL ON NULL INPUT
AS $_$
DECLARE i_studierendenantrag_id ALIAS FOR $1;
DECLARE rec RECORD;
@@ -219,10 +237,24 @@ if (!$result = @$db->db_query("SELECT campus.get_status_id_studierendenantrag(0)
else
echo '<br>campus.get_status_id_studierendenantrag(integer): function created';
}
elseif ($result = @$db->db_query("SELECT 1 FROM pg_proc WHERE proname='get_status_id_studierendenantrag' AND provolatile='s'"))
{
if ($db->db_num_rows($result) == 0) {
$qry = 'ALTER FUNCTION campus.get_status_id_studierendenantrag(integer) STABLE;';
$qry .= 'ALTER FUNCTION campus.get_status_id_studierendenantrag(integer) RETURNS NULL ON NULL INPUT;';
if (!$result = @$db->db_query("SELECT public.get_absem_prestudent(0, null)")) {
if(!$db->db_query($qry))
echo '<strong>campus.get_status_id_studierendenantrag(integer): '.$db->db_last_error().'</strong><br>';
else
echo '<br>campus.get_status_id_studierendenantrag(integer): function updated';
}
}
if (!$result = @$db->db_query("SELECT public.get_absem_prestudent(0, null)"))
{
$qry = 'CREATE FUNCTION public.get_absem_prestudent(integer, character varying) RETURNS integer
LANGUAGE plpgsql
STABLE
AS $_$
DECLARE i_prestudent_id ALIAS FOR $1;
DECLARE cv_studiensemester_kurzbz ALIAS FOR $2;
@@ -253,9 +285,22 @@ if (!$result = @$db->db_query("SELECT public.get_absem_prestudent(0, null)")) {
else
echo '<br>public.get_absem_prestudent(integer, character varying): function created';
}
if (!$result = @$db->db_query("SELECT public.get_stdsem_prestudent(0, null)")) {
elseif ($result = @$db->db_query("SELECT 1 FROM pg_proc WHERE proname='get_absem_prestudent' AND provolatile='s'"))
{
if ($db->db_num_rows($result) == 0) {
$qry = 'ALTER FUNCTION public.get_absem_prestudent(integer, character varying) STABLE;';
if(!$db->db_query($qry))
echo '<strong>public.get_absem_prestudent(integer, character varying): '.$db->db_last_error().'</strong><br>';
else
echo '<br>public.get_absem_prestudent(integer, character varying): function updated';
}
}
if (!$result = @$db->db_query("SELECT public.get_stdsem_prestudent(0, null)"))
{
$qry = 'CREATE FUNCTION public.get_stdsem_prestudent(integer, character varying) RETURNS character varying
LANGUAGE plpgsql
STABLE
AS $_$
DECLARE i_prestudent_id ALIAS FOR $1;
DECLARE cv_studiensemester_kurzbz ALIAS FOR $2;
@@ -286,6 +331,17 @@ if (!$result = @$db->db_query("SELECT public.get_stdsem_prestudent(0, null)")) {
else
echo '<br>public.get_stdsem_prestudent(integer, character varying): function created';
}
elseif ($result = @$db->db_query("SELECT 1 FROM pg_proc WHERE proname='get_stdsem_prestudent' AND provolatile='s'"))
{
if ($db->db_num_rows($result) == 0) {
$qry = 'ALTER FUNCTION public.get_stdsem_prestudent(integer, character varying) STABLE;';
if(!$db->db_query($qry))
echo '<strong>public.get_stdsem_prestudent(integer, character varying): '.$db->db_last_error().'</strong><br>';
else
echo '<br>public.get_stdsem_prestudent(integer, character varying): function updated';
}
}
if($result = @$db->db_query("SELECT 1 FROM public.tbl_status_grund WHERE statusgrund_kurzbz = 'abbrecherStgl';"))
{