def fetch_page_of_provider_prospects(cursor_key=None, page_size=50, search_keyword=None): ''' Returns three values: prospects, next_curs, prev_curs Search uses a workaround to imitate LIKE: http://stackoverflow.com/questions/47786/google-app-engine-is-it-possible-to-do-a-gql-like-query ''' cursor = Cursor(urlsafe=cursor_key) if search_keyword: limit = search_keyword + u"\ufffd" query = ProviderProspect.query( ProviderProspect.last_name >= search_keyword, ProviderProspect.last_name < limit) query = query.order(ProviderProspect.last_name) else: query = ProviderProspect.query() # forward and back forward_query = query.order(ProviderProspect.category, ProviderProspect.last_name, ProviderProspect.key) backward_query = query.order(-ProviderProspect.category, -ProviderProspect.last_name, -ProviderProspect.key) # fetch next prospects, next_curs, more = forward_query.fetch_page(page_size, start_cursor=cursor) logging.info('next_curs: %s more: %s' % (next_curs, more)) # fetch prev (just to get cursor position) if cursor_key: reversed_cursor = cursor.reversed() prev_prospects, prev_curs, prev_more = backward_query.fetch_page( page_size, start_cursor=reversed_cursor) # reverse the cursor (GAE docs is wrong on this) if prev_curs: prev_curs = prev_curs.reversed() else: prev_curs = None prev_more = None if not more: next_curs = None #if not prev_more: # prev_curs = None return prospects, next_curs, prev_curs
def __init__(self, query, page_size=100, start_cursor=None, offset=0, use_cache=True, cache_begin=True, **kwargs): self.cache_begin = cache_begin self.use_cache = use_cache self.page_size = page_size self.query = query self.offset = offset self.__future = None self.__cached_keys = None self.cursor = None self.more = None if isinstance(start_cursor, basestring): start_cursor = Cursor(urlsafe=start_cursor) self.start_cursor = start_cursor super(ModelSearchCommand, self).__init__(**kwargs)