How create a ActualValueCustomFieldQueryFactory in the void init method

José Carlos Esparza Martí June 11, 2018

I'm creating a searcher for my custom field of type issue. In the searcher in the void init(CustomField field) method I have its variables, but in the part CustomFieldSearcherClauseHandles where the object that manages the JQL clauses created by this searcher is provided, since these Clause objects are normally converted into a Lucene query.  We also specify the available operators and the type of data that we want in the searcher without problems. We need to know what the IssueIdValidator and ActualValueCustomFieldQueryFactory class are used for, and what values ​​we need for their constructors.

 


import com.atlassian.jira.issue.customfields.searchers.*;

import com.atlassian.jira.issue.customfields.CustomFieldSearcher;
import com.atlassian.jira.issue.customfields.CustomFieldValueProvider;
import com.atlassian.jira.issue.customfields.SingleValueCustomFieldValueProvider;
import com.atlassian.jira.issue.customfields.SortableCustomFieldSearcher;
import com.atlassian.jira.issue.customfields.converters.DoubleConverter;
import com.atlassian.jira.issue.customfields.searchers.information.CustomFieldSearcherInformation;
import com.atlassian.jira.issue.customfields.searchers.renderer.CustomFieldRenderer;
import com.atlassian.jira.issue.customfields.searchers.transformer.CustomFieldInputHelper;
import com.atlassian.jira.issue.customfields.searchers.transformer.FreeTextCustomFieldSearchInputTransformer;
import com.atlassian.jira.issue.fields.CustomField;
import com.atlassian.jira.issue.index.indexers.FieldIndexer;
import com.atlassian.jira.issue.search.ClauseNames;
import com.atlassian.jira.issue.search.LuceneFieldSorter;
import com.atlassian.jira.issue.search.searchers.information.SearcherInformation;
import com.atlassian.jira.issue.search.searchers.renderer.SearchRenderer;
import com.atlassian.jira.issue.search.searchers.transformer.SearchInputTransformer;
import com.atlassian.jira.issue.statistics.NumericFieldStatisticsMapper;
import com.atlassian.jira.issue.util.MovedIssueKeyStore;
import com.atlassian.jira.jql.operand.JqlOperandResolver;
import com.atlassian.jira.jql.operator.OperatorClasses;
import com.atlassian.jira.jql.query.ActualValueCustomFieldClauseQueryFactory;
import com.atlassian.jira.jql.util.JqlIssueKeySupport;
import com.atlassian.jira.jql.util.JqlIssueSupport;
import com.atlassian.jira.jql.util.SimpleIndexValueConverter;
import com.atlassian.jira.jql.validator.IssueIdValidator;
import com.atlassian.jira.util.I18nHelper;

import static com.atlassian.jira.util.dbc.Assertions.notNull;
import com.atlassian.jira.web.FieldVisibilityManager;
import com.atlassian.jira.JiraDataTypes;

import java.util.Collections;
import java.util.concurrent.atomic.AtomicReference;

/**
* Allow searching for a currency value that was added to indexes in a
* more advanced manner.
*/
public class OwnSearcher extends AbstractInitializationCustomFieldSearcher
implements CustomFieldSearcher, SortableCustomFieldSearcher
{
private final FieldVisibilityManager fieldVisibilityManager;
private final JqlOperandResolver jqlOperandResolver;
private final JqlIssueKeySupport issueKeySupport;
private final JqlIssueSupport issueSupport;
private final I18nHelper.BeanFactory i18nFactory;
private final MovedIssueKeyStore moveIssueKeyStore;

private final CustomFieldInputHelper customFieldInputHelper;

private volatile CustomFieldSearcherInformation searcherInformation;
private volatile SearchInputTransformer searchInputTransformer;
private volatile SearchRenderer searchRenderer;
private volatile CustomFieldSearcherClauseHandler customFieldSearcherClauseHandler;

public OwnSearcher(final FieldVisibilityManager fieldVisibilityManager, final JqlOperandResolver jqlOperandResolver,
final JqlIssueKeySupport issueKeySupport, final I18nHelper.BeanFactory i18nFactory, final MovedIssueKeyStore moveIssueKeyStore, final JqlIssueSupport issueSupport, final CustomFieldInputHelper customFieldInputHelper)
{
this.fieldVisibilityManager = fieldVisibilityManager;
this.jqlOperandResolver = jqlOperandResolver;
this.issueSupport = issueSupport;
this.issueKeySupport = issueKeySupport;
this.i18nFactory = i18nFactory;
this.moveIssueKeyStore = moveIssueKeyStore;
this.customFieldInputHelper = notNull("customFieldInputHelper", customFieldInputHelper);
}

/**
* This is the first time the searcher knows what its ID and names are
*
* @param field the Custom Field for this searcher
*/
public void init(CustomField field)
{
// 1. Create the SearcherInformation object
// This inserts the new value "Small" into the Lucene index
//We’ll add the string Small to the Lucene index for all values less than
//10, so we can easily find all the issues with small amounts in a Currency field

final FieldIndexer indexer = new CustomFieldIndexer(fieldVisibilityManager, field);
// This shouldn't need to change for different searchers
this.searcherInformation = new CustomFieldSearcherInformation(field.getId(), field.getNameKey(), Collections.<FieldIndexer>singletonList(indexer), new AtomicReference<CustomField>(field));

// 2. Create the SearchInputTransformer object. See that
// interface for more information.
final ClauseNames names = field.getClauseNames();
//this.searchInputTransformer = new ExactNumberCustomFieldSearchInputTransformer(field, names, searcherInformation.getId(), customFieldInputHelper);//CAMBIAR
this.searchInputTransformer = new FreeTextCustomFieldSearchInputTransformer(field, names, searcherInformation.getId(), customFieldInputHelper);

// 3. Create the SearchRenderer object
final CustomFieldValueProvider customFieldValueProvider = new SingleValueCustomFieldValueProvider();
this.searchRenderer = new CustomFieldRenderer(names, getDescriptor(), field, customFieldValueProvider, fieldVisibilityManager);

// 4. Create the clause handler.
// This converts what comes from the web page to the String that is
// searched for in the Lucene index
// This class is harder to change because
// com.atlassian.jira.jql.validator.IndexValuesValidator is
// not a public class.
//final NumberIndexValueConverter indexValueConverter = new NumberIndexValueConverter(doubleConverter);
final SimpleIndexValueConverter indexValue = new SimpleIndexValueConverter(true);

this.customFieldSearcherClauseHandler = new SimpleCustomFieldSearcherClauseHandler(
new IssueIdValidator(jqlOperandResolver, issueKeySupport, issueSupport, i18nFactory, moveIssueKeyStore),
new ActualValueCustomFieldClauseQueryFactory(field.getId(), jqlOperandResolver, indexValue, true),
OperatorClasses.EQUALITY_AND_RELATIONAL_WITH_EMPTY,
JiraDataTypes.ISSUE);
}

public SearcherInformation<CustomField> getSearchInformation()
{
if (searcherInformation == null)
{
throw new IllegalStateException("Attempt to retrieve SearcherInformation off uninitialised custom field searcher.");
}
return searcherInformation;
}

public SearchInputTransformer getSearchInputTransformer()
{
if (searchInputTransformer == null)
{
throw new IllegalStateException("Attempt to retrieve searchInputTransformer off uninitialised custom field searcher.");
}
return searchInputTransformer;
}

public SearchRenderer getSearchRenderer()
{
if (searchRenderer == null)
{
throw new IllegalStateException("Attempt to retrieve searchRenderer off uninitialised custom field searcher.");
}
return searchRenderer;
}

public CustomFieldSearcherClauseHandler getCustomFieldSearcherClauseHandler()
{
if (customFieldSearcherClauseHandler == null)
{
throw new IllegalStateException("Attempt to retrieve customFieldSearcherClauseHandler off uninitialised custom field searcher.");
}
return customFieldSearcherClauseHandler;
}

public LuceneFieldSorter getSorter(CustomField customField)
{
return new NumericFieldStatisticsMapper(customField.getId());
}
}

 

0 answers

Suggest an answer

Log in or Sign up to answer