Перелік розширених тегів Liquibase

ЗМІСТ

1. Загальний опис

Через складні вимоги до архітектури Платформи, використання стандартної функціональності Liquibase не покриває всі потреби при роботі зі структурою даних.

Функціональність Liquibase було розширено за допомогою зовнішнього модуля liquibase-ddm-ext.

До розширення функціональності додатку Liquibase відносяться модулі, які забезпечують роботу з додатковими тегами (в термінології Liquibase — change types) XML-шаблону Liquibase, що відповідають за:

Для прикладу, повний перелік розширених тегів з їх параметрами зберігається в xsd-схемі за посиланням.

2. Теги створення таблиць

Назва change type: <createTable> <ext:historyFlag>

Цей тег надає можливість створити таблицю або дві таблиці:

  • з історичними даними;

  • із поточними даними.

Приклад XML-схеми
<createTable tableName="pd_subject_role" ext:historyFlag="true">
    <column name="role_id" type="BIGINT">
        <constraints nullable="false" primaryKey="true" primaryKeyName="pk_pd_subject_role"/>
    </column>
    <column name="role_name" type="TEXT">
        <constraints nullable="false"/>
    </column>
</createTable>
В рамках процесу верифікації регламенту, флаг historyFlag зі значенням true вимагатиметься для всіх тегів createTable. Тому при створенні таблиці необхідно вказувати відповідне значення historyFlag="true". Таким чином буде додатково згенерована історична таблиця, і для кожної з таблиць буде згенеровано свій специфічний набір службових полів.
За детальною інформацією щодо створення таблиць зверніться до секції Схема моделювання таблиць та функція підтримки історичності відповідного документа.

Генерація унікального номера для створених у реєстрі сутностей

Назва: атрибут ext:autoGenerate. Використовується у тегу <column>

Дозволяє згенерувати унікальний та зрозумілий для користувача номер для сутності (документа/акту). Номер формується під час збереження сутності та є унікальним у рамках окремого реєстру.

Приклад 1. XML-схема
<createTable ...>
...
    <column name="column_name" ext:autoGenerate="AA-{dd-MM-yyyy}-{SEQ}">
    </column>
...
</createTable>

Детальний опис функціональності ви можете переглянути за посиланням:

3. Керування критеріями пошуку

3.1. Тег створення простого критерію пошуку

Назва change type: <createSimpleSearchCondition>

Цей тег надає можливість створити простий критерій пошуку, а саме створити для однієї таблиці відбиток даних (view) та індекс за вказаним полем пошуку.

Приклад XML-схеми
<changeSet author="registry owner" id="searchConditionSimpleTest">
    <comment>CREATE simple test search condition</comment>
    <ext:createSimpleSearchCondition name="search_condition_simple_test" indexing="true" limit="all">
        <ext:table name="search_condition_simple_test" alias="c" searchType="equal" searchColumn="person_full_name"/>
    </ext:createSimpleSearchCondition>
</changeSet>
Якщо вказати створення індексу без вказання поля пошуку, то буде згенерована помилка.
За детальною інформацією щодо створення простого критерію пошуку зверніться до секції XML-шаблон дизайну простого критерію пошуку (Сценарій 1) відповідного документа.

3.2. Тег створення критерію пошуку

Назва change type: <createSearchCondition>

Цей тег надає можливість створити критерій пошуку, який створює відбиток даних (view) за декількома таблицями та зв’язками між ними.

Тег може також створювати індекси для кожного поля пошуку. Для цього використовуйте додатковий атрибут indexing зі значенням true в рамках тегу <createSearchCondition> відповідно до наступної схеми:

<xsd:attribute name="indexing" type="xsd:boolean" use="optional"/>
Приклад XML-схеми
<ext:createSearchCondition name="search_condition" limit="1" indexing="true">
    <ext:table name="table_one" alias="to">
        <ext:column name="name" alias="to_name" searchType="equal"/>
        <ext:column name="type"/>
        <ext:function name="count" alias="cnt" columnName="uuid"/>
    </ext:table>
    <ext:table name="table_two" alias="tt">
        <ext:column name="name" alias="tt_name"/>
        <ext:column name="code"/>
    </ext:table>
    <ext:join type="left">
        <ext:left alias="to">
             <ext:column name="name"/>
     </ext:left>
        <ext:right alias="tt">
            <ext:column name="name"/>
        </ext:right>
    </ext:join>
    <ext:where>
        <ext:condition tableAlias="to" columnName="type"  operator="eq" value="'char'">
            <ext:condition logicOperator="or" tableAlias="to"
columnName="type" operator="eq" value="'text'"/>
        </ext:condition>
        <ext:condition logicOperator="and" tableAlias="tt" columnName="code" operator="similar" value="'{80}'"/>
    </ext:where>
 </ext:createSearchCondition>
  • Якщо вказати створення індексу без вказання поля пошуку, то буде згенерована помилка.

  • Перший тег <ext:condition> в умові <ext:where> не повинен містити атрибуту logicOperator, всі інші теги <ext:condition> — повинні.

  • Перший тег <ext:condition>, як і всі інші, в умові <ext:join> повинен містити атрибут logicOperator.

  • Атрибут logicOperator приймає значення and і or.

  • Якщо тег <ext:condition> вкладений в інший, то вони обгортаються дужками.

За детальною інформацією щодо сценаріїв використання критеріїв пошуку зверніться до наступних секцій відповідного документа:

3.2.1. Оператор <ext:where> та доступні значення

Оператор <ext:where> приймає наступні значення:
Значення Пояснення Символ (Unicode) Коментар

eq

equals

=

ne

not equal

<>

gt

greater than

>

ge

greater than or equals to

>=

lt

less than

<

le

less than or equals to

in

notIn

isNull

is null

Якщо значення (value) = true, то перевірка колонки is null; якщо значення (value) = false, то перевірка колонки is not null.

similar

similar

~

  • Value - якщо потрібно передати текстове значення, то потрібно це значення обгорнути в одинарні лапки;

  • <ext:function> — дозволяє використовувати агрегатні функції (min(), max(), avg(), count(), sum()), при цьому поля таблиці, які використовуються в цих функціях, вилучаються з виводу (SELECT). Всі інші поля включаються в групування (GROUP BY).

3.2.2. Атрибути критеріїв пошуку та доступні значення

Атрибут searchType та доступні значення

Атрибут searchType в елементі <ext:column> вказує на тип операції, яку необхідно виконати для певної колонки при пошуку в таблиці.

Атрибут приймає наступні значення:

equal

повертає значення, що мають точну відповідність (дорівнюють) заданим.

Приклад 2. XML-схема
<ext:createSearchCondition name="search_condition">
        <ext:table name="table_one">
            <ext:column name="name" alias="to_name" searchType="equal"/>
            <ext:column name="type"/>
            <ext:function name="count" alias="cnt" columnName="uuid"/>
        </ext:table>
</ext:createSearchCondition>
startsWith

повертає значення зі вказаним префіксом, тобто значення, які "починаються із" заданої умови.

Приклад 3. Приклад XML-схеми
<ext:createSearchCondition name="pd_consent_subject_name_startswith">
    <ext:table name="pd_processing_consent_subject">
        <ext:column name="consent_id" fetchType="entity" />
        <ext:column name="scan_copy" />
        <ext:column name="legal_entity_name" sorting="asc" searchType="startsWith" />
        <ext:column name="consent_subject_id"/>
    </ext:table>
</ext:createSearchCondition>
contains

повертає значення, які мають збіги із вказаним значенням умови у будь-якому місці рядка (на початку, в середині, в кінці тощо).

Приклад 4. XML-схема
<ext:createSearchCondition name="SearchCondition" limit="1">
    <ext:table name="table_two" alias="tt">
        <ext:column name="name" alias="tt_name"/>
        <ext:column name="code" searchType="contains"/>
        <ext:function name="sum" alias="sm" columnName="code"/>
    </ext:table>
</ext:createSearchCondition>
in

повертає значення, що мають точну відповідність (дорівнюють) заданим значенням у масиві. Подібний до equal, але множинний.

Приклад 5. XML-схема
<ext:createSearchCondition name="findInAge">
    <ext:table name="user">
        <ext:column name="firstName" returning="true"/>
        <ext:column name="lastName" returning="true"/>
        <ext:column name="age" searchType="in"/>
    </ext:table>
</ext:createSearchCondition>
Приклад 6. HTTP-запит із використанням оператора in
https://..../findInAge?age=18,21,42
notIn

повертає значення, що не мають відповідність (не дорівнюють) заданим значенням у масиві. Він є протилежним до значення in атрибута searchType.

Приклад 7. XML-схема
<ext:createSearchCondition name="findNotInAge">
	<ext:table name="user">
		<ext:column name="firstName" returning="true"/>
		<ext:column name="lastName" returning="true"/>
		<ext:column name="age" searchType="notIn"/>
	</ext:table>
</ext:createSearchCondition>
Приклад 8. HTTP-запит із використанням оператора notIn
https://..../findNotInAge?age=18,21,42
between

повертає значення, що мають приналежність до заданого діапазону значень (в межах "з"-"до").

Приклад 9. XML-схема
<ext:createSearchCondition name="findBetweenAge">
    <ext:table name="user">
        <ext:column name="firstName" returning="true"/>
        <ext:column name="lastName" returning="true"/>
        <ext:column name="age" searchType="between"/>
    </ext:table>
</ext:createSearchCondition>
Приклад 10. HTTP-запит із використанням оператора between
https://..../findBetweenAge?ageFrom=18&ageTo=42
Атрибут limit та доступні значення

Атрибут limit визначає максимальну кількість результатів (рядків), які повертаються до API за пошуковою умовою.

Атрибут може приймати такі значення:
  • limit="all" — повертає усі результати за умовою пошуку;

  • limit="10" (тобто конкретні числа як String) — повертає обмежену кількість результатів за умовою пошуку.

Якщо не вказати атрибут, повертатимуться усі записи за умовою.

Наприклад, якщо атрибут limit у тегу <ext:createSimpleSearchCondition> має значення 10, це означає, що максимальна кількість результатів, які повертатимуться до API за пошуковою умовою, становитиме 10.

Приклад 11. Простий критерій пошуку із використанням атрибута limit
<changeSet author="registry owner" id="searchConditionSimpleTest">
    <comment>CREATE simple test search condition</comment>
    <ext:createSimpleSearchCondition name="search_condition_simple_test" indexing="true" limit="10">
        <ext:table name="search_condition_simple_test" alias="c" searchType="equal" searchColumn="person_full_name"/>
    </ext:createSimpleSearchCondition>
</changeSet>

Іншими словами, якщо у таблиці search_condition_simple_test більше 10 записів, які відповідають критеріям пошуку, що визначені у тегу <ext:createSimpleSearchCondition>, а атрибут limit має значення 10, то пошукова умова поверне лише перші 10 рядків.

Атрибут indexing та доступні значення

Атрибут indexing дозволяє автоматично створювати індекси на колонки, по яких відбувається пошук.

Атрибут може приймати такі значення:
  • indexing="true" — створює індекс;

  • indexing="false" — не створює індекс.

    Можна не вказувати цей атрибут взагалі, якщо не потрібно створювати індекси. indexing="false" вказується, коли необхідно явно зазначити це на схемі моделі даних.
Приклад 12. Простий критерій пошуку із використанням атрибута indexing
<changeSet author="registry owner" id="searchConditionSimpleTest">
    <comment>CREATE simple test search condition</comment>
    <ext:createSimpleSearchCondition name="search_condition_simple_test" indexing="true" limit="10">
        <ext:table name="search_condition_simple_test" alias="c" searchType="equal" searchColumn="person_full_name"/>
    </ext:createSimpleSearchCondition>
</changeSet>

Атрибут indexing="true" у тегу <ext:createSimpleSearchCondition> вказує на те, що створення індексу для вказаної колонки (person_full_name) має бути увімкнено.

У такому випадку, якщо атрибут indexing встановлений як true, то буде створено індекс для колонки person_full_name. Індекс дозволяє прискорити пошук даних в таблиці, зменшити час виконання запитів і зробити їх більш ефективними.

Атрибут returning та доступні значення

Атрибут returning вказує, чи повинно значення повертатися у відповіді до API.

Атрибут може приймати такі значення:
  • returning="true" — повертає значення;

  • returning="false" — не повертає значення.

Приклад 13. Критерій пошуку з атрибутом returning
<changeSet author="registry owner" id="searchCondition test">
	<comment>CREATE test search condition</comment>
	<ext:createSearchCondition name="searchConditionTest" indexing="true">
		<ext:table name="consent_data_person" alias="c">
			<ext:column name="person_full_name" searchType="equal" returning="true" type="text"/>
			<ext:column name="person_pass_number" returning="true" type="varchar"/>
			<ext:column name="consent_date" returning="true"/>
		</ext:table>
		<ext:table name="consent_subject" alias="cs">
			<ext:column name="legal_entity_name" alias="srch_legal_entity_name" returning="true"/>
			<ext:column name="edrpou" alias="srch_edrpou" returning="true"/>
		</ext:table>
		<ext:join type="inner">
			<ext:left alias="c">
				<ext:column name="consent_id"/>
			</ext:left>
			<ext:right alias="cs">
				<ext:column name="consent_id"/>
			</ext:right>
		</ext:join>
	</ext:createSearchCondition>
</changeSet>

Атрибут returning в елементі <ext:column> вказує на те, що значення відповідної колонки повинні повертатися у вихідному наборі даних запита. Якщо атрибут returning встановлено як true, значення відповідної колонки будуть включені до результату запита.

У цьому випадку, якщо атрибут returning встановлено як true, то для колонок person_full_name, person_pass_number та consent_date з таблиці consent_data_person, а також для колонок legal_entity_name та edrpou з таблиці consent_subject значення будуть включені до результату запита.

За замовчування returning="true". Якщо ви хочете виключити із результату значення певних колонок, вкажіть returning="false".

3.2.3. Використання операції JOIN з умовами AND та OR

Операція <ext:join> дозволяє поєднувати таблиці за певними умовами. Використовується при створенні критеріїв пошуку всередині тегу <ext:createSearchCondition> для отримання необхідних даних у зведених таблицях.

Є 3 основні типи поєднання таблиць за допомогою JOIN:
  • INNER JOIN — Перетин даних двох таблиць. Наприклад, <ext:join type="inner">.

  • LEFT JOIN — вивід даних з першої таблиці (зліва) та приєднання даних другої таблиці (справа), де це можливо. Наприклад, <ext:join type="left">.

  • RIGHT JOIN — протилежний до LEFT JOIN. Наприклад, <ext:join type="right">.

Операцію <ext:join> можна використовувати із додатковими умовами and та or, які визначаються в рамках тегу <ext:condition> як значення атрибута logicOperator.

Приклад 14. Використання inner join в рамках критерію пошуку
<ext:createSearchCondition name="get_regions_or_citi_regions">
	<ext:table name="katottg" alias="k">
		<ext:column name="katottg_id" />
		<ext:column name="name" alias="name_region" searchType="startsWith" />
		<ext:column name="category" />
	</ext:table>
	<ext:table name="katottg_category" alias="cat">
		<ext:column name="name" alias="name_category" />
		<ext:column name="code" />
	</ext:table>
	<ext:join type="inner">
		<ext:left alias="k">
			<ext:column name="category" />
		</ext:left>
		<ext:right alias="cat">
			<ext:column name="code" />
		</ext:right>
	</ext:join>
</ext:createSearchCondition>
Приклад 15. Використання inner join з умовою AND в рамках критерію пошуку
<ext:createSearchCondition name="get_regions_or_citi_regions">
	<ext:table name="katottg" alias="k">
		<ext:column name="katottg_id" />
		<ext:column name="name" alias="name_region" searchType="startsWith" />
		<ext:column name="category" />
	</ext:table>
	<ext:table name="katottg_category" alias="cat">
		<ext:column name="name" alias="name_category" />
		<ext:column name="code" />
	</ext:table>
	<ext:join type="inner">
		<ext:left alias="k">
			<ext:column name="category" />
		</ext:left>
		<ext:right alias="cat">
			<ext:column name="code" />
		</ext:right>
		<ext:condition logicOperator="and" columnName="k.category" operator="eq"  value="'K'"/>
	</ext:join>
</ext:createSearchCondition>
Приклад 16. Використання inner join з умовою OR в рамках критерію пошуку
<ext:createSearchCondition name="get_regions_or_citi_regions">
	<ext:table name="katottg" alias="k">
		<ext:column name="katottg_id" />
		<ext:column name="name" alias="name_region" searchType="startsWith" />
		<ext:column name="category" />
	</ext:table>
	<ext:table name="katottg_category" alias="cat">
		<ext:column name="name" alias="name_category" />
		<ext:column name="code" />
	</ext:table>
	<ext:join type="inner">
		<ext:left alias="k">
			<ext:column name="category" />
		</ext:left>
		<ext:right alias="cat">
			<ext:column name="code" />
		</ext:right>
		<ext:condition logicOperator="or" columnName="k.category" operator="eq"  value="cat.code">
			<ext:condition logicOperator="and" columnName="k.category" operator="ne"  value="'K'"/>
			<ext:condition logicOperator="and" columnName="k.level" operator="eq"  value="'1'"/>
                </ext:condition>
	</ext:join>
</ext:createSearchCondition>

Більше про використання JOIN та додаткові умови дивіться на сторінці Сценарії поєднання таблиць за допомогою JOIN із додатковими умовами AND та OR.

3.3. Тег видалення критерію пошуку

Назва change type: <dropSearchCondition>

Цей тег надає можливість видалити критерій пошуку.

Приклад XML-схеми
<ext:dropSearchCondition name="search_condition"/>

За детальною інформацією щодо сценарію використання видалення критерію пошуку у секцій XML-шаблон видалення критерію пошуку. відповідного документа.

3.4. Тег визначення точок інтеграції з іншими реєстрами, зовнішніми системами та ШБО "Trembita"

Назва change type: <exposeSearchCondition>

Цей тег надає можливість визначити точки інтеграції з іншими реєстрами, зовнішніми системами та ШБО "Trembita".

Приклад XML-схеми
<ext:exposeSearchCondition name="viewForDrop" platform="true" externalSystem="true" trembita="false"/>
Тег приймає 4 атрибути:
  • name — назва критерію пошуку (search condition);

  • platform — для надання доступу до представлень та REST API реєстру для іншого реєстру на Платформі;

  • externalSystem — для надання доступу до представлень та REST API реєстру для зовнішньої системи;

  • trembita — Надання доступу до представлень реєстру для сервісів-учасників СЕВ ДЕІР через інтерфейс ШБО "Трембіта" за протоколом SOAP.

4. Керування користувацькими типами даних

4.1. Тег створення перелічувального типу даних (ENUM)

Назва change type: <createType> <ext:asEnum>

Цей тег надає можливість створити перелічувальний тип даних (ENUM).

Приклад XML-схеми
<ext:createType name="type_gender">
    <ext:asEnum>
        <ext:label translation="Жіноча">FEMALE</ext:label>
        <ext:label translation="Чоловіча">MALE</ext:label>
    </ext:asEnum>
</ext:createType>

4.2. Тег створення композитного типу даних (Composite)

Назва change type: <createType> <ext:composite>

Цей тег надає можливість створити композитний тип даних (Composite).

Приклад XML-схеми
<ext:createType name="field_access_type">
    <ext:composite>
        <ext:column name="masked_value" type="TEXT" collation="uk_UA.utf8"/>
        <ext:column name="opened" type="BOOLEAN"/>
         <ext:column name="private" type="BOOLEAN"/>
        <ext:column name="confidential" type="BOOLEAN"/>
        <ext:column name="secret" type="BOOLEAN"/>
        <ext:column name="service" type="BOOLEAN"/>
    </ext:composite>
 </ext:createType>
За детальною інформацією щодо створення типу даних ENUM та Composite зверніться до секції Cхема створення типів даних ENUM та Composite відповідного документа.

4.3. Тег видалення типу даних

Назва change type: <dropType>

Цей тег надає можливість видалити тип даних.

Приклад XML-схеми
<ext:dropType name=" type_gender"/>

4.4. Тег створення користувацького типу даних з перевіркою на певні умови

Назва change type: <createDomain>

Цей тег надає можливість створити користувацький тип даних з перевіркою на певні умови.

Приклад XML-схеми
<ext:createDomain name="dn_passport_num"
dataType="CHAR(8)">
    <ext:constraint implementation="NOT NULL"/>
    <ext:constraint name="passport_number_chk"
implementation="CHECK (VALUE ~ '^[АВЕІКМНОРСТХ]{2}[0-9]{6}$)"/>
</ext:createDomain>
За детальною інформацією щодо створення типу даних Domain зверніться до секції Схема створення типу даних Domain відповідного документа.

4.5. Тег видалення користувацького типу даних

Назва change type: <dropDomain>

Цей тег надає можливість видалити користувацький тип даних.

Приклад XML-схеми
<ext:dropDomain name=" dn_passport_num"/>

5. Створення типу зв’язку "Багато до багатьох"

Назва change type: <createMany2Many>

Цей тег надає можливість створити особливий тип зв’язку "Багато до багатьох", що виконує наступні функції:

  • створює відбиток даних (view), розгортаючи масив у рядки;

  • створює індекс.

Приклад XML-схеми
<ext:createMany2Many
    mainTableName="table1"
    mainTableKeyField="column_id"
    referenceTableName="table2"
    referenceKeysArray="columns"/>

де “columns” має тип "UUID[ ]" -"Масив ідентифікаторів"

За детальною інформацією щодо створення зв’язків між таблицями зверніться до розділу Схема моделювання зв’язків між сутностями в БД відповідного документа.

6. Збереження декількох сутностей в рамках однієї транзакції

Назва change type: <createCompositeEntity>

Цей тег надає можливість зберегти декілька сутностей в рамках однієї транзакції.

Приклад XML-схеми
<ext:createCompositeEntity name="nested_tables">
    <ext:nestedEntity table="table_one">
        <ext:link column="two_column_id" entity="table_two"/>
    </ext:nestedEntity>
    <ext:nestedEntity name="tableTwo" table="table_two">
         <ext:link column="three_column_id" entity="table_three"/>
     </ext:nestedEntity>
     <ext:nestedEntity name="tableThree" table="table_three"/>
</ext:createCompositeEntity>

7. Генерація ендпоінтів для часткового оновлення сутності в БД

Назва change type: <partialUpdate>

Цей тег надає можливість генерувати ендпоінти для зміни окремих частин сутності.

Приклад XML-схеми
<partialUpdate table="table_name">
    <column>column_name1</column>
    <column>column_name2</column>
    <column>column_name3</column>
</partialUpdate>

8. Керування аналітичними представленнями

8.1. Тег створення аналітичного представлення

Назва change type: <createAnalyticsView>

Цей тег надає можливість створити аналітичні представлення на репліці.

Приклад XML-схеми
<ext:createAnalyticsView name="report_table_name">
    <ext:table name="table_name">
        <ext:column name="column1"/>
         <ext:column name=" column2"/>
    </ext:table>
</ext:createAnalyticsView>

8.2. Тег видалення аналітичного представлення

Назва change type: <dropAnalyticsView>

Цей тег надає можливість видалити аналітичні представлення на репліці.

Приклад XML-схеми
<ext:dropAnalyticsView name="report_table_name"/>

8.3. Тег створення індексу

Назва change type: <createAnalyticsIndex>

Цей тег надає можливість створити індекс лише на репліці.

Приклад XML-схеми
<ext:createAnalyticsIndex tableName="table" indexName="idx_table__column">
    <column name="column"/>
</ext:createAnalyticsIndex>

9. Керування правами доступу до аналітичних даних

За детальною інформацією щодо прав доступу до аналітичних даних зверніться до розділу Права доступу до аналітичних даних відповідного документа.

9.1. Тег надання доступу до всіх аналітичних представлень

Назва change type: <grantAll>

Цей тег надає можливість доступу до всіх аналітичних представлень для певної ролі.

Приклад XML-схеми
<ext:grantAll>
    <ext:role name="analytics_officer"/>
</ext:grantAll>

9.2. Тег видалення доступу до всіх аналітичних представлень

Назва change type: <revokeAll>

Цей тег надає можливість видаляти права доступу до всіх аналітичних представлень для певної ролі.

Приклад XML-схеми
<ext:revokeAll>
    <ext:role name="analytics_officer"/>
</ext:revokeAll>

9.3. Тег надання доступу до окремого аналітичного представлення

Назва change type: <grant>

Цей тег надає можливість доступу до окремого аналітичного представлення для певної ролі.

Приклад XML-схеми
<ext:grant>
	<ext:role name="analytics_officer">
		<ext:view name="report_pd_processing_consent"/>
	</ext:role>
	<ext:role name="analytics_officer">
		<ext:view name="report_pd_processing_consent"/>
	</ext:role>
</ext:grant>

9.4. Тег видалення доступу до окремого аналітичного представлення

Назва change type: <revoke>

Цей тег надає можливість видаляти права доступу до окремого аналітичного представлення для певної ролі.

Приклад XML-схеми
<ext:revoke>
	<ext:role name="analytics_officer">
		<ext:view name="report_pd_processing_consent"/>
	</ext:role>
</ext:revoke>

10. Використання вкладених структур в таблицях БД реєстру за вказаним параметром

10.1. Тег використання вкладених структур

Назва change type: <tableReadParameters>

Цей тег надає можливість моделювати вкладені структури в таблицях БД реєстру за вказаним параметром.

Для використання у критеріях пошуку (search conditions) додано атрибут fetchType. Його зазначають для колонки, що містить масив даних.

Застосовується для двох типів зв’язку:

  • Колонок, в яких визначено тип зв`яку "Багато до багатьох" (Many2Many);

  • Колонок, в яких є зовнішній ключ (foreign key) до іншої таблиці.

Атрибут fetchType приймає наступні значення:

  • id — отримати ідентифікатори (поведінка за замовчуванням);

  • entity — отримати інформацію з таблиці, до якої налаштовано посилання.

Приклад XML-схеми з тегом <tableReadParameters>
<ext:tableReadParameters table="person_type_vpo">
    <ext:column name="consents" fetchType="entity"/>
</ext:tableReadParameters>
Приклад XML-схеми з атрибутом fetchType
<ext:createSearchCondition name="vpo_person_equals_id_with_fetch_type_person">
    <ext:table name="vpo_person_many_types">
        <ext:column name="consent_id" fetchType="entity" />
        <ext:column name="scan_copy" />
        <ext:column name="legal_entity_name" sorting="asc" searchType="startsWith" />
        <ext:column name="consent_subject_id"/>
    </ext:table>
</ext:createSearchCondition>
Приклад 17. Використання тегу <tableReadParameters> та атрибуту fetchType при моделюванні даних
  • Таблиця 1 має зв’язок many2many з Таблицею 2.

  • Таблиця 1 має колонку з масивом id (зовнішні ключі до Таблиці 2).

  • Відповідь при запиті до ресурсу з Таблиці 1 повинна мати у полі з посиланнями до Таблиці 2 інформацію, відповідну до записів з Таблиці 2.

Таблиця 1
{
   "vpoId":"57152fa5-742c-4b1e-bd53-acc36524cc2d",
   "vpoLastName":"Петренко",
   "vpoFirstName":"Петро",
   "vpoSecondName":"Іванович",
   "personTypes":[
      "2d89ffea-118c-4be9-9fa0-c3007991c811",
      "0d756563-d6a4-46fe-a0c8-ddf4a935ec35"
   ]
}
Таблиця 2
[
   {
      "constantCode":"1100",
      "name":"Багатодітна сім'я'",
      "personTypeVpoId":"2d89ffea-118c-4be9-9fa0-c3007991c811"
   },
   {
      "constantCode":"1200",
      "name":"Діти",
      "personTypeVpoId":"0d756563-d6a4-46fe-a0c8-ddf4a935ec35"
   }
]
Приклад створення критерію пошуку vpo_person_type_contains_name
<changeSet author="registry owner" id="create SC vpo_person_equals_id_person_with_fetch_many_types">
    <ext:createSearchCondition name="vpo_person_equals_id_person_with_fetch_many_types">
        <ext:table name="vpo_person_many_types">
            <ext:column name="vpo_person_many_id" searchType="equal"/>
            <ext:column name="vpo_first_name" />
            <ext:column name="vpo_last_name"/>
            <ext:column name="vpo_second_name"/>
            <ext:column name="person_types" fetchType="entity"/>
        </ext:table>
    </ext:createSearchCondition>
</changeSet>
Приклад створення таблиці з fetchType
<changeSet id="table t_person_table_many2many_fetch_id" author="registry owner">
    <createTable tableName="t_person_table_many2many_fetch_id" ext:isObject="true" ext:historyFlag="true" remarks="VPO">
        <column name="id"  type="UUID" defaultValueComputed="uuid_generate_v4()" remarks="Ідентифікатор vpo">
            <constraints nullable="false" primaryKey="true" primaryKeyName="pk_t_person_table_many2many_fetch_id"/>
        </column>
        <column name="name" type="TEXT" remarks="iм'я">
            <constraints nullable="false"/>
        </column>
        <column name="person_types" type="UUID[]" remarks="Масив id"/>
    </createTable>
    <ext:createMany2Many mainTableName="t_person_table_many2many_fetch_id"
                         mainTableKeyField="id"
                         referenceTableName="person_type_vpo"
                         referenceKeysArray="person_types"/>
    <ext:tableReadParameters table="t_person_table_many2many_fetch_id">
        <ext:column name="person_types" fetchType="entity"/>
    </ext:tableReadParameters>
</changeSet>
Приклад результат виконання запита за замовчуванням (search conditions або resource)
{
   "vpoId":"57152fa5-742c-4b1e-bd53-acc36524cc2d",
   "vpoLastName":"Петренко",
   "vpoFirstName":"Петро",
   "vpoSecondName":"Іванович",
   "personTypes":[
      "2d89ffea-118c-4be9-9fa0-c3007991c811",
      "0d756563-d6a4-46fe-a0c8-ddf4a935ec35"
   ]
}
Приклад результат виконання запита з атрибутом fetchType (search conditions або resource)
{
   "vpoId":"57152fa5-742c-4b1e-bd53-acc36524cc2d",
   "vpoLastName":"Петренко",
   "vpoFirstName":"Петро",
   "vpoSecondName":"Іванович",
   "personTypes":[
      {
         "id":"2d89ffea-118c-4be9-9fa0-c3007991c811",
         "constantCode":"1100",
         "name":"Багатодітна сім'я'"
      },
      {
         "id":"0d756563-d6a4-46fe-a0c8-ddf4a935ec35",
         "constantCode":"1200",
         "name":"Діти"
      }
   ]
}

11. Керування процесом перевірки коду (Code review pipeline)

У моделі даних можна налаштовувати атрибути, які дозволяють виключати окремі набори змін (changeSets) або цілі файли із процесу розгортання у пайплайні Code Review. Це дозволяє прискорити процес проходження code-review при роботі з моделлю даних реєстру в рамках версій-кандидатів у Кабінеті адміністратора регламентів (детальніше про особливості роботи з моделлю даних в рамках версій-кандидатів — див. на сторінці Таблиці моделі даних реєстру та їх структури).

Code Review pipeline — це процес перевірки коду, який забезпечує, що розроблюваний код відповідає вимогам якості та стандартам кодування.

Основним Code Review пайплайном у регламенті вашого реєстру є MASTER-Code-review-registry-regulations. Знайти його можна за посиланням:
https://admin-tools-<службова-назва-реєстру>.apps.envone.dev.registry.eua.gov.ua/cicd/job/registry-regulations/job/MASTER-Code-review-registry-regulations/.

При роботі із моделлю даних реєстру в рамках версій-кандидатів, Code review пайплайн додатково розгортає тимчасову репліку бази даних реєстру. Відповідний крок показаний на зображенні нижче.

data model code review 01
Зображення 1. Загальний вигляд пайплайну MASTER-Code-review-registry-regulations

Опис налаштування у моделі даних

Виключити зміни із Code review пайплайну можна за допомогою атрибута context="!code-review" двома способами:

  1. Виключити конкретний набір змін (changeSet). Для цього необхідно додати атрибут context="!code-review" на рівні тегу <changeSet>.

    image
    Зображення 2. Виключення конкретного changeSet із Code review пайплайну
  2. Виключити цілий файл зі змінами. Для цього необхідно додати атрибут context="!code-review" на рівні тегу <include>.

    image
    Зображення 3. Виключення файлу із Code review пайплайну

Якщо у тегу вже існує атрибут context, зокрема context="pub", то значення !code-review необхідно додати до цього атрибута через оператор and. Наприклад:

context="pub and !code-review"

Якщо додати !code-review до changeSet, який вже був розгорнутий, то у першому Code review пайплайні цей changeSet все одно виконається. Однак, після того, як застосувати цей changeSet ще раз, але вже з context="!code-review", він буде пропущений у наступних Code review пайплайнах.

Проте, якщо додати !code-review до абсолютно нового changeSet, то цей changeSet буде ігнорований не лише у першому Code review пайплайні, а й в усіх наступних.