Упорядоченные наборы данных
Во многих задачах требуется обрабатывать группы связанных объектов - упорядоченные наборы данных.
Существует несколько спсобов группировки данных, мы будем использовать следующую терминологию:
- свойство - единица объекта, пара ключ-значение
- объект - набор свойств
- элемент - единица в составе в массива, массива могут иметь любой тип, в том числе тип массива
- массив - набор элементов, индексируются от нуля до n-1 элементов
- коллекция - набор объектов и массивов
Для наглядного представления группировки данных, используем JSON формат (форматы могут быть разные, тут выбран только для примера):
Адресный доступ к данным
В системе применена широко распростроненная система адресного доступа к данным использующая точечную и скобочную нотации (в общем виде) :
имя_коллекции.имя_массива [индекс_элемента].имя_объекта.имя_свойства
Порядок массивов, объектов и свойств определеяется структурой набора данных.
Чтобы получить доступ к данным по иерархии, просто нужно использовать требуемые имена свойств и индексы массивов.
Рассмотрим на примере структуры Рисунка 1. Если вся коллекция называется module, то для того чтобы получить:
- номер первого телефона, строка запроса будет иметь вид: module.phoneNumbers[0].number - вернет "212 555-3346"
- название штата: module.address.city - вернет "New York"
Дополнительно, в некоторых случаях, когда данные могут иметь не фиксированную структру, в системе предусмотренны специальные функции доступа: GetItem(), GetValue() позволяющие получить доступ к элементам и их занчениям по именам.
Итераторы
Итератор используется для выполнения настраиваемого перебора коллекции или массива.
Описание работы
Работу Итератора, в общем виде, можно представить следующим образом:
- На вход Итератора подается массив, содержащий N - элементов
- Итератор разбивает исходный массив на N - объектов
- Итератор выполняет цикл в N - шагов
- N - раз выполняются Действия, расположенные внутри Итератора (Действия могут быть не связанны с обработкой исходного массива)
- В действиях, на каждом шаге цикла, доступны свойства объекта, i - го элемента исходного массива
- После завершения цикла, Процесс перходит на обработку следующих Модулей
- Возможно выполение вложенных циклов.
Виды Итераторов
В системе предусмотренно несколько видов Итераторов:
- Внешний Итератор (Iterator) - самостоятельный Модуль Процесса (см. Пример 1 и Пример 2);
- Внутренний Итератор (Iterator) - встроенная функциональность Модулей: Catalog, Operation, Register, Mapping (TempTable) (см. Пример 3);
- Итератор-функция {{ For In }} - {{ End }} - имплементраный итератор-функция доступная в Модулях: HTTP (request), SMTP (send email), в настройке дополнительных форм Операции и настройке Комплекстного отчета. Применяется для встраивания наборов данных текстовые формы. (см. Пример 4 )
Внешний Итератор (Iterator)
Внешний Итератор (Iterator) представлен в Процессе как самостоятельный Модуль ( см. Iterator )
Применяется в следующих случаях:
- При необходимости выполнения нескольких действий (выполняемых другими Модулями) внутри цикла Итератора.
- При необходимости выполнения вложенных циклов. Вложенные циклы могут быть организованны как внешними Итераторами, так и Внутренними. Для ограничения границы действия модуля Iterator используйте модуль Iterator (stop).
- При необходимости обработки/перебора Массива представленного в виде Объекта (см. Рисунок 3)
Внутренний Итератор
Внутренний Итератор встроен в Модули Catalog, Operation, Register, Mapping (TempTable)
Прост в настройке (см. Пример 3 ), применяется в большенстве случаев, при записи/обновлении данных Массива (вида элемент-ключ-значение) в Catalog, Operation, Register, Mapping (TempTable)
Итератор-функция {{ For In }} - {{ End }}
Итератор-функция {{ For In }} доступен в Модулях: HTTP (request), SMTP (send email), в настройке дополнительных форм Операции и настройке Комплекстного отчета.
Применяется для встраивания наборов данных в текстовые формы. (см. Пример 4 )
Синтаксис:
{{ For имя_объекта In имя_массива }} - начало итератора
...........
повторяемый текст {{ имя_объекта.имя_свойста }} - встраиваемые данные
...........
{{ end }} - окончание итератора
где, имя_массива - адресс к массиву данных
Возможно создание встроенных циклов, с использованием функции {{ If условие }} - {{ end }}
Синтаксис:
{{ For имя_объекта_1 In имя_массива_1 }} - начало итератора #1
...........
повторяемый текст {{ имя_объекта_1.имя_свойста }} - встраиваемые данные массива 1
...........
{{ For имя_объекта_2 In имя_массива_2 }} - начало итератора #2
{{ If имя_объекта_1.имя_свойста = имя_объекта_2.имя_свойста }} - проверка условия
...........
повторяемый текст {{ имя_объекта_2.имя_свойста }} - встраиваемые данные массива 2
{{ end }} - окончание условия
{{ end }} - окончание итератора #2
{{ end }} - окончание итератора #1
где, массив_1 и массив_2 - должны содержать свойства по занчениям которых будет производится потбор данных при вложенном выводе
Примеры
Пример 1. Разбор Массива представленного в виде Объекта, внешним Итератором.
Пример 2. Органичение зоны Итератора.
Для доступа к данным вне зоны Итератора, в Модуле MAPPING (TempTable) добавлена настройка Result name