Forums

Articles
Create
cancel
Showing results for 
Search instead for 
Did you mean: 

The operator 'IN' is not supported by the "RTC Code" field

Quy Ngo
I'm New Here
I'm New Here
Those new to the Atlassian Community have posted less than three times. Give them a warm welcome!
December 24, 2018

I want to use the IN oprator but this RTC Code field does not support. How i can use it? Thanks a lot!rtc.PNG

1 answer

1 accepted

0 votes
Answer accepted
Sid
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
December 24, 2018

Hi @Quy Ngo,

Is RTC code a text field or number field (field type). 

nallu February 14, 2019

Hi @Sid

I am also facing similar issue. My field is custom script field and it's template is 'Text Field (multi-line)'. Is there a way to enable 'in' operator for this field by changing return type or field template. 

Thanks in advance! 

Sid
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
February 15, 2019

Hi @nallu ,

So what you are trying for?

nallu February 17, 2019

Hi @Sid ,

I want to write a custom JQL function. 

Here is the scenario,

We have custom field call 'Feature' in epic issue create/edit/view screen. Feature is an issue search field. User will select the feature while creating an epic. So, There will be a chance where more than one epic will have same feature set. 

In the Feature issue view screen, we are aggregating the fix-version of epics which has this feature set and displaying them through a script field called 'Feature Fix-versions' . As it is a script field, we can not able to search for feature issue with history. Something like, 'Feature Fix-versions was 20.19'.

 

So, I am trying to write a script JQL function which will go back to epics which are linked with feature and search for history of it's fix-version. As a result, i will get list of epics which had given fix-version. I will be iterating through a results and get the value of feature field for each epic issues. Finally, I will form a JQL from the collected feature values. Ex: 'Feature in (Feature_Issue-1, Feature_Issue-2, Feature_Issue-3).

 

I have the logic. But, I don't know where to insert this code. FYI, I am referring JQL Alias Example code in https://scriptrunner.adaptavist.com/latest/jira/custom-jql-functions.html

 

Please help me. 

Sid
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
February 18, 2019

Try something like this "Feature " ~ "Feature_Issue-1 Feature_Issue-2 Feature_Issue-3" . Let me know if this worked.

Quy Ngo
I'm New Here
I'm New Here
Those new to the Atlassian Community have posted less than three times. Give them a warm welcome!
February 19, 2019

 

i fixed this issue => change rtc code field from text -> numberic.

textfield ->  not supported

Numberic -> worked

Thanks men! 

nallu February 25, 2019

Thanks @Sid and @Quy Ngo .

I have fixed it. But, I am getting an new error now. 

 

It throws a Compilation Error. 

Here is the error snippet,

2019-02-25 08:58:26,483 http-nio-8080-exec-13 ERROR nnallusamy 538x1771042x2 8mu39i 172.28.122.240 /rest/issueNav/1/issueTable [c.o.j.groovy.jql.ScriptedJqlFunction] Script error for function: workTimeFrameWas.

com.atlassian.jira.jql.parser.JqlParseException: com.atlassian.jira.jql.parser.antlr.RuntimeRecognitionException: MismatchedSetException(92!=null)

        at com.atlassian.jira.jql.parser.DefaultJqlQueryParser.parseClause(DefaultJqlQueryParser.java:110)

        at com.atlassian.jira.jql.parser.DefaultJqlQueryParser.parseQuery(DefaultJqlQueryParser.java:33)

        at com.atlassian.jira.jql.parser.JqlQueryParser$parseQuery.call(Unknown Source)

        at com.onresolve.jira.groovy.jql.WorkTimeFrameWas.mergeQuery(workTimeFreameWas.groovy:124)

        at com.onresolve.jira.groovy.jql.WorkTimeFrameWas.validate(workTimeFreameWas.groovy:62)

        at com.onresolve.jira.groovy.jql.JqlFunction$validate$14.call(Unknown Source)

        at com.onresolve.jira.groovy.jql.JqlFunction$validate$14.call(Unknown Source)

        at com.onresolve.jira.groovy.jql.ScriptedJqlFunction.validate(ScriptedJqlFunction.groovy:113)

Caused by: com.atlassian.jira.jql.parser.antlr.RuntimeRecognitionException: MismatchedSetException(92!=null)

        at com.atlassian.jira.jql.parser.antlr.LexerErrorHelper.handleError(LexerErrorHelper.java:48)

        at com.atlassian.jira.jql.parser.antlr.JqlLexer.recover(JqlLexer.java:130)

        at com.atlassian.jira.jql.parser.antlr.JqlLexer.recover(JqlLexer.java:136)

        at com.atlassian.jira.jql.parser.antlr.JqlLexer.mERRORCHAR(JqlLexer.java:1953)

        at com.atlassian.jira.jql.parser.antlr.JqlLexer.mTokens(JqlLexer.java:2691)

        at org.antlr.runtime.BufferedTokenStream.fetch(BufferedTokenStream.java:143)

        at org.antlr.runtime.BufferedTokenStream.sync(BufferedTokenStream.java:137)

        at org.antlr.runtime.CommonTokenStream.skipOffTokenChannels(CommonTokenStream.java:116)

        at org.antlr.runtime.CommonTokenStream.LT(CommonTokenStream.java:102)

        at org.antlr.runtime.BufferedTokenStream.LA(BufferedTokenStream.java:174)

        at com.atlassian.jira.jql.parser.antlr.JqlParser.operator(JqlParser.java:1118)

        at com.atlassian.jira.jql.parser.antlr.JqlParser.terminalClause(JqlParser.java:645)

        at com.atlassian.jira.jql.parser.antlr.JqlParser.notClause(JqlParser.java:555)

        at com.atlassian.jira.jql.parser.antlr.JqlParser.andClause(JqlParser.java:451)

        at com.atlassian.jira.jql.parser.antlr.JqlParser.orClause(JqlParser.java:366)

        at com.atlassian.jira.jql.parser.antlr.JqlParser.clause(JqlParser.java:328)

        at com.atlassian.jira.jql.parser.antlr.JqlParser.query(JqlParser.java:237)

        at com.atlassian.jira.jql.parser.DefaultJqlQueryParser.parseClause(DefaultJqlQueryParser.java:103)

        ... 7 more

Caused by: MismatchedSetException(92!=null)

        at com.atlassian.jira.jql.parser.antlr.JqlLexer.recover(JqlLexer.java:135)

        ... 23 more

 

 

Here is my code:

package com.onresolve.jira.groovy.jql

import com.atlassian.jira.bc.issue.search.SearchService;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.jql.parser.JqlQueryParser;
import com.atlassian.jira.jql.query.LuceneQueryBuilder;
import com.atlassian.jira.jql.query.QueryCreationContext;
import com.atlassian.jira.jql.validator.NumberOfArgumentsValidator;
import com.atlassian.jira.user.ApplicationUser;
import com.atlassian.jira.util.MessageSet;
import com.atlassian.query.clause.TerminalClause;
import com.atlassian.query.operand.FunctionOperand;
import groovy.util.logging.Log4j;
import org.apache.lucene.search.Query;

//My custom scripts - Starts
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.project.Project;
import com.atlassian.jira.bc.project.ProjectService;
import com.atlassian.jira.jql.parser.JqlQueryParser;
import com.atlassian.jira.issue.search.SearchProvider;
import com.atlassian.jira.issue.search.SearchResults;
import com.atlassian.jira.web.bean.PagerFilter;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.ComponentManager;
import com.atlassian.jira.issue.CustomFieldManager;
//My custom scripts - Ends

import java.text.MessageFormat;

@Log4j
class WorkTimeFrameWas extends AbstractScriptedJqlFunction implements JqlQueryFunction {

/**
* Modify this query as appropriate.
*
* See {@link java.text.MessageFormat} for details
*/
public static final String TEMPLATE_QUERY =
"""issuetype = Epic and "Feature Link" is not EMPTY and fixVersion was {0}""";

def queryParser = ComponentAccessor.getComponent(JqlQueryParser);
def luceneQueryBuilder = ComponentAccessor.getComponent(LuceneQueryBuilder);
def searchService = ComponentAccessor.getComponent(SearchService);
def searchProvider = ComponentAccessor.getComponent(SearchProvider);
def issueManager = ComponentAccessor.getIssueManager();
def applicationUser = ComponentAccessor.getJiraAuthenticationContext().getUser();

@Override
String getDescription() {
"Fetch Feature issues which had/have given fixVersion";
}

@Override
MessageSet validate(ApplicationUser user, FunctionOperand operand, TerminalClause terminalClause) {
def messageSet = new NumberOfArgumentsValidator(1, getI18n()).validate(operand);

if (messageSet.hasAnyErrors()) {
return messageSet;
}

def query = mergeQuery(operand);
messageSet = searchService.validateQuery(user, query);
messageSet;
}

@Override
List<Map> getArguments() {
[
[
description: "Version to fetch feature issues",
optional: false,
]
]
}

@Override
String getFunctionName() {
"workTimeFrameWas"
}

@Override
Query getQuery(QueryCreationContext queryCreationContext, FunctionOperand operand, TerminalClause terminalClause) {

log.debug("Hello Nallu");

//Defining Feature Link custom field object
def customFieldManager = ComponentAccessor.getCustomFieldManager();
def featureLink = customFieldManager.getCustomFieldObject("customfield_15727");
def featureLinkList = [];


def firstQuery = MessageFormat.format(TEMPLATE_QUERY, operand.args.first());
def firstquery = queryParser.parseQuery(firstQuery);
def SearchResults = searchProvider.search(firstquery, applicationUser, PagerFilter.getUnlimitedFilter());

// Return the issues from the JQL Query
SearchResults.getIssues().each { documentIssue ->
featureLinkList.add(documentIssue.getCustomFieldValue(featureLink).toString());
}

log.debug("${featureLinkList}");
if(featureLinkList)
{
def queryTemp = featureLinkList.unique().join(',').toString();
def secondQuery = "key in (" + queryTemp + ")";
def query = queryParser.parseQuery(secondQuery);
luceneQueryBuilder.createLuceneQuery(queryCreationContext, query.whereClause);
}
else
{
def secondQuery = firstQuery;
def query = queryParser.parseQuery(secondQuery);
luceneQueryBuilder.createLuceneQuery(queryCreationContext, query.whereClause);
}
}


private com.atlassian.query.Query mergeQuery(FunctionOperand operand) {
def queryStr = MessageFormat.format(TEMPLATE_QUERY, operand.args.first());
queryParser.parseQuery(queryStr);
}
}

 

This work fine when i pass argument as 18.11. But, If i send an argument with wildcard  character (ex: "*18.11*") it throws an error saying 'Scripted function "workTimeFrameWas" compilation failure. Contact administrator and check logs. Message: com.atlassian.jira.jql.parser.antlr.RuntimeRecognitionException: MismatchedSetException(42!=null)'

 

I have manually tried with wildcard character and it works fine. JQL: issuetype = Epic AND "Feature Link" is not EMPTY AND fixVersion was "*18.11*"

 

@Sid can you please tell me what i am doing wrong here. 

Sid
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
February 25, 2019

Hi @nallu , try fixVersion ~ "*18.11*" instead of fix version "was"

nallu February 25, 2019

Hi @Sid ,

Actually, I could not use like ~ operator. As per my requirement, I need to get list of issues which had (past) given fix version. Using like ~ operator will return only the issues which has (present) given fix version currently. 

So, I want to use `was' operator. 

Sid
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
February 26, 2019

Hi @nallu

Now it is more clear to me, fixVersion was in versionMatch(".*18.11*.") . this might get you results. Let me know if that works

Suggest an answer

Log in or Sign up to answer
TAGS
AUG Leaders

Atlassian Community Events