Оптимизация user_active_sessions

Issue #394 new
Oleg Sychev repo owner created an issue

Запрос в цикле к БД $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)

  1. Анастасия Поцелуйко

    Олег Александрович, а можно ли присваивать глобальным переменным $USER и $COURSE значения в контексте тестов? Там в функции get_active_sessions имеются строки типа $sessions = get_sessions($COURSE->id......), где идет обращение к глобальной переменной. Можно ли как-то решить этот вопрос?

  2. Oleg Sychev reporter

    Скорее всего да, вы можете поискать тем же грепом использование глобалок в мудловских тестах. Только надо использовать advanced_test_case и почитать https://docs.moodle.org/dev/Writing_PHPUnit_tests#Generators - посмотреть соответствующие методы. Только про юнит-тесты у нас другое issue было, и в первую очередь максимально срочно я хочу увидеть решенным 392-е все-таки...

  3. Анастасия Поцелуйко

    Олег Александрович, я решила делать оптимизацию вторым способом - добавить в эту функцию

    https://bitbucket.org/oasychev/moodle-plugins/src/f3dfa102473dccd74fa587eab644cb49da822aad/blocks/supervised/sessions/lib.php?at=default&fileviewer=file-view-default#lib.php-202

    параметр с идентификатором пользователя. У меня возникла проблема, когда я обращаюсь к полю таблицы {block_supervised_user}.userid, то выдается ошибка, что такого поля нет, хотя в таблице оно есть, и я делаю все по аналогии с обращениями к полям в этой функции. Может, что-либо еще необходимо сделать дополнительно, чтобы можно было обращаться к таблице?

  4. Oleg Sychev reporter

    Надо смотреть где именно, как выглядит запрос. Вы саму таблицу приджоинить к запросу не забыли?

  5. Анастасия Поцелуйко

    Я вытолкнула изменения, посмотрите, пожалуйста, как будет время.

  6. Oleg Sychev reporter

    А вы все вызовы get_sessions посмотрели и исправили по блоку (и на всякий случай проверить и правило)? Или только один, где оптимизировали?

    Вы ведь очень неудачно исправили прототип функции, если бы вы добавили userid в конец со значением по умолчанию (как это обычно делается) - то все вызовы, которым оно было не надо, работали бы по прежнему. А вы добавили в середину - притом там и так было полно параметров по умолчанию - в итоге в других вызовах параметры могли сменить свой смысл, при этом вызовы остались синтаксически корректными - что путь к ОЧЕНЬ страшноватеньким глюкам. Или сделайте прототип нормально, или пишите сюда анализ всех вызовов с обоснованием, почему остальные вызовы не меняются.

  7. Анастасия Поцелуйко

    Вообще я все вызовы исправила, я смотрела по всем файлам, где вызывалась эта функция. Я просто рассуждала по важности параметров: сначала курс, потом пользователь, который привязан к курсу, потом преподаватель и тд. Хорошо, я лучше откачу изменения и переставлю параметр в самый конец.

  8. Oleg Sychev reporter

    Проверил тщательнее, вижу. Там просто еще другая функция начинающаяся с get_sessions была, что в общем поиске давало не очень верные результаты.

    Единственное если там уже есть teacherid (который по уму superviserid должен бы был быть), то userid не очень удачное название - возможно participantid? И объяснить разницу хорошо в PHPDoc комментах, которые у вас явно недостаточны - чем userid (или как он будет называть) от teacherid отличается. А то учитель - он тоже пользователь.

    Эта терминологическая ерунда с user в качестве участника сессии у нас даже в наименования таблиц проползла, но там надо апгрейд-процедуру прописать, вы сможете?

  9. Анастасия Поцелуйко

    В таблицах БД самих надо изменить название с UserId на соответствующее действительности с помощью процедуры?

    Честно, я ни разу не писала апгрейд-процедуру, но если бы вы мне скинули правильный пример, как это делать, я пропишу.

  10. Oleg Sychev reporter

    Пока замените в заголовке функции, еще где увидите по коду. userid на participantid, teacherid на superviserid - и в комментах/других названиях переменных. БД не трогайте - это спланировать надо, я отдельное issue создам. Пока надо сделать таки тесты для user_active_sessions - чтобы быть спокойными, что все работает.

    А примеров там полный Moodle :) Смотреть файлы upgrade.php во многочисленных каталогах db. Но там по хорошему XMLD редактор шаблоны кода генерирует, надо мне вам просто показать где он есть и как им пользоваться. Могу в понедельник вечером на досдаче если будет время, а лучше в четверг - у меня там окно с 15-40.

  11. Анастасия Поцелуйко

    Насколько я помню, я переименование делала в коде, где айдишники participant и superviser не были завязаны на формах отображения и базе данных. Оставались только они. Я перепроверю еще раз. По поводу upgrade.php, мне его сделать? Я пробовала на своей версии его уже написать.

  12. Log in to comment