Skip to main content
Example scripts
arrow icon
To homepage
Jira
Data centre icon
Data Center

Search by reg exp on select option values

Created 10 month(s) ago, Updated 5 month(s) ago
App in script
ScriptRunner For Jira
ScriptRunner For Jira
by Adaptavist
Compatibility
compatibility bullet
Jira (8.0 - 8.19)
compatibility bullet
ScriptRunner For Jira (7.10.0)
Language |
groovy
package com.onresolve.jira.groovy.jql

import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.issue.customfields.manager.OptionsManager
import com.atlassian.jira.jql.builder.JqlQueryBuilder
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 org.apache.lucene.search.Query

class OptionMatchesFunction extends AbstractScriptedJqlFunction implements JqlQueryFunction {

    LuceneQueryBuilder luceneQueryBuilder = ComponentAccessor.getComponent(LuceneQueryBuilder)
    OptionsManager optionsManager = ComponentAccessor.getComponent(OptionsManager)
    CustomFieldManager customFieldManager = ComponentAccessor.getCustomFieldManager()

    @Override
    String getDescription() {
        "Matches issues against select option values by regex"
    }

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

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

        def customFields = customFieldManager.getCustomFieldObjectsByNameIgnoreCase(operand.args[0])
        if (!customFields) {
            messageSet.addErrorMessage("Could not find custom field ${operand.args[0]}")
        }

        messageSet
    }

    @Override
    List<Map> getArguments() {
        [
            [
                description: "Custom field name",
                optional   : false,
            ],
            [
                description: "Reg exp to match options on",
                optional   : false,
            ],
        ]
    }

    @Override
    String getFunctionName() {
        "optionMatches"
    }

    @Override
    Query getQuery(QueryCreationContext queryCreationContext, FunctionOperand operand, TerminalClause terminalClause) {
        def customField = customFieldManager.getCustomFieldObjectsByName(operand.args[0]).first()
        def fieldConfigSchemes = customField.getConfigurationSchemes()

        def options = fieldConfigSchemes.collect {
            def fieldConfig = it.oneAndOnlyConfig

            optionsManager.getOptions(fieldConfig)*.value.findAll {
                it.matches(operand.args[1])
            }
        }.flatten() as String[]

        def queryBuilder = JqlQueryBuilder.newBuilder()
        def whereClause = queryBuilder
            .where()
            .customField(customField.idAsLong)
            .in(options)
            .endWhere()
            .buildQuery()
            .whereClause

        luceneQueryBuilder.createLuceneQuery(queryCreationContext, whereClause)
    }
}
Having an issue with this script?
Report it here