Язык выражений (произносится как «эксперт» без буквы «т») — это простой язык, который позволяет указать «выражение» или формулу, которая рассчитывается для задачи или другого элемента.
Выражение может использоваться в:
- Столбцы формулы — выражение вычисляется для каждой видимой строки в отображаемой структуре или результате запроса.
- Автоматизация — формулы можно использовать для фильтрации структуры (Фильтрация по атрибуту), сортировки структуры (Сортировка по атрибуту) или группировки задач (Группировка по текстовому атрибуту) на основе результатов формулы.
- Эффекторы — результаты формулы можно записать в поле Jira с помощью эффектора поля «Атрибут для задачи».
Основы Expr просты в изучении, и все же язык достаточно мощен для решения сложных задач. Следующее руководство охватывает основные требования языка Expr.
Для более глубокого изучения см. Справочник по языку Expr и Справочную документацию по формулам.
Вы можете просмотреть примеры формул Expr в разделе Образцы формул или путем добавления связанных формул в свою структуру. Чтобы увидеть базовую формулу, просто откройте панель параметров столбца.
Языковые компоненты
Выражение может содержать одно или несколько из следующего:
- Переменные — они сопоставляются с атрибутами, такими как поля задач, настраиваемый прогресс или значение из другого столбца.
- Арифметические и логические операции — сложение, вычитание, умножение, деление или сравнение элементов.
- Числа
- Текстовые строки
- Вызовы функций — применяют определенные вычисления к предоставленным аргументам и возвращают результат, который будет использоваться в выражении.
- Доступ к свойствам — получение значения определенного свойства элемента, например даты выпуска версии исправления.
- Условные («ЕСЛИ») выражения — вычисляют разные результаты на основе заданного набора критериев.
Есть и более продвинутые конструкции:
- Агрегатные функции — вычисление агрегата (например, суммы или среднего) значений выражения, рассчитанных для нескольких элементов в структуре.
- Локальные переменные — введите значение и повторно используйте его в формуле несколько раз.
- Пользовательские функции — определение функции или функционального выражения для повторного использования в формуле или применения к массиву значений.
- Запросы JQL и S-JQL внутри формулы — обусловливают результаты в зависимости от того, соответствует ли элемент запросу.
- Комментарии — документируйте большие формулы.
Типы значений
С помощью Expr вы можете создавать формулы, которые работают с:
- Базовые значения — числа и текст, которые либо являются частью формулы, либо считываются из простого атрибута или поля Jira, например из сводки задачи или пунктов истории.
- Элементы — значения, представляющие конкретный объект, например «Пользователь», «Проблема», «Журнал работ», «Статус» и другие, и обычно считываемые из соответствующего поля Jira.
- Значения массива — последовательность значений, позволяющая представлять поля с несколькими значениями, такие как Fix Versions или несколько Entities, в случае атрибута рабочих журналов.
- Значения пользовательской функции — представляют часть формулы, которая обычно применяется к каждому элементу массива, например, для фильтрации.
- Карты ключ-значение — в редких случаях эти значения создаются предоставленными функциями, такими как GROUP.
- Неопределено (“Undefined”) — специальное значение, означающее «ничего» или «нет значения».
- Значения ошибок – выдаются, если возникла проблема с вычислением формулы.
Обычно при написании формулы вам не нужно беспокоиться о типах значений. Языковой движок попытается понять формулу и преобразовать значения по мере необходимости. Для более сложных формул или если что-то не работает должным образом, см. Справочник по функциям Expr для ожидаемых типов для каждой функции.
Переменные
Переменные — это определяемые пользователем имена, которые представляют атрибуты, такие как:
- Поля задач Jira
- Вычисляемые атрибуты, такие как Progress
- Атрибуты, специфичные для структуры, такие как тип элемента
- Атрибуты, предоставляемые другими приложениями Jira
- Другая формула
- Значения из другого столбца структуры
Именование переменных
Переменные могут содержать буквы (только на английском языке), цифры или символы подчеркивания ("_"). Переменные не могут содержать пробелы, а первым символом должна быть буква или знак подчеркивания.
Примеры:
- priority
- sprintName
- remaining_estimate
- abc11
Пока вы пишете формулу, Structure пытается сопоставить ваши переменные с известными атрибутами. Например, указанная выше переменная «remaining_estimate» будет автоматически сопоставлена с полем «Оставшаяся оценка». Дополнительные сведения см. в разделе Отображение переменных.
Имена переменных нечувствительны к регистру. Priority, priority и PRIORITY будут ссылаться на одну и ту же переменную.
Вызовы функций
Функция вычисляет значение на основе своих аргументов, а иногда и некоторых внешних аспектов. Вызов функции записывается как имя функции, за которым следуют круглые скобки, которые могут содержать или не содержать аргументы.
Примеры:
- SUM(-original_estimate, remaining_estimate, time_spent)
- CASE(priority, 'High*', 5, 1)
- TODAY()
Имена функций нечувствительны к регистру. Вы можете написать TODAY()
или Today()
В Structure доступно более 100 стандартных функций — полный список см. в Справочнике по функциям Expr.
i)
Аргументы функции могут быть разделены запятой (,) или точкой с запятой (;). Но при каждом вызове функции в формуле необходимо использовать либо все запятые, либо все точки с запятой.
i)
Сцепленные вызовы функций
Сцепленная нотация позволяет вам легко применять последовательность функций к значению, просто перечисляя каждую функцию одну за другой, разделяя их точкой ( . ).
- Стандартное обозначение: F3(F2(F1(x)))
- Обозначение цепочки: x.F1().F2().F3()
При использовании цепной нотации значение, стоящее перед точкой, становится первым аргументом функции. Если функция принимает несколько аргументов, остальные аргументы должны быть указаны в круглых скобках.
Например:
КОД
created.FORMAT_DATETIME("yyyy").CONCAT(" year issue")
В этом примере FORMAT_DATETIME принимает значение даты в поле «создано» и форматирует его на основе аргумента в скобках («yyyy»). CONCAT берет результат из FORMAT_DATETIME и объединяет его с " year issue" «задачей года».
Числа и текстовые строки
Числа
Формулы поддерживают целые числа, десятичные дроби и дроби. Запятые, пробелы, локальные, процентные, денежные или научные форматы не поддерживаются.
Распознается как число |
Не распознается как число |
0 |
0, 0 |
.111 |
|
11.25 |
1.234e+04 |
1000 |
1,000 |
1234567890123456 |
1 100 025 |
Вы можете написать число, записанное с десятичным разделителем и разделителем тысяч, зависящим от локали, в качестве текстового значения, и оно будет автоматически преобразовано в число, если это необходимо. Например:
- «1 122,25» * 2 → 2244,5
Текстовые строки
Текстовые строки представляют собой последовательность символов, заключенную либо в одинарные ('), либо в двойные кавычки ("). Примеры:
- 'текст в одинарных кавычках может содержать " (двойная кавычка)"
- "текст в двойных кавычках может содержать '(одинарную кавычку)"
- ""
Все в текстовой строке сохраняется точно при вычислении или отображении выражения, за исключением следующего:
- Последовательность из двух обратных косых черт (\\) преобразуется в одну обратную косую черту (\).
- Последовательность обратной косой черты и одинарной кавычки (\') преобразуется в символ одинарной кавычки (') для текстовых значений, заключенных в одинарные кавычки.
- Последовательность обратной косой черты и двойной кавычки (\") преобразуется в символ двойной кавычки (") для текстовых значений, заключенных в двойные кавычки.
Фрагменты текста
Текстовые фрагменты позволяют создавать строки с использованием переменных и выражений. Это особенно полезно в формулах, использующих вики-разметку. При использовании текстовых фрагментов:
Фрагмент должен быть заключен в """ (три двойных кавычки, в начале и в конце)
Фрагмент выражения вводится с помощью символа «$» и должен быть заключен в фигурные скобки { }
CODE
1 """ $var1 + $var2 = ${var1 + var2} """
2
3 """ this $glass is half-${IF optimist: 'full' ELSE: 'empty'} """
Операции
Expr обеспечивает основные арифметические операции, сравнения, текстовые операции и логические операции.
Операции |
Комментарии |
+ - * / |
Основные операторы. При использовании значение преобразуется в число. Следует общим правилам приоритета для арифметики, поэтому (2 + 3 * 4 = 14). |
= != |
Равенство и неравенство: если какая-либо часть сравнения является числом, другая часть также преобразуется в число. Если оба значения являются текстами, используется текстовое сравнение. При сравнении текста игнорируются начальные и конечные пробелы и не учитывается регистр (согласно языковому стандарту системы Jira). |
< <= > >= |
Численные сравнения. При использовании оба значения преобразуются в числа. |
AND, OR, NOT |
Логические операции. |
CONCAT |
Операция, которая объединяет две текстовые строки. Работает аналогично одноименной функции: a CONCAT b — это то же самое, что и CONCAT(a, b). |
( ) |
Скобки можно использовать для группировки результатов операций перед их передачей другим операциям. |
Порядок операций
При использовании нескольких видов операций они выполняются в следующем порядке:
- Арифметические операции
- Текстовые операции (CONCAT)
- Операции сравнения
- Логические операции.
Подробную спецификацию см. в справочнике по языку Expr.
Доступ к свойствам
Формулы могут получить значение свойства элемента, используя следующую нотацию: object.property
CODE
fixVersion.releaseDate // /возвращает дату релиза fixVersion
Вы также можете связать несколько вызовов свойств вместе:
CODE
project.lead.emailAddress //возвращает адрес электронной почты лида для проекта
Полный список поддерживаемых свойств см. в разделе Справочник по свойствам элемента.
Условное выражение
Простые выражения «ЕСЛИ» могут быть объявлены с помощью функции ЕСЛИ(), но для более сложных случаев ЕСЛИ, с несколькими условиями и/или требующих опции ELSE, можно использовать условное выражение.
CODE
WITH total = x + y:
IF total > 0:
x / total
ELSE : error
Примечание: «:» после «ELSE» не является обязательным — в приведенном выше примере мы включили его для удобства чтения.
Расширенные конструкции
Локальные переменные
Локальные переменные полезны, когда выражение нужно использовать в одной и той же формуле несколько раз. Например:
КОД
IF time_spent + remaining_estimate > 0 :
time_spent / (time_spent + remaining_estimate)
Вы можете видеть, что в этой формуле мы используем «затраченное время + оставшаяся_оценка» дважды — один раз, когда мы проверяем, что это не ноль (чтобы мы не делили на ноль), и снова, когда мы делим на него.
Вместо того, чтобы каждый раз повторять выражение, мы можем переписать эту формулу, используя конструкцию WITH:
КОД
WITH total_time = time_spent + remaining_estimate :
IF total_time > 0 :
time_spent / total_time
Вы можете последовательно определить несколько локальных переменных. Вы также можете использовать ранее определенные локальные переменные при определении дополнительных локальных переменных. Например:
КОД
WITH total_time = time_spent + remaining_estimate :
WITH progress = (IF total_time > 0 : time_spent / total_time) :
IF(progress > 0.5, "Great Progress!", progress > 0.2, "Good Progress", "Needs Progress!")
ü
Обратите внимание на положение двоеточия (":") — оно должно стоять там, где заканчивается определение каждой локальной переменной.
ü
Агрегатные функции
Агрегатная функция вычисляет некоторое совокупное значение (например, сумму или минимум) на основе значений в ряде строк, как правило, для всех подпроблем. Агрегатные функции написаны очень похоже на стандартные функции, за исключением того, что они используют фигурные скобки: SUM{x}.
Примеры:
- SUM { remaining_estimate + time_spent }— вычисляет общие усилия (оценочные и фактические) для проблемы и всех ее подзадач.
- MAX { resolved_date - created_date }— вычисляет максимальное время, которое потребовалось для решения проблемы, среди проблемы и ее подзадач.
Они также могут содержать модификаторы, влияющие на работу агрегации:
- SUM#all { business_value }— это заставит функцию включить значения из всех повторяющихся элементов в итог. (По умолчанию дубликаты игнорируются.)
Полный список доступных агрегатных функций и модификаторов см. в справочнике по агрегатным функциям.
Любые локальные переменные, используемые внутри агрегатной функции, также должны быть объявлены внутри функции — внутри { } .
Пользовательские функции
Пользовательская функция позволяет определить локально используемую функцию в формуле. Пользовательские функции могут быть определены аналогично локальным переменным:
КОД
WITH square(x) = x * x :
square(impactField) / square(storyPoints)
В этом примере пользовательской функции дается имя («квадрат»), а затем она используется для выполнения одних и тех же вычислений в нескольких полях. Чтобы узнать больше, см. справочник по языку.
Пользовательские функции для массивов — использование символа «$»
Когда вам нужно выполнить операцию над каждым элементом в массиве, вы можете использовать пользовательскую функцию, подобную приведенной выше, или упростить ее, используя «$» для обозначения каждого элемента в массиве.
КОД
worklogs.FILTER($.author = ME())
В этом примере "$" указывает структуре применить "author = ME()" к каждому элементу в рабочих журналах - если автор является текущим пользователем, он возвращает true, и этот рабочий журнал будет включен в результаты FILTER.
Этот метод становится очень мощным, когда вы объединяете вместе несколько пользовательских функций. Чтобы узнать больше, см. справочник по языку.
Встроенные запросы (JQL и S-JQL)
Вы можете встраивать запросы JQL и структурированные запросы JQL в формулу Expr, используя конструкцию, аналогичную агрегатным функциям. Результатом будет логическое значение:
1 (истина), если текущая строка соответствует запросу
0 (ложь) иначе
Например:
КОД
// Соберите общее количество баллов за все подзадачи, назначенные членам группы Team2, если только истории не находятся в папке «Особые».
SUM {
IF JQL { assignee in membersOf("Team2") } :
IF NOT SJQL { descendant of folder("Special") } :
storyPoints
}
Поскольку JQL — это запрос на основе Jira, он будет работать только с задачами; результат будет 0 для других типов элементов. S-JQL можно использовать для более сложных запросов, применимых ко всей структуре.
Комментарии
Комментарии полезны, когда у вас есть большая формула или когда читателю могут понадобиться пояснения того, что вычисляется. Рекомендуется добавлять комментарии везде, где формула нетривиальна.
Чтобы добавить одну строку комментария, начните комментарий с //
Чтобы добавить несколько строк комментария, начните комментарий с /* и завершите комментарий */
Пример:
КОД
// Это однострочный комментарий.
/* Это многострочный комментарий.
Это может быть полезно для более длинных объяснений. */
По материалам Atlassian JIRA Structure: Expr Language