Skip to content
Snippets Groups Projects
Commit ade925d5 authored by André Noack's avatar André Noack Committed by Jan-Hendrik Willms
Browse files

Resolve #3248 "Bearbeiten der Zugangsberechtigungen dauert sehr lange /...

Resolve #3248 "Bearbeiten der Zugangsberechtigungen dauert sehr lange / Performance Anmeldesets mit vielen Bedingungen schlecht"

Closes #3248

Merge request studip/studip!2206
parent b21efc64
No related branches found
No related tags found
No related merge requests found
...@@ -59,6 +59,9 @@ class UserFilterField ...@@ -59,6 +59,9 @@ class UserFilterField
public static $isParameterized = false; public static $isParameterized = false;
protected static $cached_valid_values;
protected static $available_filter_fields;
/** /**
* Database tables and fields to get valid values and concrete user values * Database tables and fields to get valid values and concrete user values
* from. * from.
...@@ -92,6 +95,9 @@ class UserFilterField ...@@ -92,6 +95,9 @@ class UserFilterField
'!=' => _('ist nicht') '!=' => _('ist nicht')
]; ];
if ($this->valuesDbNameField) { if ($this->valuesDbNameField) {
if (isset(self::$cached_valid_values[static::class])) {
$this->validValues = self::$cached_valid_values[static::class];
} else {
// Get all available values from database. // Get all available values from database.
$stmt = DBManager::get()->query( $stmt = DBManager::get()->query(
"SELECT DISTINCT `" . $this->valuesDbIdField . "`, `" . $this->valuesDbNameField . "` " . "SELECT DISTINCT `" . $this->valuesDbIdField . "`, `" . $this->valuesDbNameField . "` " .
...@@ -99,6 +105,8 @@ class UserFilterField ...@@ -99,6 +105,8 @@ class UserFilterField
while ($current = $stmt->fetch(PDO::FETCH_ASSOC)) { while ($current = $stmt->fetch(PDO::FETCH_ASSOC)) {
$this->validValues[$current[$this->valuesDbIdField]] = $current[$this->valuesDbNameField]; $this->validValues[$current[$this->valuesDbIdField]] = $current[$this->valuesDbNameField];
} }
self::$cached_valid_values[static::class] = $this->validValues;
}
} }
if ($fieldId) { if ($fieldId) {
$this->id = $fieldId; $this->id = $fieldId;
...@@ -186,6 +194,7 @@ class UserFilterField ...@@ -186,6 +194,7 @@ class UserFilterField
*/ */
public static function getAvailableFilterFields() public static function getAvailableFilterFields()
{ {
if (self::$available_filter_fields === null) {
$fields = []; $fields = [];
// Load all PHP class files found in the condition field folder. // Load all PHP class files found in the condition field folder.
foreach (glob(realpath(dirname(__FILE__).'/userfilter').'/*.class.php') as $file) { foreach (glob(realpath(dirname(__FILE__).'/userfilter').'/*.class.php') as $file) {
...@@ -204,8 +213,11 @@ class UserFilterField ...@@ -204,8 +213,11 @@ class UserFilterField
} }
} }
asort($fields); asort($fields);
return $fields; self::$available_filter_fields = $fields;
} }
return self::$available_filter_fields;
}
/** /**
* Which compare operator is set? * Which compare operator is set?
......
...@@ -18,7 +18,6 @@ class SemesterOfStudyCondition extends UserFilterField ...@@ -18,7 +18,6 @@ class SemesterOfStudyCondition extends UserFilterField
// --- ATTRIBUTES --- // --- ATTRIBUTES ---
public $valuesDbTable = 'user_studiengang'; public $valuesDbTable = 'user_studiengang';
public $valuesDbIdField = 'semester'; public $valuesDbIdField = 'semester';
public $valuesDbNameField = 'semester';
public $userDataDbTable = 'user_studiengang'; public $userDataDbTable = 'user_studiengang';
public $userDataDbField = 'semester'; public $userDataDbField = 'semester';
...@@ -49,12 +48,14 @@ class SemesterOfStudyCondition extends UserFilterField ...@@ -49,12 +48,14 @@ class SemesterOfStudyCondition extends UserFilterField
'=' => _('ist'), '=' => _('ist'),
'!=' => _('ist nicht') '!=' => _('ist nicht')
]; ];
if (isset(self::$cached_valid_values[static::class])) {
$this->validValues = self::$cached_valid_values[static::class];
} else {
// Initialize to some value in case there are no semester numbers. // Initialize to some value in case there are no semester numbers.
$maxsem = 15; $maxsem = 15;
// Calculate the maximal available semester. // Calculate the maximal available semester.
$query = "SELECT MAX(`{$this->valuesDbIdField}`) AS maxsem $stmt = DBManager::get()->query("SELECT MAX(" . $this->valuesDbIdField . ") AS maxsem " .
FROM `{$this->valuesDbTable}`"; "FROM `" . $this->valuesDbTable . "`");
$stmt = DBManager::get()->query($query);
if ($current = $stmt->fetch(PDO::FETCH_ASSOC)) { if ($current = $stmt->fetch(PDO::FETCH_ASSOC)) {
if ($current['maxsem']) { if ($current['maxsem']) {
$maxsem = $current['maxsem']; $maxsem = $current['maxsem'];
...@@ -63,6 +64,8 @@ class SemesterOfStudyCondition extends UserFilterField ...@@ -63,6 +64,8 @@ class SemesterOfStudyCondition extends UserFilterField
for ($i = 1; $i <= $maxsem; $i++) { for ($i = 1; $i <= $maxsem; $i++) {
$this->validValues[$i] = $i; $this->validValues[$i] = $i;
} }
self::$cached_valid_values[static::class] = $this->validValues;
}
} }
/** /**
......
...@@ -19,9 +19,6 @@ require_once realpath(__DIR__ . '/..') . '/UserFilterField.class.php'; ...@@ -19,9 +19,6 @@ require_once realpath(__DIR__ . '/..') . '/UserFilterField.class.php';
class SubjectConditionAny extends UserFilterField class SubjectConditionAny extends UserFilterField
{ {
// --- ATTRIBUTES --- // --- ATTRIBUTES ---
public $valuesDbTable = 'fach';
public $valuesDbIdField = 'fach_id';
public $valuesDbNameField = 'name';
public $userDataDbTable = 'user_studiengang'; public $userDataDbTable = 'user_studiengang';
public $userDataDbField = 'fach_id'; public $userDataDbField = 'fach_id';
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment