package plugins; import com.atlassian.jira.issue.customfields.searchers.AbstractSingleValueSearcher; import com.atlassian.jira.issue.customfields.SortableCustomFieldSearcher; import com.atlassian.jira.issue.customfields.converters.StringConverter; import com.atlassian.jira.issue.customfields.impl.FieldValidationException; import com.atlassian.jira.issue.fields.CustomField; import com.atlassian.jira.issue.search.LuceneFieldSorter; import com.atlassian.jira.issue.search.SearchParameter; import com.atlassian.jira.issue.search.parameters.lucene.FreeTextParameter; import com.atlassian.jira.issue.statistics.TextFieldSorter; import com.atlassian.jira.web.bean.FieldVisibilityBean; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import java.util.ArrayList; import java.util.Set; import java.util.Collection; import java.util.Iterator; import org.apache.log4j.Logger; /** * This searcher is like the standard TextSearcher but supports searching for * null entries. */ public class EnhancedFreeTextSearcher extends AbstractSingleValueSearcher implements SortableCustomFieldSearcher { private static final Logger log = Logger.getLogger(EnhancedFreeTextSearcher.class); protected final StringConverter stringConverter; protected static final String LUCENE_SORTFIELD_PREFIX = "sort_"; public EnhancedFreeTextSearcher(StringConverter stringConverter, FieldVisibilityBean fieldVisibilityBean) { super(fieldVisibilityBean); this.stringConverter = stringConverter; } public void index(Document doc, CustomField field, Object value) { String s = stringConverter.getString((String) value); log.debug("Indexing: " + field.getId() + " with " + s); doc.add(Field.Text(field.getId(), s)); doc.add(Field.Keyword(LUCENE_SORTFIELD_PREFIX + field.getId(), s)); // Artificially add an index value of the field id for every // issue with content in this field. doc.add(Field.Text(field.getId(), field.getId() )); doc.add(Field.Keyword(LUCENE_SORTFIELD_PREFIX + field.getId(), field.getId() )); } protected Collection getValueFromSearchRequest(SearchParameter searchParameter) { Collection values = new ArrayList(); for (Iterator iterator = searchParameter.getValues().iterator(); iterator.hasNext();) { Object value = iterator.next(); values.add(stringConverter.getString((String) value)); } return values; } protected SearchParameter makeSearchParameter(CustomField field, String paramValue, String paramPrefix) throws FieldValidationException { if (stringConverter.getObject(paramValue) == null) return null; else { return new AllParameter(field.getId(), paramValue); } } public LuceneFieldSorter getSorter(CustomField customField) { return new TextFieldSorter(LUCENE_SORTFIELD_PREFIX + customField.getId()); } }