def _load_user_timeline(id): """ Load user timeline from database """ sql = """ select * from ( select 0 as kind, id, timestamp from statuses where user_id=:UID or user_id in ( select followed_id from user_follows as F where F.follower_id=:UID ) union select 1 as kind, id, timestamp from articles where official_account_id in ( select official_account_id from subscriptions as S where S.users_id=:UID ) ) as t order by timestamp DESC limit :LIMIT offset :OFFSET; """ # NOTE: `S.users_id` is a typo of column name(Don't change) key = Keys.user_timeline.format(id) result = db.engine.execute(text(sql), UID=id, LIMIT=100, OFFSET=0) result = list(result) args = [] for item in result: if item['kind'] == 0: timeline_item = Keys.timeline_status_item.format(item['id']) score = Score.timestamp_to_score(item['timestamp']) rd.zadd(key, score, timeline_item) elif item['kind'] == 1: timeline_item = Keys.timeline_article_item.format(item['id']) score = Score.timestamp_to_score(item['timestamp']) args += [score, timeline_item] if args: rd.zadd(key, *args) rd.expire(key, Keys.user_timeline_expire)
def _insert_article_into_timeline(article_id, account_id): json = Cache.get_article_json(article_id, process_json=False) if json is None: print("#" * 10, "can't load article_json") return score = Score.from_article_json(json) item = Keys.timeline_article_item.format(article_id) for s_id in Cache.get_subscriber_ids(account_id): key = Keys.user_timeline.format(s_id) rd.zadd(key, {item: score}) # insert into public timeline key = Keys.public_timeline rd.zadd(key, {item: score})
def _insert_status_into_timeline(status_id, user_id): json = Cache.get_status_json(status_id, process_json=False) if json is None: print("#" * 10, "can't load status_json") return score = Score.from_status_json(json) item = Keys.timeline_status_item.format(status_id) for f_id in Cache.get_follower_ids(user_id): key = Keys.user_timeline.format(f_id) rd.zadd(key, {item: score}) # insert into public timeline key = Keys.public_timeline rd.zadd(key, {item: score})