Необходимо реализовать простейшую базу данных, поддерживающую запросы для формирования выборки студентов и преподавателей, подходящих под заданные в запросах условия.
Все записи в базе данных описываются следующей иерархией классов, которые необходимо реализовать в вашем решении.
Person -- базовый класс, хранящий общую информацию для всех людей, связанных с университетом. Про каждого человека хранится следующая информация:
- name - строковое поле, хранящее имя человека,
- birthday - строковое поле, хранящее дату рождения,
- id - номер СНИЛС-а, уникальное целочисленное значение.
Student -- наследник Person, в котором добавляются поля специфичные студентам:
- department - строковое поле, хранящее факультет, на котором студент учится,
- group - номер группы,
- student_id - номер зачетной книжки, уникальное поле.
Teacher -- наследник Person, символизирующий преподавателей. Дополнительные поля:
- course -- курс, который ведет этот преподаватель, текстовое поле,
- groups -- группы, в которых преподаватель ведет свой курс: список целочисленных значений,
- students -- список номеров зачетных книжек студентов, у которых преподаватель является научным руководителем.
Наконец, AssistantStudent - наследник и Student и Teacher, символизирующий студентов старших курсов, которые уже преподают некоторые дисциплины. У них нет дополнительных полей, но они наследуют их как от студента, так и от преподавателя.
У классов Student, Teacher и AssistantStudent необходимо реализовать метод __str__, возвращающий строку, удобную для быстрого чтения человеком (без лишней информации).
- Для Student s формат строки:
Student {s.name} from group {s.group}, {s.department}
- Для Teacher t:
Teacher {t.name} on course {t.course}. Works with {len(s.groups)} groups and {len(s.students)} students.
- Для AssistantStudent as:
Student {as.name} from group {as.group}, {as.department}. Also teaches {as.course} in {len(as.groups)} groups and mentors {len(as.students)} students.
Кроме того, у каждого класса есть полное представление в текстовом виде, для которого используется формат JSON. Пример:
{"name" : "Иванов С. В.", "birthday" : "10.01.2003", "id" : 1522347612, "department" : "ММФ", "group" : 22129, "student_id" : 421254}
Примеры JSON-ов для более сложных полей (например, groups у преподавателей), можно найти в тестах.
Вам необходимо: в классах реализовать функции to_json, возвращающие JSON строку по объекту, а также функцию для создания экземпляров соответствующих классов по заданной JSON строке.
Наконец, необходимо реализовать методы __hash__ и __eq__ для каждого класса, использующие значения уникальных полей классов.
База данных представлена, как текстовый файл, каждая строка которого, содержит JSON представление одного объекта, описанного выше.
Однако, моментально создавать по такой базе данных все объекты в памяти не стоит, вы можете потратить слишком много ресурсов. Вместо этого, пользователь может написать запрос к вашей базе данных на специальном языке запросов. В ответ он получает объект-генератор, позволяющий перебрать все, подходящие под запрос объекты в базе (уже выделяя их в памяти).
Запрос имеет вид:
get records [where {condition}]
Опциональный блок where
описывает ограничения на то, какие записи нужно возвращать.
{condition}
при этом состоит из ограничений одного из четырех видов:
{field} is set
проверяющее, что поле{field}
присутствует в записи,{field} is {value}
проверяющее, что поле{field}
присутствует в записи и равно{value}
,{field} in {collection}
проверяющее, что поле{field}
присутствует в записи и содержится в коллекции{collection}
. Коллекция при этом задается, как множество элементов, например:{22126, 22127, 8126}
{field} contains {value}
проверяющее, что поле{field}
присутствует в записи, обозначает коллекцию, которая при этом содержит{value}
.
Вам необходимо реализовать функцию solution(requests: TextIO, db_name: str, output: TextIO) -> None
в файле database.py
,
которая принимает на вход два открытых уже файла requests (список запросов, по одному на строчку) и output, а также имя файла db_name,
являющегося базой данных. Обратите внимание, что файл db_name пока не открыт, вы должны будете сами открывать его по запросу.
В выходной файл output нужно записать последовательный вывод всех выполненных запросов. Для этого стоит использовать __str__
для каждого из полученных объектов.
Запрос | Вывод | База данных |
---|---|---|
get records where group is 22129 |
Student Иванов С. В. from group 22129, ММФ Student Иванова В. В. from group 22129, ММФ |
{"name" : "Иванов С. В.", "birthday" : "10.01.2003", "id" : 1522347612, "department" : "ММФ", "group" : 22129, "student_id" : 421254} {"name" : "Петрова И. К.", "birthday" : "15.03.2001", "id" : 8992141190, "department" : "ФФ", "group" : 19301, "student_id" : 235251} {"name" : "Медведев Т. С.", "birthday" : "31.12.2002", "id" : 124556132, "department" : "ФЕН", "group" : 19402, "student_id" : 715541} {"name" : "Зуброва Д. А.", "birthday" : "10.04.1991", "id" : 2952146170, "department" : "ММФ", "group" : 8126, "student_id" : 52341} {"name" : "Власов Г. В.", "birthday" : "23.07.1960", "id" : 4215161, "course" : "Ан.геом", "groups" : [19301, 22129], "students" : [52341, 235251]} {"name" : "Иванова В. В.", "birthday" : "10.01.2003", "id" : 1522347647, "department" : "ММФ", "group" : 22129, "student_id" : 421255} {"name" : "Ударников В. П.", "birthday" : "19.05.2000", "id" : 51261221, "department" : "ММФ", "group" : 17121, "student_id" : 124412, "course" : "Программирование-2", "groups" : [22129], "students" : []} {"name" : "Кузнецова Л. И.", "birthday" : "20.04.1980", "id" : 4215161, "course" : "Программирование", "groups" : [19129, 8126], "students" : [421254, 124412, 715541]} |
get records where course is set |
Teacher Власов Г. В. on course Ан.геом. Works with 2 groups and 2 students. Student Ударников В. П. from group 17121, ММФ. Also teaches Программирование-2 in 1 groups and mentors 0 students. Teacher Кузнецова Л. И. on course Программирование. Works with 2 groups and 3 students. |
|
get records where department in {"ММФ", "ФФ"} |
Student Иванов С. В. from group 22129, ММФ Student Петрова И. К. from group 19301, ФФ Student Зуброва Д. А. from group 8126, ММФ Student Иванова В. В. from group 22129, ММФ Student Ударников В. П. from group 17121, ММФ. Also teaches Программирование-2 in 1 groups and mentors 0 students. |