Время прочтения: 5 мин.

Ранее мы рассматривали основной функционал JQL в Jira. Во второй части разбора JQL мы рассмотрим применение функций для расширенного поиска. Вот ссылка на первую часть, если еще не видели (https://newtechaudit.ru/jql-dlya-nachinayushhih-polzovatelej/ ).

Функция в JQL отображается в виде слова, за которым идут круглые скобки. В этих скобках могут содержаться значения переменных, названий полей или, откуда функция возьмет эти значения.

В запросе JQL функции предшествует оператор, перед которым стоит название поля. Функция выполняет вычисления для конкретных данных Jira, либо для вычисления содержимого в скобках функции и извлекает только истинные результаты, которые потом будут использоваться в запросе JQL.

Следует запомнить, что поиск по JQL не возвращает пустые поля в результате. К примеру, для поиска задач, где исполнитель — не текущий пользователь, мы можем воспользоваться выражением assignee != currentUser(), но данное выражение пропустит задачи в которых исполнитель еще не назначен. Для включения в результат задач без исполнителя мы должны дополнительно дописать assignee is EMPTY, что дает нам в итоге вот такое выражение: assignee != currentUser() OR assignee is EMPTY

С водными разобрались, теперь рассмотрим некоторые существующие функции и примеры написания в запросе.

approved() ‒ ищет задачи, которым было или не было получено утверждение

Синтаксис: approved()

Поддерживаемые поля: катстомные поля типа Approval

Поддерживаемые операторы: =

Пример: поиск всех задач, по которым было получено утверждение: approvals = approved()

approver() ‒ ищет задачи, которые были утверждены определенным пользователем. Мы можем указать несколько пользователей внутри скобок через запятую, чтобы найти задачи так, как будто мы используем OR для их поиска.

Синтаксис: approver(user,user)

Поддерживаемые поля: катстомные поля типа Approval

Поддерживаемые операторы: =

Пример: найдем все задачи, одобренные Ivan: approvals = approver(Ivan), найдем все задачи, одобренные Ivan или Egor: approvals = approver(Ivan, Egor)

myApproval() ‒ ищет задачи, которые были утверждены текущим пользователем

Синтаксис: myApproval()

Поддерживаемые поля: катстомные поля типаApproval

Поддерживаемые операторы: =

Пример: найдем все задачи, которые были утверждены текущим пользователем: approvals = myApproval()

currentLogin() ‒ поиск происходит в рамках начала своей текущей сессии в Jira

Синтаксис: currentLogin()

Поддерживаемые поля: Created, Due, Resolved, Updated, катстомные поля типа Date/Time

Поддерживаемые операторы:  = , != , > , >= , < , <= WAS* , WAS IN* , WAS NOT* , WAS NOT IN* , CHANGED*

* только в качестве предиката

Пример: найдем задачи, которые были созданы в рамках текущей сессии: created > currentLogin()

lastLogin() ‒ поиск происходит в рамках своей предыдущей сессии в Jira

Синтаксис: lastLogin()

Поддерживаемые поля: Created. Due, Resolved, Updated, катстомные поля типа Date/Time

Поддерживаемые операторы: = , != , > , >= , < , <= WAS* , WAS IN* , WAS NOT* , WAS NOT IN* , CHANGED*

* только в качестве предиката

Пример: найдем задачи, которые были созданы в рамках предыдущей сессии: created > lastLogin()

currentUser() ‒ поиск происходит по текущему пользователю. Отметим, что эта функция может использоваться только для залогированного пользователя – если вы используете в своих фильтрах анонимного пользователя, то не используйте эту функцию.

Синтаксис: currentUser()

Поддерживаемые поля: Assignee, Reporter, Voter, Watcher, Creator, катстомные поля типа User Поддерживаемые операторы: = , !=

Пример: найдем задачи, назначенные на текущего пользователя: assignee = currentUser(), найдем задачи, созданные текущем пользователем, но где он не является исполнителем: reporter = currentUser() AND (assignee != currentUser() OR assignee is EMPTY)

linkedIssues() ‒ функция ищет задачи, которые связаны с другой задачей. Дополнительно можно выбрать вид связи.

Синтаксис: linkedIssues(issueKey), linkedIssues(issueKey,CaseSensitiveLinkType)

Поддерживаемые поля: Issue

Поддерживаемые операторы: IN , NOT IN

Пример: найти все связные задачи с T-1000: issue in linkedIssues(T-1000), найти все связные задачи с T-1000 с типом связи is duplicated by: issue in linkedIssues(T-1000,»is duplicated by»)

membersOf() ‒ происходит поиск, который зависит от группы пользователя

Синтаксис: membersOf(Group)

Поддерживаемые поля: Assignee, Reporter, Voter, Watcher, Creator, катстомные поля типа User

Поддерживаемые операторы: IN , NOT IN , WAS IN , WAS NOT IN

Пример: найдем задачи, в которых исполнитель является участником группы «jira-administrators»: assignee in membersOf(«jira-administrators»), найдем задачи, в которых исполнитель является участником группы QA: assignee not in membersOf(QA)

now() ‒ происходит поиск, который зависит от текущего времени

Синтаксис: now()

Поддерживаемые поля: Created. Due, Resolved, Updated, катстомные поля типа Date/Time

Поддерживаемые операторы: = , != , > , >= , < , <= WAS* , WAS IN* , WAS NOT* , WAS NOT IN* , CHANGED*

* только в качестве предиката

Пример: найдем просроченные задачи: duedate < now() and status not in (closed, resolved)

updatedBy() ‒ поиск задач, которые были обновлены определенным пользователем и может дополнен периодом дат этого обновления. Под обновлением задачи подразумевается создание задачи, обновление любого поля в задаче, создание/удаление/последнее редактирование комментария. Эта функция возвращает до 32 тысяч задач. Для указания периода, мы можем воспользоваться следующими форматами: «yyyy/MM/dd», «yyyy-MM-dd». Или использовать «w» (weeks) или «d» (days) для обозначения от текущей даты.

Синтаксис: updatedBy(user), updatedBy(user, dateFrom), updatedBy(user, dateFrom, dateTo)

Поддерживаемые поля: Issuekey, and its aliases (id, issue, key)

Поддерживаемые операторы: IN , NOT IN

Пример: найдем все задачи, обновленные пользователем Nikita: issuekey IN updatedBy(Nikita), найдем все задачи, обновленные пользователем Nikita в течение 8ми дней: issuekey IN updatedBy(Nikita, «-8d»), найдем все задачи, обновленные в 2021 году с июня по август включительно: issuekey IN updatedBy(jsmith, «2018/06/01», «2018/08/31»). Для поиска задач, обновленных за последний час пользователем Nikita: issuekey IN updatedBy(Nikita, «-1h»)

watchedIssues() ‒ поиск происходит по задачам, в которых текущий пользователь является наблюдателем. Эта функция возвращает до 32 тысяч задач.

Синтаксис: watchedIssues()

Поддерживаемые поля: Issue

Поддерживаемые операторы: IN , NOT IN

Пример: найдем задачи, в которых текущий пользователь является наблюдателем: issue in watchedIssues()

А теперь попробуйте самостоятельно написать запрос, который в результате поиска выдаст:

  1. Задачи где пользователь является наблюдателем и связаны с задачами типа Epic.
  2. Задачи, где в Описании содержится слово «NewTechAudit» и пользователь Olga обновил задачу вчера.

В данной части мы рассмотрели расширенный функционал JQL. В следующей статье мы рассмотрим, какие существуют функции в JQL и полезные возможности по управлению вашими запросами JQL.