I am needing assistance creating a scripted field to return the results of children issues from our roadmap plans, basically the inverse of "Parent Link" field. We can query this via JQL and it returns the correct results for a given issue key using the portfolioChildrenOf issueFunction (ScriptRunner JQL function).
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.web.bean.PagerFilter
def issueManager = ComponentAccessor.getIssueManager()
def searchService = ComponentAccessor.getComponent(SearchService.class)
def user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
def jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser.class)
def issue = issueManager.getIssueObject(issue.key)
def jqlQuery = jqlQueryParser.parseQuery("issueFunction in portfolioChildrenOf('" + issue.key + "')")
def searchResults = searchService.search(user, jqlQuery, PagerFilter.getUnlimitedFilter())
return searchResults.getResults().size()
ERROR FROM LOGS:
2024-03-22T15:55:07,087 ERROR [jql.ScriptedFunctionClauseFactory]: Error in ScriptRunner JQL function clause {issueFunction in portfolioChildrenOf(AJJ-322)} com.atlassian.jira.jql.parser.JqlParseException: com.atlassian.jira.jql.parser.antlr.RuntimeRecognitionException: NoViableAltException(-1@[]) at com.atlassian.jira.jql.parser.DefaultJqlQueryParser.parseClause(DefaultJqlQueryParser.java:110) ~[classes/:?] at com.atlassian.jira.jql.parser.DefaultJqlQueryParser.parseQuery(DefaultJqlQueryParser.java:33) ~[classes/:?] at com.atlassian.jira.jql.parser.JqlQueryParser$parseQuery$14.call(Unknown Source) ~[?:?] at com.onresolve.jira.groovy.jql.AbstractScriptedJqlFunction.search(AbstractScriptedJqlFunction.groovy:211) ~[plugin.4110092473777456710.groovyrunner-8.22.0.jar:8.22.0] at com.onresolve.jira.groovy.jql.AbstractScriptedJqlFunction$search$0.callCurrent(Unknown Source) ~[?:?] at com.onresolve.jira.groovy.jql.relations.portfolio.PortfolioChildrenOf.getQuery(PortfolioChildrenOf.groovy:28) ~[plugin.4110092473777456710.groovyrunner-8.22.0.jar:8.22.0] at com.onresolve.jira.groovy.jql.JqlQueryFunction$getQuery.call(Unknown Source) ~[?:?] at com.onresolve.jira.groovy.jql.ScriptedJqlFunction.getQuery(ScriptedJqlFunction.groovy:135) ~[plugin.4110092473777456710.groovyrunner-8.22.0.jar:8.22.0] at com.onresolve.jira.groovy.jql.ScriptedJqlFunction$getQuery.call(Unknown Source) ~[?:?] at com.onresolve.jira.groovy.jql.ScriptedFunctionClauseFactory.getQuery(ScriptedFunctionClauseFactory.groovy:110) ~[plugin.4110092473777456710.groovyrunner-8.22.0.jar:8.22.0] Caused by: com.atlassian.jira.jql.parser.antlr.RuntimeRecognitionException: NoViableAltException(-1@[]) at com.atlassian.jira.jql.parser.antlr.JqlParser.reportError(JqlParser.java:203) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.operator(JqlParser.java:1362) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.terminalClause(JqlParser.java:645) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.notClause(JqlParser.java:555) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.andClause(JqlParser.java:432) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.orClause(JqlParser.java:366) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.clause(JqlParser.java:328) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.query(JqlParser.java:237) ~[classes/:?] at com.atlassian.jira.jql.parser.DefaultJqlQueryParser.parseClause(DefaultJqlQueryParser.java:103) ~[classes/:?] ... 9 more Caused by: org.antlr.runtime.NoViableAltException at com.atlassian.jira.jql.parser.antlr.JqlParser.operator(JqlParser.java:1192) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.terminalClause(JqlParser.java:645) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.notClause(JqlParser.java:555) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.andClause(JqlParser.java:432) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.orClause(JqlParser.java:366) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.clause(JqlParser.java:328) ~[classes/:?] at com.atlassian.jira.jql.parser.antlr.JqlParser.query(JqlParser.java:237) ~[classes/:?] at com.atlassian.jira.jql.parser.DefaultJqlQueryParser.parseClause(DefaultJqlQueryParser.java:103) ~[classes/:?] ... 9 more