НапильникХранилищеСущностей
Пост-процессор (напильник) для автоматической генерации реализации методов запросов в классах хранилищ сущностей. Отвечает за анализ аннотаций и создание декораторов с соответствующими перехватчиками методов.
Назначение
НапильникХранилищеСущностей выполняет следующие функции:
- Обрабатывает классы с аннотацией
&ХранилищеСущностей - Анализирует методы с аннотацией
&МетодЗапроса - Генерирует реализацию методов запросов на основе их имен
- Создает наследников с делегированием к базовому хранилищу
- Интегрирует сгенерированные классы с autumn framework
Аннотации
&НапильникКласс помечен аннотацией &Напильник, что означает его использование как процессора в рамках autumn framework для обработки других классов.
Конструктор
Процедура ПриСозданииОбъекта(
&Пластилин Поделка,
&Пластилин КонтейнерАннотаций,
&Пластилин ПостроительОпцийПоиска
)Параметры
Поделка
Тип: Поделка
Контейнер зависимостей, используемый для получения определений аннотаций и поиска желудей.
КонтейнерАннотаций
Тип: КонтейнерАннотаций
Контейнер для работы с аннотациями библиотеки annotations, предоставляемый ОСенью.
ПостроительОпцийПоиска
Тип: ПостроительОпцийПоиска
Внутренний компонент для анализа имен методов и построения объектов ОпцииПоиска.
Основной метод
ОбработатьЖелудь(Желудь, ОпределениеЖелудя)
Основной метод обработки классов, помеченных аннотацией &ХранилищеСущностей.
Параметры:
Желудь- исходный объект классаОпределениеЖелудя- метаданные класса с информацией о методах и аннотациях
Возвращает: Обработанный объект (декоратор) или исходный объект, если обработка не требуется
Алгоритм обработки
1. Проверка аннотации
Метод проверяет наличие аннотации &ХранилищеСущностей в конструкторе класса:
АннотацияХранилищеСущностей = РаботаСАннотациями.НайтиАннотацию(Конструктор.Аннотации, "ХранилищеСущностей");
Если АннотацияХранилищеСущностей = Неопределено Тогда
Возврат Желудь; // Класс не требует обработки
КонецЕсли;2. Извлечение параметров аннотации
Из аннотации извлекаются:
ИмяТипаСущности- тип сущности для работыИсточникДанныхСущности- источник данных (опционально)
3. Получение базового хранилища
Напильник находит соответствующее базовое хранилище сущностей в контейнере:
ХранилищеСущностей = _Поделка.НайтиЖелудь("ХранилищеСущностей" + ИсточникДанныхСущности + ИмяТипаСущности);4. Создание построителя наследника
Используется ПостроительНаследника из библиотеки extends для создания класса-наследника:
ПостроительНаследника = Новый ПостроительНаследника(
Желудь,
ХранилищеСущностей,
ОпределениеЖелудя.Методы(),
ОпределениеЖелудя.Завязь().ДанныеМетода()
);5. Обработка методов запросов
Для каждого метода с аннотацией &МетодЗапроса:
- Анализ имени метода -
ПостроительОпцийПоискаразбирает имя метода и создает параметры поиска - Генерация кода - создается строка с кодом для выполнения запроса
- Создание перехватчика - генерируется перехватчик с кодом реализации метода
6. Построение декоратора
Создается окончательный декоратор с всеми перехватчиками и возвращается вместо исходного объекта.
Пример генерации кода
Для метода:
&МетодЗапроса
Функция ПолучитьПервыеСоСмещениемПоИмяРавноИВозрастБольше(Количество, Смещение, Имя, Возраст) Экспорт
Возврат Неопределено;
КонецФункцииНапильник сгенерирует следующий код:
ОпцииПоиска = Новый ОпцииПоиска();
ОпцииПоиска.Первые(Количество);
ОпцииПоиска.Смещение(Смещение);
ОпцииПоиска.Отбор("Имя", ВидСравнения.Равно, Имя);
ОпцииПоиска.Отбор("Возраст", ВидСравнения.Больше, Возраст);
Возврат ХранилищеСущностей.Получить(ОпцииПоиска);Поддерживаемые конструкции
Режимы поиска
Получить- генерирует вызовХранилищеСущностей.Получить(ОпцииПоиска)ПолучитьОдно- генерирует вызовХранилищеСущностей.ПолучитьОдно(ОпцииПоиска)
Ограничения
Первые- генерирует вызовОпцииПоиска.Первые(Параметр)СоСмещением- генерирует вызовОпцииПоиска.Смещение(Параметр)
Условия отбора
Все виды сравнения преобразуются в соответствующие вызовы:
ОпцииПоиска.Отбор("ПутьКДанным", ВидСравнения.ВидСравнения, Параметр);Поддерживаемые виды сравнения:
Равно,НеРавно,Больше,БольшеИлиРавно,Меньше,МеньшеИлиРавно,В,НеВ
Сортировка
Сортировка преобразуется в вызовы:
ОпцииПоиска.СортироватьПо("ПутьКДанным", НаправлениеСортировки.Направление);Поддерживаемые направления:
НаправлениеСортировки.Возр(по умолчанию)НаправлениеСортировки.Убыв
Соответствие параметров
Напильник обеспечивает правильное соответствие параметров метода и их использования в сгенерированном коде:
- Параметры ограничений (
Первые,СоСмещением) используются в порядке их следования в имени метода - Параметры условий отбора используются в том же порядке, что и условия в имени метода
- Индексы параметров вычисляются автоматически на основе позиции в массиве параметров метода
Внутренние зависимости
Класс использует следующие внутренние компоненты:
ПостроительОпцийПоиска- для анализа имен методовТокенайзерЗапросов- для разбора токенов в именах методов- Компоненты библиотеки
extendsдля создания наследников - Компоненты autumn framework для работы с аннотациями
Обработка ошибок
Напильник выполняет валидацию:
- Проверяет корректность параметров аннотаций
- Валидирует структуру имен методов через
ПостроительОпцийПоиска - Обеспечивает соответствие количества параметров метода и ожидаемых параметров
При обнаружении ошибок генерируются соответствующие исключения с описанием проблемы.
