Hello,
I am trying to create a custom JQL function using scriptrunner. I have created the below code and it runs with no errors, but no issues are displaying in the issue navigator. I am very new to groovy and scriptrunner, so I was hoping someone could help me figure out why no results are displaying in the issue navigator when I try to run the query: "issuefunction in sprint(2015, "Jan 1")
class Sprint extends AbstractScriptedJqlFunction implements JqlQueryFunction { private def log = Category.getInstance(DateCompare.class) //log.setLevel(org.apache.log4j.Level.DEBUG) def start = [ 2015: ['Jan 1': "2014-12-29", 'Jan 2': "2015-01-12", 'Feb 1': "2015-01-26", 'Feb 2': "2015-02-09", 'Mar 1': "2015-02-23", 'Mar 2': "2015-03-09", 'Mar 3': "2015-03-23", 'Apr 1': "2015-04-06", 'Apr 2': "2015-04-20", 'May 1': "2015-04-30", 'May 2': "2015-05-14", 'Jun 1': "2015-05-28", 'Jun 2': "2015-06-11", 'Jul 1': "2015-06-25", 'Jul 2': "2015-07-09", 'Aug 1': "2015-07-23", 'Aug 2': "2015-08-06", 'Sep 1': "2015-08-20", 'Sep 2': "2015-09-03", 'Sep 3': "2015-09-17", 'Oct 1': "2015-10-01", 'Oct 2': "2015-10-15", 'Nov 1': "2015-10-29", 'Nov 2': "2015-11-12", 'Dec 1': "2015-11-26", 'Dec 2': "2015-12-10"] ] def end = [ 2015: ['Jan 1': "2015-01-11", 'Jan 2': "2015-01-25", 'Feb 1': "2015-02-08", 'Feb 2': "2015-02-22", 'Mar 1': "2015-03-08", 'Mar 2': "2015-03-22", 'Mar 3': "2015-04-05", 'Apr 1': "2015-04-19", 'Apr 2': "2015-04-29", 'May 1': "2015-05-13", 'May 2': "2015-05-27", 'Jun 1': "2015-06-10", 'Jun 2': "2015-06-24", 'Jul 1': "2015-07-08", 'Jul 2': "2015-07-22", 'Aug 1': "2015-08-05", 'Aug 2': "2015-08-19", 'Sep 1': "2015-09-02", 'Sep 2': "2015-09-16", 'Sep 3': "2015-09-30", 'Oct 1': "2015-10-14", 'Oct 2': "2015-10-28", 'Nov 1': "2015-11-11", 'Nov 2': "2015-11-25", 'Dec 1': "2015-12-09", 'Dec 2': "2015-12-23"] ] def int year def String sprint @Override MessageSet validate(User user, FunctionOperand operand, TerminalClause terminalClause) { def messageSet = new MessageSetImpl() messageSet = new NumberOfArgumentsValidator(2, 2, getI18n()).validate(operand) if (messageSet.hasAnyErrors()){ return messageSet } year = operand.args[0].toInteger() sprint = operand.args[1] if (year > 2015) { messageSet.addErrorMessage("The minimum year that can be used is 2015") } else { if (start.get(year) == null) { messageSet.addErrorMessage("That year is not supported yet") } if (start.get(year).get(sprint) == null) { messageSet.addErrorMessage("That sprint does not exist for the year") } } messageSet } @Override String getDescription() { "Get issues within sprint" } @Override List<Map> getArguments() { [ ["description": "Year (2015, 2016, ...)", "required": true], ["description": "Sprint (ex - 'Jan 1', 'Aug 1')", "required": true] ] } @Override String getFunctionName() { "sprint" } @Override Query getQuery(QueryCreationContext queryCreationContext, FunctionOperand operand, TerminalClause terminalClause) { validate(queryCreationContext.user, operand, terminalClause) Set issueIds = new HashSet() def String startdate = start.get(year).get(sprint) def String enddate = end.get(year).get(sprint) //log.error "createddate >= '$startdate' and createddate <= '$enddate'" //def booleanQuery = new BooleanQuery() issues = getIssues("createddate >= '$startdate' and createddate <= '$enddate'", queryCreationContext.applicationUser) //log.error issues issues.each { issueIds << (issues.id as String) } //booleanQuery.add(new TermQuery(new Term("issue_id", issues.id as String)), BooleanClause.Occur.SHOULD) //log.error issueIds //log.error booleanQuery //return booleanQuery new ConstantScoreQuery(new IssueIdFilter(issueIds)) } }
What issues are returned by:
issues = getIssues("createddate >= '$startdate' and createddate <= '$enddate'", queryCreationContext.applicationUser)
?
Can you put some logging in so you can see what that string evaluates to, then run that query to make sure results are returned.
I get this for issues: [DocumentIssueImpl[issueKey=TP-221], DocumentIssueImpl[issueKey=TP-220], DocumentIssueImpl[issueKey=TP-219], DocumentIssueImpl[issueKey=TP-218], DocumentIssueImpl[issueKey=TP-217], DocumentIssueImpl[issueKey=TP-216], DocumentIssueImpl[issueKey=TP-215], DocumentIssueImpl[issueKey=TP-214], DocumentIssueImpl[issueKey=TP-213], DocumentIssueImpl[issueKey=TP-191], DocumentIssueImpl[issueKey=TP-190], DocumentIssueImpl[issueKey=TP-189], DocumentIssueImpl[issueKey=TP-188], DocumentIssueImpl[issueKey=TP-187], DocumentIssueImpl[issueKey=TP-186], DocumentIssueImpl[issueKey=TP-185], DocumentIssueImpl[issueKey=TP-184], DocumentIssueImpl[issueKey=TP-183], DocumentIssueImpl[issueKey=TP-182], DocumentIssueImpl[issueKey=TP-161], DocumentIssueImpl[issueKey=TP-160], DocumentIssueImpl[issueKey=TP-159], DocumentIssueImpl[issueKey=TP-158], DocumentIssueImpl[issueKey=TP-157], DocumentIssueImpl[issueKey=TP-156], DocumentIssueImpl[issueKey=TP-155], DocumentIssueImpl[issueKey=TP-154], DocumentIssueImpl[issueKey=TP-153], DocumentIssueImpl[issueKey=TP-152], DocumentIssueImpl[issueKey=TP-130], DocumentIssueImpl[issueKey=TP-129], DocumentIssueImpl[issueKey=TP-128], DocumentIssueImpl[issueKey=TP-127], DocumentIssueImpl[issueKey=TP-126], DocumentIssueImpl[issueKey=TP-125], DocumentIssueImpl[issueKey=TP-124], DocumentIssueImpl[issueKey=TP-123], DocumentIssueImpl[issueKey=TP-122], DocumentIssueImpl[issueKey=TP-121], DocumentIssueImpl[issueKey=TP-100], DocumentIssueImpl[issueKey=TP-99], DocumentIssueImpl[issueKey=TP-98], DocumentIssueImpl[issueKey=TP-97], DocumentIssueImpl[issueKey=TP-96], DocumentIssueImpl[issueKey=TP-95], DocumentIssueImpl[issueKey=TP-94], DocumentIssueImpl[issueKey=TP-93], DocumentIssueImpl[issueKey=TP-92], DocumentIssueImpl[issueKey=TP-91], DocumentIssueImpl[issueKey=TP-69], DocumentIssueImpl[issueKey=TP-68], DocumentIssueImpl[issueKey=TP-67], DocumentIssueImpl[issueKey=TP-66], DocumentIssueImpl[issueKey=TP-65], DocumentIssueImpl[issueKey=TP-64], DocumentIssueImpl[issueKey=TP-63], DocumentIssueImpl[issueKey=TP-62], DocumentIssueImpl[issueKey=TP-61], DocumentIssueImpl[issueKey=TP-60], DocumentIssueImpl[issueKey=TP-41], DocumentIssueImpl[issueKey=TP-40], DocumentIssueImpl[issueKey=TP-39], DocumentIssueImpl[issueKey=TP-38], DocumentIssueImpl[issueKey=TP-37], DocumentIssueImpl[issueKey=TP-36], DocumentIssueImpl[issueKey=TP-35], DocumentIssueImpl[issueKey=TP-34], DocumentIssueImpl[issueKey=TP-33], DocumentIssueImpl[issueKey=TP-32], DocumentIssueImpl[issueKey=TP-10], DocumentIssueImpl[issueKey=TP-9], DocumentIssueImpl[issueKey=TP-8], DocumentIssueImpl[issueKey=TP-7], DocumentIssueImpl[issueKey=TP-6], DocumentIssueImpl[issueKey=TP-5], DocumentIssueImpl[issueKey=TP-4], DocumentIssueImpl[issueKey=TP-3], DocumentIssueImpl[issueKey=TP-2], DocumentIssueImpl[issueKey=TP-1]] When I manually run createddate >= '$startdate' and createddate <= '$enddate', those are the correct issue numbers
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
This looks wrong: issues.each { issueIds << (issues.id as String) } You probably want: issues.each { issueIds << (it.id as String) }
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
That Worked!! thank you so much!! Can you please explain what it.id is so that I know for next time?
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
"it" is the default name for the item that you are iterating over. So it's equivalent to writing: issues.each { anIssue -> anIssue.id ... }
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.