Esempio n. 1
0
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)
Esempio n. 2
0
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})
Esempio n. 3
0
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})