registry - Модуль накопительных регистров¶
Пакет Registry реализует базовый функционал для ведения накопительных регистров с периодичностью (от секунды до года) или без
Содержание:
Установка¶
Модуль Registry подключается как пакет Python.
Необходимые библиотеки¶
- django>=1.3
Установка с помощью pip¶
Установите пакет registry из репозитория пакетов компании БАРС Груп
pip install registry -i https://<PyPI_сервер_БАРС_Груп>
Установка из архива¶
Скачайте и распакуйте архив модуля https://bitbucket.org/barsgroup/registry/downloads
Установка из Mercurial¶
Клонируйте исходный код модуля из репозитория
hg clone https://bitbucket.org/barsgroup/registry
Установка из каталога¶
python setup.py install
Использование¶
Накопительные регистры используются для ускорения получения данных оборотов и остатков, обычно с разбивкой на периоды. Для этого регистр хранит уже агрегированные данные с заданной периодичностью. В модуле registry реализовано несколько классов для ведения регистра.
Класс CumulativeRegister (cumulative.py)¶
- При наследовании от CumulativeRegister нужно определить следующие атрибуты:
- model, модель хранения данных
- dim_fields, список полей-измерения регистра, в разрезе которых подсчитывются агрегированные значения
- circ_fields, список полей для хранения оборотов
- rest_fields, список полей хранения остатков, длина списка должна быть равна длине circ_fields
Регистр по-умолчанию ведется по дням, период можно задавать в интервале от секунды до года с использованием PeriodEnum. Название поля хранения периода date_field по-умолчанию равно 'date'.
- CumulutiveRegister реализует два метода:
- write(date, **kwargs), запись в регистр на основе переданного периода и словаря с данными. Если на заданной период записи еще нет, то создается новая. Если есть, то в записи обновляются значения оборотов и остатков и пересчитывается регистр на более поздний период.
- get(date, model, **kwargs), получение актуальной записи-кортежа регистра на период по значениям полей-измерений из словаря. Модель по-умолчанию берется из свойства model класса.
Класс DataRegistry (data_registry.py)¶
Класс DataRegistry используется для ведения регистра сведений, т.е. когда у записи есть данные с периодом предыдущей и следующей записи.
- При наследовании от этого класса нужно определить атрибуты:
- model, модель хранения данных, должна наследоваться от BaseDataStoreModel, т.к. используются поля drg_left, drg_right и drg_center
- period - периодичность хранимых данных (от секунды до года или отсутствие периодичности)
- dimensions, список названий полей-измерений
- resources, список названий полей с данными.
- Класс DataRegistry реализует следующие методы:
- insert(data, date), добавление данных data (словарь, объект или модель) на период date с обновлением периодов смежных записей
- query(dimentions, date=None, next=False), получение данных на основе значений полей-измерений и даты. Данные беруться слева или справа от даты
- remove(dimensions, date=None), удаление данных на основе данных полей-измерений. Для периодического регистра также учитывается дата и пересчитываются даты начала и окончания смежных с удаляемыми записями.
Класс BaseInformationRegistry (info_reg.py)¶
Абстрактный класс BaseInformationRegistry инкапсулирует модель хранения данных и методы работы с регистром. Модель данных содержит датувремя создания записи (поле history_time_stamp) и идентификатор записи в родной модели (поле history_object_id), т.е. данные могут поступать из разных иточников.
- В своем классе-наследнике нужно определить атрибуты:
- managed_models, список управляемых моделей, из которых могут поступать данные
- managed_fields, список названий полей, которые будут доставаться из передаваемых словарей
- Класс BaseInformationRegistry реализует следующие методы:
- mapping(self, *args, **kwargs), запись данных в регистр на основе объектов в args и значений полей в kwargs
- add_object(cls, *args, **kwargs), создание новой записи регистра с использованием метода mapping. Дата записи берется из поля date словаря
- get_object(cls, obj, date=None), возвращает актуальную на дату запись регистра по объекту
- get_history(cls, obj, reverse=False), возвращает историю регистра по объекту
Класс BaseInfoModel (info_registry.py)¶
Абстрактный класс BaseInfoModel реализует основную логику работы периодического регистра с информацией о предыдущей и последующей записях (поля info_date, info_date_prev, info_date_next). При удалении или добавлении записей хронологический порядок сохраняется. Атрибут dimentions определяет список полей-измерений.
- Используемые методы:
- query_dimentions(cls, data), возвращает данные регистра с фильтром по ключевым полям
- query_on_date(cls, data, date=None, next=False), то же, что и query_dimentions с добавлением фильтра по дате. Данные берутся справа или слева от указанной даты.
- save(self, *args, **kwargs), метод переопределен для сохранения корректной цепочки записей в хронологическом порядке.
Класс BaseIntervalInfoModel (info_registry.py)¶
Абстрактный класс BaseIntervalInfoModel также как BaseInfoModel реализует логику работу периодического накопительного регистра, но еще и с добавлением периода действия исходных данных. Для его использования также нужно определить список названий полей-измерений и периодичность регистра.
- Методы класса:
- query_dimentions(cls, data), возвращает записи регистра с фильтром по ключевым полям
- query_interval(cls, data, date_begin, date_end, include_begin=True, include_end=True), возвращает данные регистра с фильтром по ключевым полям и указанному интервалу
- query_on_date(cls, data, date=None, active=True, next=False), возвращает данные регистра на указанную дату с фильтром по полям-измерениям и опциональным фильтром на период действия записей.
Перестройка регистров BaseInfoModel и BaseIntervalInfoModel¶
В info_registry.py реализованы функции rebuild_info_model и rebuild_interval_info_model для перестройки связей между записями (хронологического порядка) соответствующих регистров. Функциям нужно в качестве параметра передать класс регистра, а для rebuild_interval_info_model опционально также можно указать действие при возникновении ошибки