Использование

Накопительные регистры используются для ускорения получения данных оборотов и остатков, обычно с разбивкой на периоды. Для этого регистр хранит уже агрегированные данные с заданной периодичностью. В модуле 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 опционально также можно указать действие при возникновении ошибки