ACTION

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

DEFINE ACTION объявляет действие, к которому затем можно многократно обращаться с помощью DO.

DO ACTION можно использовать в теле условия EVALUATE IF или цикла EVALUATE FOR.

DEFINE ACTION

Объявляет ACTION, состоящее из указанных выражений.

Синтаксис

  1. DEFINE ACTION — объявление действия.
  2. Именованное выражение, по которому объявляемое действие доступно далее в запросе.
  3. В круглых скобках — список именованных выражений, по которым внутри действия можно обращаться к параметрам.
  4. Ключевое слово AS.
  5. Список выражений верхнего уровня.
  6. END DEFINE — маркер последнего выражения внутри действия.

DO

Выполняет ACTION с указанными параметрами.

Синтаксис

  1. DO — выполнение действия.
  2. Именованное выражение, по которому объявлено действие.
  3. В круглых скобках — список значений для использования в роли параметров.

EMPTY_ACTION — действие, которое ничего не выполняет.

Примечание

В больших запросах объявление действий можно выносить в отдельные файлы и подключать их в основной запрос с помощью EXPORT + IMPORT. Для объявления работающих с таблицами действий в отдельной библиотеке, в ней обязательно должно присутствовать USE my_cluster;, так как их компиляция зависит от типа кластера.

Пример

DEFINE ACTION $hello_world($name) AS
    $name = $name ?? "world";
    SELECT "Hello, " || $name || "!";
END DEFINE;

DO EMPTY_ACTION();
DO $hello_world(NULL);
DO $hello_world("John");

Условное и циклическое выполнение действий

EVALUATE IF

Выполняет ACTION по заданному условию.

Синтаксис

  1. EVALUATE IF — объявление условия.
  2. Условие.
  3. DO с именем и параметрами действия.
  4. (опционально) ELSE DO, чтобы задать действие, если условие не выполнено.

Пример

DEFINE ACTION $hello() AS
    SELECT "Hello!";
END DEFINE;

DEFINE ACTION $bye() AS
    SELECT "Bye!";
END DEFINE;

EVALUATE IF RANDOM(0) > 0.5
    DO $hello()
ELSE
    DO $bye();

EVALUATE FOR

Выполняет ACTION для каждого элемента в списке.

Синтаксис

  1. EVALUATE FOR — объявления цикла.
  2. Именованное выражение, в которое будет подставляться каждый очередной элемент списка.
  3. Ключевое слово IN.
  4. Объявленное выше именованное выражение со списком, по которому будет выполняться действие.
  5. DO с именем и параметрами действия. В параметрах можно использовать как текущий элемент из второго пункта, так и любые объявленные выше именованные выражения, включая сам список.
  6. (опционально) ELSE DO, чтобы задать действие при пустом списке.

Пример

-- скопировать таблицу $input в $count новых таблиц
$count = 3;
$input = "my_input";
$inputs = ListReplicate($input, $count);
$outputs = ListMap(
    ListFromRange(0, $count),
    ($i) -> {
        RETURN "tmp/out_" || CAST($i as String)
    }
);
$pairs = ListZip($inputs, $outputs);

DEFINE ACTION $copy_table($pair) as
   $input = $pair.0;
   $output = $pair.1;
   INSERT INTO $output WITH TRUNCATE
   SELECT * FROM $input;
END DEFINE;

EVALUATE FOR $pair IN $pairs
    DO $copy_table($pair)
ELSE
    DO EMPTY_ACTION(); -- такой ELSE можно было не указывать,
                       -- ничего не делать подразумевается по умолчанию

Примечание

Стоит учитывать, что EVALUATE выполняется до начала работы операции. Также в рамках EVALUATE невозможно использование анонимных таблиц.