thirdparty/google_appengine/google/appengine/ext/search/__init__.py
changeset 297 35211afcd563
parent 149 f2e327a7c5de
child 1278 a7766286a7be
--- 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)