bgneal@943: """Custom Haystack SearchFields."""
bgneal@943: 
bgneal@943: import haystack.fields
bgneal@943: 
bgneal@943: 
bgneal@943: class MaxTermSizeCharField(haystack.fields.CharField):
bgneal@943:     """A CharField that discards large terms when preparing the search index.
bgneal@943: 
bgneal@943:     Some backends (e.g. Xapian) throw errors when terms are bigger than some
bgneal@943:     limit. This field omits the terms over a limit when preparing the data for
bgneal@943:     the search index.
bgneal@943: 
bgneal@943:     The keyword argument max_term_size sets the maximum size of a whitespace
bgneal@943:     delimited word/term. Terms over this size are not indexed. The default value
bgneal@943:     is 64.
bgneal@943:     """
bgneal@943:     DEFAULT_MAX_TERM_SIZE = 64
bgneal@943: 
bgneal@943:     def __init__(self, *args, **kwargs):
bgneal@943:         self.max_term_size = kwargs.pop('max_term_size', self.DEFAULT_MAX_TERM_SIZE)
bgneal@943:         super(MaxTermSizeCharField, self).__init__(*args, **kwargs)
bgneal@943: 
bgneal@943:     def prepare(self, obj):
bgneal@943:         text = super(MaxTermSizeCharField, self).prepare(obj)
bgneal@943:         if text is None or self.max_term_size is None:
bgneal@943:             return text
bgneal@943: 
bgneal@943:         terms = (term for term in text.split() if len(term) <= self.max_term_size)
bgneal@943:         return u' '.join(terms)