As I have been quite annoyed with JIRAs JQL Capabilities, heres an JQL Search function (Requires Scriptrunner):
It gives ability to do searches like "*peter*" in known fields..
Usage:
issueFunction in inStr(JQL,Fieldname,String_to_search_for) - eg:
issueFunction in inStr("Project=TEST","Single Line Text","Phasellus")
This will find all issues in TEST, where "phasellus" is in the Customfield named "Single Line Text".
Its search is case insensitive...
package com.onresolve.jira.groovy.jql
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.Issue
import com.atlassian.query.clause.TerminalClause
import com.atlassian.jira.jql.query.QueryCreationContext
import org.apache.lucene.index.Term
import com.onresolve.jira.groovy.jql.AbstractScriptedJqlFunction
import org.apache.lucene.search.BooleanClause
import org.apache.lucene.search.BooleanQuery
import org.apache.lucene.search.Query
import org.apache.lucene.search.TermQuery
import com.atlassian.jira.issue.fields.CustomField
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.user.ApplicationUser
import com.atlassian.jira.security.JiraAuthenticationContext
import com.atlassian.query.operand.FunctionOperand
class inStr extends AbstractScriptedJqlFunction implements JqlQueryFunction {
@Override
String getDescription() {
"Function to search for a (sub)string in Summary, Description or a Customfield"
}
@Override
List<Map> getArguments() {
[
[ "description": "Subquery", "optional": false],
[ "fieldname": "Custofield name", "optional": false],
[ "searchString": "Search string", "optional": false]
]
}
@Override
String getFunctionName() {
"inStr"
}
def getFieldValue(theIssue,fieldName)
{
CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()
if (fieldName.toLowerCase() == "summary")
return theIssue.getSummary()?:"".toLowerCase()
if (fieldName.toLowerCase() == "description")
return theIssue.getDescription()?:"".toLowerCase()
def theFields = customFieldManager.getCustomFieldObjectsByName(fieldName)
if (theFields)
{
CustomField theField = theFields[0]
return theIssue.getCustomFieldValue(theField)?:""
}
return ""
}
@Override
Query getQuery(QueryCreationContext queryCreationContext, FunctionOperand operand, TerminalClause terminalClause) {
final JiraAuthenticationContext context = ComponentAccessor.getJiraAuthenticationContext()
final ApplicationUser applicationUser = context.getLoggedInUser()
final BooleanQuery.Builder boolQueryBuilder = new BooleanQuery.Builder()
String theFieldValue = ""
String jql = operand.args[0]
String fieldName = operand.args[1]
String searchString = operand.args[2].toLowerCase()
String theFinalValue = ""
if (fieldName != "" && searchString != "")
{
issues = getIssues(jql, applicationUser)
issues.each { Issue issue ->
//Compare with lower cases
def theValue = getFieldValue(issue, fieldName)
if(theValue.class.isArray())
{
theFieldValue.each { avalue ->
theFinalValue = theFinalValue + avalue.value.toString()
}
}
else
theFinalValue = theValue.toString()
if (theFinalValue.toLowerCase().indexOf((String)searchString) > -1)
{
//The string was found in theFieldValue, add the Issue
boolQueryBuilder.add(new TermQuery(new Term("issue_id", issue.id as String)), BooleanClause.Occur.SHOULD)
theFinalValue = ""
}
}
}
return boolQueryBuilder.build()
}
}