1. Главная
  2. Документы
  3. Процессы
  4. Итераторы (перебор коллекций)

Итераторы (перебор коллекций)

Упорядоченные наборы данных


Во многих задачах требуется обрабатывать группы связанных объектов - упорядоченные наборы данных.

Существует несколько спсобов группировки данных, мы будем использовать следующую терминологию:

  • свойство - единица объекта, пара ключ-значение
  • объект - набор свойств
  • элемент - единица в составе в массива, массива могут иметь любой тип, в том числе тип массива
  • массив - набор элементов, индексируются от нуля до n-1 элементов
  • коллекция - набор объектов и массивов

Для наглядного представления группировки данных, используем JSON формат (форматы могут быть разные, тут выбран только для примера):

Рис. 1 Пример группировки данных

Адресный доступ к данным


В системе применена широко распростроненная система адресного доступа к данным использующая точечную и скобочную нотации (в общем виде) :

имя_коллекции.имя_массива [индекс_элемента].имя_объекта.имя_свойства

Порядок массивов, объектов и свойств определеяется структурой набора данных.

Чтобы получить доступ к данным  по иерархии, просто нужно использовать требуемые имена свойств и индексы массивов. 


Рассмотрим на примере структуры Рисунка 1. Если вся коллекция называется module, то для того чтобы получить:

  • номер первого телефона, строка запроса будет иметь вид: module.phoneNumbers[0].number - вернет "212 555-3346"
  • название штата: module.address.city - вернет "New York"

Дополнительно, в некоторых случаях, когда данные могут иметь не фиксированную структру, в системе предусмотренны специальные функции доступа: GetItem(), GetValue() позволяющие получить доступ к элементам и их занчениям по именам.

Итераторы


Итератор используется для выполнения настраиваемого перебора коллекции или массива.

Описание работы

Работу Итератора, в общем виде, можно представить следующим образом:

  1. На вход Итератора подается массив, содержащий N - элементов
  2. Итератор разбивает исходный массив на N - объектов
  3. Итератор выполняет цикл в N - шагов
  4. N - раз выполняются Действия, расположенные внутри Итератора (Действия могут быть не связанны с обработкой исходного массива)
  5. В действиях, на каждом шаге цикла, доступны свойства объекта, i - го элемента исходного массива
  6. После завершения цикла, Процесс перходит на обработку следующих Модулей
  7. Возможно выполение вложенных циклов.

Виды Итераторов

В системе предусмотренно несколько видов Итераторов:

  1. Внешний Итератор (Iterator) - самостоятельный Модуль Процесса (см. Пример 1 и Пример 2);
  2. Внутренний Итератор (Iterator) - встроенная функциональность Модулей: Catalog, Operation, Register, Mapping (TempTable) (см. Пример 3);
  3. Итератор-функция {{ For In }} - {{ End }} - имплементраный итератор-функция доступная в Модулях: HTTP (request), SMTP (send email), в настройке дополнительных форм Операции и настройке Комплекстного отчета. Применяется для встраивания наборов данных текстовые формы. (см. Пример 4 )

Внешний Итератор (Iterator)


Внешний Итератор (Iterator) представлен в Процессе как самостоятельный Модуль ( см. Iterator )

Применяется в следующих случаях:

  1. При необходимости выполнения нескольких действий (выполняемых другими Модулями) внутри цикла Итератора.
  2. При необходимости выполнения вложенных циклов. Вложенные циклы могут быть организованны как внешними Итераторами, так и Внутренними. Для ограничения границы действия модуля Iterator используйте модуль Iterator (stop).
  3. При необходимости обработки/перебора Массива представленного в виде Объекта (см. Рисунок 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. Разбор Массива представленного в виде Объекта, внешним Итератором.

Рис.1 Общий Вид процесса
Рис.2 Настройка Модуля HTTP
Рис. 3 Результат выполнения Модуля HTTP
Рис. 4 Настройка Модуля ITERATOR
Рис. 5 настройка Модуля MAPPING (TempTable)
Рис. 6 Результат выполения Модуля MAPPING (TempTable)

Пример 2. Органичение зоны Итератора.

Рис. 7 Пример Процесса с органичением зоны Итератора

Для доступа к данным вне зоны Итератора, в Модуле MAPPING (TempTable) добавлена настройка Result name

Рис. 8 Пример настройки Модуля MAPPING (TempTable) для получения данных вне Итератора

Пример 3. Разбор Массива внутренним Итератором.

Рис. 9 Пример Процесса с внутренним Итератором
Рис. 10 Результат выполнения Модуля HTTP, исходные данные для итератора
Рис. 11 Пример настройки Модуля MAPPING (TempTable) и внутреннего итератора в нем
Рис. 12 Результат выполения Модуля MAPPING (TempTable) и работы внутреннего Итератора