Оптимизация user_active_sessions
Запрос в цикле к БД $useringroup = $DB->record_exists('block_supervised_user', array('sessionid' => $id, 'userid' => $USER->id)); - это вообще говоря безобразие.
Я думаю проблему можно решить получив нужные данные в SQL до цикла, используя get_in_or_equal для sessionid - можно получить записи для всех сессий например.
Или доработать get_sessions чтобы она принимала userid (со значением по умолчанию типа -1 - возвращать все) и если задан возвращала только для этого юзера (тогда при пустом массиве от get_sessions функция user_active_sessions должна возвращать grouperror - по смыслу его сообщения "в группе нет занятий" все верно.
Comments (13)
-
-
reporter Скорее всего да, вы можете поискать тем же грепом использование глобалок в мудловских тестах. Только надо использовать advanced_test_case и почитать https://docs.moodle.org/dev/Writing_PHPUnit_tests#Generators - посмотреть соответствующие методы. Только про юнит-тесты у нас другое issue было, и в первую очередь максимально срочно я хочу увидеть решенным 392-е все-таки...
-
Олег Александрович, я решила делать оптимизацию вторым способом - добавить в эту функцию
параметр с идентификатором пользователя. У меня возникла проблема, когда я обращаюсь к полю таблицы {block_supervised_user}.userid, то выдается ошибка, что такого поля нет, хотя в таблице оно есть, и я делаю все по аналогии с обращениями к полям в этой функции. Может, что-либо еще необходимо сделать дополнительно, чтобы можно было обращаться к таблице?
-
reporter Надо смотреть где именно, как выглядит запрос. Вы саму таблицу приджоинить к запросу не забыли?
-
Я вытолкнула изменения, посмотрите, пожалуйста, как будет время.
-
reporter А вы все вызовы get_sessions посмотрели и исправили по блоку (и на всякий случай проверить и правило)? Или только один, где оптимизировали?
Вы ведь очень неудачно исправили прототип функции, если бы вы добавили userid в конец со значением по умолчанию (как это обычно делается) - то все вызовы, которым оно было не надо, работали бы по прежнему. А вы добавили в середину - притом там и так было полно параметров по умолчанию - в итоге в других вызовах параметры могли сменить свой смысл, при этом вызовы остались синтаксически корректными - что путь к ОЧЕНЬ страшноватеньким глюкам. Или сделайте прототип нормально, или пишите сюда анализ всех вызовов с обоснованием, почему остальные вызовы не меняются.
-
Вообще я все вызовы исправила, я смотрела по всем файлам, где вызывалась эта функция. Я просто рассуждала по важности параметров: сначала курс, потом пользователь, который привязан к курсу, потом преподаватель и тд. Хорошо, я лучше откачу изменения и переставлю параметр в самый конец.
-
reporter Проверил тщательнее, вижу. Там просто еще другая функция начинающаяся с get_sessions была, что в общем поиске давало не очень верные результаты.
Единственное если там уже есть teacherid (который по уму superviserid должен бы был быть), то userid не очень удачное название - возможно participantid? И объяснить разницу хорошо в PHPDoc комментах, которые у вас явно недостаточны - чем userid (или как он будет называть) от teacherid отличается. А то учитель - он тоже пользователь.
Эта терминологическая ерунда с user в качестве участника сессии у нас даже в наименования таблиц проползла, но там надо апгрейд-процедуру прописать, вы сможете?
-
В таблицах БД самих надо изменить название с UserId на соответствующее действительности с помощью процедуры?
Честно, я ни разу не писала апгрейд-процедуру, но если бы вы мне скинули правильный пример, как это делать, я пропишу.
-
reporter Пока замените в заголовке функции, еще где увидите по коду. userid на participantid, teacherid на superviserid - и в комментах/других названиях переменных. БД не трогайте - это спланировать надо, я отдельное issue создам. Пока надо сделать таки тесты для user_active_sessions - чтобы быть спокойными, что все работает.
А примеров там полный Moodle :) Смотреть файлы upgrade.php во многочисленных каталогах db. Но там по хорошему XMLD редактор шаблоны кода генерирует, надо мне вам просто показать где он есть и как им пользоваться. Могу в понедельник вечером на досдаче если будет время, а лучше в четверг - у меня там окно с 15-40.
-
Хорошо, я в четверг подойду.
-
reporter Как там с переименованием?
-
Насколько я помню, я переименование делала в коде, где айдишники participant и superviser не были завязаны на формах отображения и базе данных. Оставались только они. Я перепроверю еще раз. По поводу upgrade.php, мне его сделать? Я пробовала на своей версии его уже написать.
- Log in to comment
Олег Александрович, а можно ли присваивать глобальным переменным $USER и $COURSE значения в контексте тестов? Там в функции get_active_sessions имеются строки типа $sessions = get_sessions($COURSE->id......), где идет обращение к глобальной переменной. Можно ли как-то решить этот вопрос?