Skip to content
Vad Drobinin edited this page Aug 15, 2015 · 1 revision

Visitor

Visitor — класс, получающий на вход сабмиты по-одному и выполняющий с ними некоторые действия, такие как фильтрация, подсчет статистики, передача другим визиторам и т. д.

Visitor.visit(submit) получает сабмит и обрабатывает его требуемым образом. Visitor.get_stat_data() возвращает резутьтаты работы (например, подсчитанную статистику) во внутреннем представлении, таком как словарь или список. Visitor.pretty_print() возвращает результаты работы в читаемом виде.

Метод visit вызывается из функции, читающей сабмиты из внешней базы данных. В текущей реализации это ejudge_parse.

CompositorVisitor умеет объединять несколько визиторов и при получении сабмита передавать его каждому из них. Для создания необходимо передать визиторы ему в конструктор.

ShardingVisitor распределяет сабмиты между несколькими визиторами на основе некоторого ключа, например, для подсчета статистики отдельно по разным задачам. При этом для обработки сабмитов по каждой задаче используется отдельный экземпляр визитора, считающего нужную статистику. ShardingVisitor динамически создает новые визиторы, если ему передается сабмит с ключом, не встреченным ранее. В конструктор экземпляру класса ShardingVisitor передается подкласс VisitorFactory, который отвечает за создание новых визиторов.

Подклассы ShardingVisitor

ShardingVisitor.build_key(submit) возвращает ключ, на основе которого сабмит будет передан визитору, созданному для этого ключа. Этот метод должен переопределяться в подклассах.

VisitorFactory имеет один статический метод create, принимающий ключ из ShardingVisitor и возвращающий некоторый Visitor.