Skip to content
Snippets Groups Projects
Commit abe91c4f 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 2bbcfb7b
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,12 +95,17 @@ class UserFilterField ...@@ -92,12 +95,17 @@ class UserFilterField
'!=' => _('ist nicht') '!=' => _('ist nicht')
]; ];
if ($this->valuesDbNameField) { if ($this->valuesDbNameField) {
// Get all available values from database. if (isset(self::$cached_valid_values[static::class])) {
$stmt = DBManager::get()->query( $this->validValues = self::$cached_valid_values[static::class];
"SELECT DISTINCT `".$this->valuesDbIdField."`, `".$this->valuesDbNameField."` ". } else {
"FROM `".$this->valuesDbTable."` ORDER BY `".$this->valuesDbNameField."` ASC"); // Get all available values from database.
while ($current = $stmt->fetch(PDO::FETCH_ASSOC)) { $stmt = DBManager::get()->query(
$this->validValues[$current[$this->valuesDbIdField]] = $current[$this->valuesDbNameField]; "SELECT DISTINCT `" . $this->valuesDbIdField . "`, `" . $this->valuesDbNameField . "` " .
"FROM `" . $this->valuesDbTable . "` ORDER BY `" . $this->valuesDbNameField . "` ASC");
while ($current = $stmt->fetch(PDO::FETCH_ASSOC)) {
$this->validValues[$current[$this->valuesDbIdField]] = $current[$this->valuesDbNameField];
}
self::$cached_valid_values[static::class] = $this->validValues;
} }
} }
if ($fieldId) { if ($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,9 +213,12 @@ class UserFilterField ...@@ -204,9 +213,12 @@ 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,19 +48,23 @@ class SemesterOfStudyCondition extends UserFilterField ...@@ -49,19 +48,23 @@ class SemesterOfStudyCondition extends UserFilterField
'=' => _('ist'), '=' => _('ist'),
'!=' => _('ist nicht') '!=' => _('ist nicht')
]; ];
// Initialize to some value in case there are no semester numbers. if (isset(self::$cached_valid_values[static::class])) {
$maxsem = 15; $this->validValues = self::$cached_valid_values[static::class];
// Calculate the maximal available semester. } else {
$query = "SELECT MAX(`{$this->valuesDbIdField}`) AS maxsem // Initialize to some value in case there are no semester numbers.
FROM `{$this->valuesDbTable}`"; $maxsem = 15;
$stmt = DBManager::get()->query($query); // Calculate the maximal available semester.
if ($current = $stmt->fetch(PDO::FETCH_ASSOC)) { $stmt = DBManager::get()->query("SELECT MAX(" . $this->valuesDbIdField . ") AS maxsem " .
if ($current['maxsem']) { "FROM `" . $this->valuesDbTable . "`");
$maxsem = $current['maxsem']; if ($current = $stmt->fetch(PDO::FETCH_ASSOC)) {
if ($current['maxsem']) {
$maxsem = $current['maxsem'];
}
} }
} 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.
Finish editing this message first!
Please register or to comment