mirror of
https://github.com/viq/NewsBlur.git
synced 2025-08-31 22:20:12 +00:00
First try at a fast river. Only does one direction, but it's much faster.
This commit is contained in:
parent
15644d097c
commit
49d24be9ec
1 changed files with 45 additions and 15 deletions
|
@ -886,6 +886,7 @@ def unread_story_hashes(request):
|
||||||
user = get_user(request)
|
user = get_user(request)
|
||||||
feed_ids = [int(feed_id) for feed_id in request.REQUEST.getlist('feed_id') if feed_id]
|
feed_ids = [int(feed_id) for feed_id in request.REQUEST.getlist('feed_id') if feed_id]
|
||||||
include_timestamps = is_true(request.REQUEST.get('include_timestamps', False))
|
include_timestamps = is_true(request.REQUEST.get('include_timestamps', False))
|
||||||
|
r = redis.Redis(connection_pool=settings.REDIS_STORY_HASH_POOL)
|
||||||
usersubs = {}
|
usersubs = {}
|
||||||
|
|
||||||
if not feed_ids:
|
if not feed_ids:
|
||||||
|
@ -893,27 +894,56 @@ def unread_story_hashes(request):
|
||||||
feed_ids = [sub.feed_id for sub in usersubs]
|
feed_ids = [sub.feed_id for sub in usersubs]
|
||||||
else:
|
else:
|
||||||
usersubs = UserSubscription.objects.filter(user=user, active=True, feed__in=feed_ids)
|
usersubs = UserSubscription.objects.filter(user=user, active=True, feed__in=feed_ids)
|
||||||
if usersubs:
|
|
||||||
usersubs = dict((sub.feed_id, sub) for sub in usersubs)
|
|
||||||
|
|
||||||
unread_feed_story_hashes = {}
|
unread_feed_story_hashes = {}
|
||||||
story_hash_count = 0
|
story_hash_count = 0
|
||||||
for feed_id in feed_ids:
|
|
||||||
if feed_id in usersubs:
|
lua = """
|
||||||
us = usersubs[feed_id]
|
local feed_hashes = {}
|
||||||
else:
|
local args = cjson.decode(ARGV[1])
|
||||||
continue
|
local user_id = args["user_id"]
|
||||||
if not us.unread_count_neutral and not us.unread_count_positive:
|
redis.log(redis.LOG_NOTICE, "User id:", user_id)
|
||||||
continue
|
|
||||||
unread_feed_story_hashes[feed_id] = us.get_stories(read_filter='unread', limit=500,
|
for _, feed_id in pairs(KEYS) do
|
||||||
withscores=include_timestamps,
|
local stories_key = 'F:'..feed_id
|
||||||
hashes_only=True)
|
local sorted_stories_key = 'zF:'..feed_id
|
||||||
story_hash_count += len(unread_feed_story_hashes[feed_id])
|
local read_stories_key = 'RS:'..user_id..':'..feed_id
|
||||||
|
local unread_stories_key = 'U:'..user_id..':'..feed_id
|
||||||
|
local unread_ranked_stories_key = 'zhU:'..user_id..':'..feed_id
|
||||||
|
redis.call('sdiffstore', unread_stories_key, stories_key, read_stories_key)
|
||||||
|
redis.call('zinterstore', unread_ranked_stories_key, 2, sorted_stories_key, unread_stories_key)
|
||||||
|
local unread_stories = redis.call('zrangebyscore', unread_ranked_stories_key, args["read_dates"][feed_id], args["now"])
|
||||||
|
feed_hashes[feed_id] = unread_stories
|
||||||
|
-- for _, us in pairs(unread_stories) do
|
||||||
|
-- redis.log(redis.LOG_NOTICE, 'Stories', us)
|
||||||
|
-- end
|
||||||
|
-- redis.log(redis.LOG_NOTICE, "Read date:", feed_id, tonumber(args["read_dates"][feed_id]))
|
||||||
|
end
|
||||||
|
redis.log(redis.LOG_NOTICE, "Feed hashes:", type(feed_hashes))
|
||||||
|
|
||||||
|
return cjson.encode(feed_hashes)
|
||||||
|
"""
|
||||||
|
hashes = r.register_script(lua)
|
||||||
|
read_dates = dict((us.feed_id, us.mark_read_date.strftime('%s')) for us in usersubs)
|
||||||
|
story_hashes = json.decode(hashes(keys=feed_ids, args=[json.encode({'read_dates': read_dates, 'user_id': user.pk, 'now': datetime.datetime.now().strftime('%s')})]))
|
||||||
|
print story_hashes
|
||||||
|
# usersubs = dict((sub.feed_id, sub) for sub in usersubs)
|
||||||
|
# for feed_id in feed_ids:
|
||||||
|
# if feed_id in usersubs:
|
||||||
|
# us = usersubs[feed_id]
|
||||||
|
# else:
|
||||||
|
# continue
|
||||||
|
# if not us.unread_count_neutral and not us.unread_count_positive:
|
||||||
|
# continue
|
||||||
|
# unread_feed_story_hashes[feed_id] = us.get_stories(read_filter='unread', limit=500,
|
||||||
|
# withscores=include_timestamps,
|
||||||
|
# hashes_only=True)
|
||||||
|
# story_hash_count += len(unread_feed_story_hashes[feed_id])
|
||||||
|
|
||||||
logging.user(request, "~FYLoading ~FCunread story hashes~FY: ~SB%s feeds~SN (%s story hashes)" %
|
logging.user(request, "~FYLoading ~FCunread story hashes~FY: ~SB%s feeds~SN (%s story hashes)" %
|
||||||
(len(feed_ids), story_hash_count))
|
(len(feed_ids), len(story_hashes)))
|
||||||
|
|
||||||
return dict(unread_feed_story_hashes=unread_feed_story_hashes)
|
return dict(unread_feed_story_hashes=story_hashes)
|
||||||
|
|
||||||
@ajax_login_required
|
@ajax_login_required
|
||||||
@json.json_view
|
@json.json_view
|
||||||
|
|
Loading…
Add table
Reference in a new issue