diff -r b02dd2a5f329 -r 35211afcd563 thirdparty/google_appengine/google/appengine/ext/search/__init__.py --- a/thirdparty/google_appengine/google/appengine/ext/search/__init__.py Fri Oct 10 06:56:56 2008 +0000 +++ b/thirdparty/google_appengine/google/appengine/ext/search/__init__.py Fri Oct 10 13:14:24 2008 +0000 @@ -122,9 +122,10 @@ 'where', 'whether', 'which', 'while', 'who', 'whose', 'why', 'widely', 'will', 'with', 'within', 'without', 'would', 'yet', 'you']) - _PUNCTUATION_REGEX = re.compile('[' + re.escape(string.punctuation) + ']') + _word_delimiter_regex = re.compile('[' + re.escape(string.punctuation) + ']') - def __init__(self, kind_or_entity, *args, **kwargs): + def __init__(self, kind_or_entity, word_delimiter_regex=None, *args, + **kwargs): """Constructor. May be called as a copy constructor. If kind_or_entity is a datastore.Entity, copies it into this Entity. @@ -137,7 +138,9 @@ Args: kind_or_entity: string or datastore.Entity + word_delimiter_regex: a regex matching characters that delimit words """ + self._word_delimiter_regex = word_delimiter_regex if isinstance(kind_or_entity, datastore.Entity): self._Entity__key = kind_or_entity._Entity__key self.update(kind_or_entity) @@ -160,7 +163,8 @@ if (isinstance(values[0], basestring) and not isinstance(values[0], datastore_types.Blob)): for value in values: - index.update(SearchableEntity._FullTextIndex(value)) + index.update(SearchableEntity._FullTextIndex( + value, self._word_delimiter_regex)) index_list = list(index) if index_list: @@ -169,7 +173,7 @@ return super(SearchableEntity, self)._ToPb() @classmethod - def _FullTextIndex(cls, text): + def _FullTextIndex(cls, text, word_delimiter_regex=None): """Returns a set of keywords appropriate for full text indexing. See SearchableQuery.Search() for details. @@ -181,9 +185,12 @@ set of strings """ + if word_delimiter_regex is None: + word_delimiter_regex = cls._word_delimiter_regex + if text: datastore_types.ValidateString(text, 'text', max_len=sys.maxint) - text = cls._PUNCTUATION_REGEX.sub(' ', text) + text = word_delimiter_regex.sub(' ', text) words = text.lower().split() words = set(unicode(w) for w in words) @@ -206,7 +213,7 @@ SearchableEntity or SearchableModel classes. """ - def Search(self, search_query): + def Search(self, search_query, word_delimiter_regex=None): """Add a search query. This may be combined with filters. Note that keywords in the search query will be silently dropped if they @@ -221,6 +228,7 @@ """ datastore_types.ValidateString(search_query, 'search query') self._search_query = search_query + self._word_delimiter_regex = word_delimiter_regex return self def _ToPb(self, limit=None, offset=None): @@ -245,7 +253,8 @@ pb = super(SearchableQuery, self)._ToPb(limit=limit, offset=offset) if hasattr(self, '_search_query'): - keywords = SearchableEntity._FullTextIndex(self._search_query) + keywords = SearchableEntity._FullTextIndex( + self._search_query, self._word_delimiter_regex) for keyword in keywords: filter = pb.add_filter() filter.set_op(datastore_pb.Query_Filter.EQUAL)