Versioner sammenlignet

Nøgle

  • Linjen blev tilføjet.
  • Denne linje blev fjernet.
  • Formatering blev ændret.

...

It gives ability to do searches like "*peter*" in known fields..


Usage:

issueFunction in inStr(JQL,Fieldname,String_to_search_for) - eg:

Kodeblok
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...

...

Kodeblok
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]
            //log.warn theIssue.getCustomFieldValue(theField)?:"".toString().toLowerCase()
            return theIssue.getCustomFieldValue(theField)?:"".toString()
        }

        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
                log.warndef theValue =  getFieldValue(issue, fieldName)
                if(theValue.class.isArray())
                {
                    theFieldValue.each { avalue ->
                        theFinalValue = theFinalValue + " / " + searchString avalue.value.toString()
                    }
                }
                else
                    theFinalValue = theValue.toString()

                if (getFieldValue(issue, fieldName)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()
    }
}