Коллекция¶
Коллекция - тип данных, позволяющий выводить в объекте списки других объектов. Данные объекты могут быть объектами любого класса включая исходный.
Ссылки разделяются через запятую. Все значения из последовательности ссылок и запятых хранятся строкой в базе данных.
Способы задания коллекций:¶
с точки зрения используемых полей атрибутивной части меты классов
один-ко-многим
- классическая связь дочернего объекта на родительский объект. Означает наличие контейнера и вложенного объекта с ссылкой на контейнер. В контейнере необходимо указать коллекцию, а у коллекции указать ссылочный атрибут вложенного объекта, по которому формируется связь. См. Обратные ссылкимногие-ко-многим
- определяется через коллекцию без ссылок и класса вложенных элементов - связи создаются при помещении в коллекцию и хранятся как отдельные сущности в БД. См. Коллекции.обратная коллекция
- связь один-ко-многим, но в обратную сторону - со стороны объекта на который идут ссылки. Задается через backColl. См. Обратные коллекции.
Атрибут коллекция в формате JSON¶
Пример¶
{
"orderNumber": 50,
"name": "table",
"caption": "Таблица",
"type": 14,
"size": null,
"decimals": 0,
"allowedFileTypes": null,
"maxFileCount": 0,
"nullable": true,
"readonly": false,
"indexed": false,
"unique": false,
"autoassigned": false,
"hint": null,
"defaultValue": null,
"refClass": "",
"itemsClass": "collRefCatalog@develop-and-test",
"backRef": "",
"backColl": "",
"binding": "",
"semantic": null,
"selConditions": [],
"selSorting": [],
"selectionProvider": null,
"indexSearch": false,
"eagerLoading": false,
"formula": null
}
NB: Если коллекция ссылается на класс, содержащий множество потомков, то при заполнении коллекции будет возможность создавать объекты как родительского, так и дочерних классов.
Коллекции вместе с объектом грузятся по семантике, заданной в мете класса-коллекции или атрибута-коллекции.
Обратная ссылка в контексте коллекций¶
Обратная ссылка в контексте коллекций образуется следующим образом:
- Создается обычная коллекция с указанием ссылочного класса
- В ссылочном классе должен быть атрибут-ссылка, ссылающийся на исходный класс и имеющий свойство
unique
равнымfalse
. Значение атрибут-ссылке присваивается сразу при создании связи с коллекцией, без необходимости сохранения формы - В исходном классе обычной коллекции заполняем свойство
"backRef"
- туда записывается код атрибута-ссылки из ссылочного класса
Атрибут обратная ссылка в формате JSON¶
Пример¶
{
"orderNumber": 30,
"name": "coll",
"caption": "Коллекция с обратной ссылкой",
"type": 14,
"size": null,
"decimals": 0,
"allowedFileTypes": null,
"maxFileCount": 0,
"nullable": true,
"readonly": false,
"indexed": false,
"unique": false,
"autoassigned": false,
"hint": null,
"defaultValue": null,
"refClass": null,
"itemsClass": "ref_backcoll_ref@develop-and-test",
"backRef": "ref_backcoll_ref",
"backColl": "",
"binding": "",
"semantic": "backcoll_data",
"selConditions": [],
"selSorting": [],
"selectionProvider": null,
"indexSearch": false,
"eagerLoading": true,
"formula": null
}
Режимы отображения атрибута типа «Коллекция» на форме:¶
Режимы отображения задаются в мете представления. Могут определяться при помощи свойства "mode"
, либо задаваться шаблоном в свойстве "options"
.
- mode: 4 - «Облако тегов» хранит значения одного или нескольких объектов по ссылке в виде тегов, наименование которых определяется семантикой объекта по ссылке.
- mode: 3 - «Таблица» хранит значения одного или нескольких объектов по ссылки в таблице, колонки которой предопределены для формы представления.
Пример¶
{
"caption": "Таблица",
"type": 3,
"property": "table",
"size": 2,
"maskName": null,
"mask": null,
"mode": 3,
"fields": [],
"columns": [],
...
},
...
- «Комментарий» - задается аналогично режиму отображения «Таблица», но с наложением шаблона, указанном в свойстве
"options"
. Представляет собой поле, которое содержит данные, зараннее предопределенные в свойстве"columns"
для объекта по ссылке. Предназначено, в основном, для обсуждения информации по объекту на определенном этапе бизнес-процесса.
Пример¶
{
"caption": "Коментарий",
"type": 3,
"property": "coment",
"size": 2,
"maskName": null,
"mask": null,
"mode": 3,
"fields": [],
"columns": [
{
"sorted": true,
"caption": "Дата",
"type": 120,
"property": "date",
...
},
{
"sorted": true,
"caption": "Подтверждение (Обоснование)",
"type": 7,
"property": "descript",
...
},
{
"caption": "Ведущий",
"type": 2,
"property": "owner",
...
}
],
"actions": null,
"commands": [
{
"id": "CREATE",
"caption": "Создать",
"visibilityCondition": null,
"enableCondition": null,
"needSelectedItem": false,
"signBefore": false,
"signAfter": false,
"isBulk": false
},
{
"id": "EDIT",
"caption": "Править",
"visibilityCondition": null,
"enableCondition": null,
"needSelectedItem": true,
"signBefore": false,
"signAfter": false,
"isBulk": false
}
],
"orderNumber": 80,
...
"tags": null,
"options": {
"template": "comments",
"comments": {
"textProperty": "descript",
"userProperty": "owner",
"parentProperty": "answlink",
"photoProperty": "owner_ref.foto.link",
"dateProperty": "date"
}
}
}
Обратная коллекция¶
Пример коллекции выше преобразуется для обратной коллекции следующим образом:
{
"orderNumber": 30,
"name": "backcoll",
"caption": "Обратная коллекции",
"type": 14,
"size": null,
"decimals": 0,
"allowedFileTypes": null,
"maxFileCount": 0,
"nullable": true,
"readonly": false,
"indexed": false,
"unique": false,
"autoassigned": false,
"hint": null,
"defaultValue": null,
"refClass": "",
"itemsClass": "coll_backcoll_coll",
"backRef": "",
"backColl": "coll",
"binding": "",
"semantic": "backcoll_data",
"selConditions": [],
"selSorting": [],
"selectionProvider": null,
"indexSearch": false,
"eagerLoading": true,
"formula": null
}
Обратите внимание на указание в свойстве "backColl"
дополнительного значения - имя атрибута из класса в коллекции (из примера это coll)
Таким образом, реализуется связь многие-ко-многим
без промежуточного класса. Не только атрибут "backcoll"
с типом «Коллекция» может содержать несколько ссылок, но и объекты по ссылкам также могут содержать в своей коллекции «coll» несколько ссылок на объекты исходного класса.
Внимание:¶
"type": 14
- тип атрибута «Коллекция»"backColl"
- название ссылочного атрибута типа коллеции, ссылающегося на исходный класс с коллекцией"itemsClass"
- название класса, объекты которого могут хранить свои идентификаторы в коллекции и, таким образом, формировать связь к объекту по идентификатору"backRef"
- атрибут-ссылка из ссылочного класса, указанного в"itemsClass"
- При указании класса-родителя есть возможность создавать объекты родительского и дочерних классов
- Коллекции вместе с объектом грузятся по семантике, заданной в мете класса-коллекции или атрибута-коллекции
Схема обработки коллекций и формат хранения в БД¶
Для сохранения коллекции, необходимо передать в соответствующем ей атрибуте объекта массив действий вида:
"collection": [
{"action": "put", "id": "1234"},
{"action": "put", "id": "1235"},
{"action": "put", "id": "1236"},
{"action": "eject", "id": "1230"}
]
Порядок объектов должен соответствовать порядку выполнения соответствующих действий. Коды операций: put
- добавление в коллекцию, eject
- извлечение из коллекции. Алгоритм для создания и редактирования одинаков. Действия с коллекциями выполняются после создания или сохранения контейнера.
Принцип работы коллекций на форме создания и редактирования принципиально разный:
- На форме создания взаимодействие с сервером требуется лишь для получения и отображения в таблице выбранного/созданного объекта коллекции
- На форме редактирования реализована возможность получения ответа сервера при необходимости, и изменение параметров выборки при запросе, в зависимости от выполненных действий над коллекцией.