def list_favorite_apps(cls, user_key): # We are using "query" on key for getting anno data instead of "get" or "get_multi" # Getting anno using "query" is more memory efficient than using "get" or "get_multi", # we don't know why. # Getting anno using "query" also create index for this. from model.userannostate import UserAnnoState from model.anno import Anno userannostate_list = UserAnnoState.list_by_user(user_key, 50) anno_key_list = [ userannostate.anno for userannostate in userannostate_list if userannostate.anno is not None ] if len(anno_key_list): anno_list = Anno.query(ndb.AND(Anno.key.IN(anno_key_list), Anno.app != None) )\ .fetch(projection=[Anno.app]) app_key_list = [ anno.app for anno in anno_list ] app_key_list = sorted(app_key_list, key=app_key_list.count, reverse=True) unique_app_key_list = [] [ unique_app_key_list.append(app_key) for app_key in app_key_list if app_key not in unique_app_key_list ] app_list = ndb.get_multi(unique_app_key_list) else: app_list = [] favorite_apps_list = [] for app in app_list: if app: app_message = UserFavoriteApp(name=app.name, icon_url=(app.icon_url or ""), version=(app.version or "")) favorite_apps_list.append(app_message) return favorite_apps_list
def query_my_anno(cls, limit, curs, user): if user: from model.userannostate import UserAnnoState userannostate_list = UserAnnoState.list_by_user(user_key=user.key) anno_id_list = [ userannostate.anno.id() for userannostate in userannostate_list ] anno_message_list = [] more = False if len(anno_id_list): query = cls.query(cls.anno_id.IN(anno_id_list)).order(-cls.last_update_time, cls.key) anno_list, next_curs, more = query.fetch_page(limit, start_cursor=curs) anno_message_list = [ anno.to_response_message(user) for anno in anno_list if anno is not None ] if more: return AnnoListMessage(anno_list=anno_message_list, cursor=next_curs.urlsafe(), has_more=more) else: return AnnoListMessage(anno_list=anno_message_list, has_more=more) else: return AnnoListMessage(anno_list=[])