258 for keyword in keywords: |
258 for keyword in keywords: |
259 filter = pb.add_filter() |
259 filter = pb.add_filter() |
260 filter.set_op(datastore_pb.Query_Filter.EQUAL) |
260 filter.set_op(datastore_pb.Query_Filter.EQUAL) |
261 prop = filter.add_property() |
261 prop = filter.add_property() |
262 prop.set_name(SearchableEntity._FULL_TEXT_INDEX_PROPERTY) |
262 prop.set_name(SearchableEntity._FULL_TEXT_INDEX_PROPERTY) |
|
263 prop.set_multiple(len(keywords) > 1) |
263 prop.mutable_value().set_stringvalue(unicode(keyword).encode('utf-8')) |
264 prop.mutable_value().set_stringvalue(unicode(keyword).encode('utf-8')) |
264 |
265 |
265 return pb |
266 return pb |
|
267 |
|
268 |
|
269 class SearchableMultiQuery(datastore.MultiQuery): |
|
270 """A multiquery that supports Search() by searching subqueries.""" |
|
271 |
|
272 def Search(self, *args, **kwargs): |
|
273 """Add a search query, by trying to add it to all subqueries. |
|
274 |
|
275 Args: |
|
276 args: Passed to Search on each subquery. |
|
277 kwargs: Passed to Search on each subquery. |
|
278 |
|
279 Returns: |
|
280 self for consistency with SearchableQuery. |
|
281 """ |
|
282 for q in self: |
|
283 q.Search(*args, **kwargs) |
|
284 return self |
266 |
285 |
267 |
286 |
268 class SearchableModel(db.Model): |
287 class SearchableModel(db.Model): |
269 """A subclass of db.Model that supports full text search and indexing. |
288 """A subclass of db.Model that supports full text search and indexing. |
270 |
289 |
288 self._search_query = search_query |
307 self._search_query = search_query |
289 return self |
308 return self |
290 |
309 |
291 def _get_query(self): |
310 def _get_query(self): |
292 """Wraps db.Query._get_query() and injects SearchableQuery.""" |
311 """Wraps db.Query._get_query() and injects SearchableQuery.""" |
293 query = db.Query._get_query(self, _query_class=SearchableQuery) |
312 query = db.Query._get_query(self, |
|
313 _query_class=SearchableQuery, |
|
314 _multi_query_class=SearchableMultiQuery) |
294 if self._search_query: |
315 if self._search_query: |
295 query.Search(self._search_query) |
316 query.Search(self._search_query) |
296 return query |
317 return query |
297 |
318 |
298 def _populate_internal_entity(self): |
319 def _populate_internal_entity(self): |