Коллекция

Коллекция - тип данных, позволяющий выводить в объекте списки других объектов. Данные объекты могут быть объектами любого класса включая исходный.

Ссылки разделяются через запятую. Все значения из последовательности ссылок и запятых хранятся строкой в базе данных.

Способы задания коллекций:

с точки зрения используемых полей атрибутивной части меты классов

  1. один-ко-многим - классическая связь дочернего объекта на родительский объект. Означает наличие контейнера и вложенного объекта с ссылкой на контейнер. В контейнере необходимо указать коллекцию, а у коллекции указать ссылочный атрибут вложенного объекта, по которому формируется связь. См. Обратные ссылки
  2. многие-ко-многим - определяется через коллекцию без ссылок и класса вложенных элементов - связи создаются при помещении в коллекцию и хранятся как отдельные сущности в БД. См. Коллекции.
  3. обратная коллекция - связь один-ко-многим, но в обратную сторону - со стороны объекта на который идут ссылки. Задается через 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 - извлечение из коллекции. Алгоритм для создания и редактирования одинаков. Действия с коллекциями выполняются после создания или сохранения контейнера.

Принцип работы коллекций на форме создания и редактирования принципиально разный:

  • На форме создания взаимодействие с сервером требуется лишь для получения и отображения в таблице выбранного/созданного объекта коллекции
  • На форме редактирования реализована возможность получения ответа сервера при необходимости, и изменение параметров выборки при запросе, в зависимости от выполненных действий над коллекцией.