You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ponymail.apache.org by se...@apache.org on 2017/01/05 23:48:42 UTC
incubator-ponymail git commit: Rework the list count handling
Repository: incubator-ponymail
Updated Branches:
refs/heads/master db233b3bd -> 36b138444
Rework the list count handling
Squash the returned data counts before caching
Calculate the user access from the data counts
Project: http://git-wip-us.apache.org/repos/asf/incubator-ponymail/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ponymail/commit/36b13844
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ponymail/tree/36b13844
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ponymail/diff/36b13844
Branch: refs/heads/master
Commit: 36b13844477c3c5ce69aafdbfeb1d128acc8b991
Parents: db233b3
Author: Sebb <se...@apache.org>
Authored: Thu Jan 5 23:48:08 2017 +0000
Committer: Sebb <se...@apache.org>
Committed: Thu Jan 5 23:48:08 2017 +0000
----------------------------------------------------------------------
site/api/preferences.lua | 58 ++++++++++++++++++++++++-------------------
1 file changed, 33 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ponymail/blob/36b13844/site/api/preferences.lua
----------------------------------------------------------------------
diff --git a/site/api/preferences.lua b/site/api/preferences.lua
index 16a9297..353bd34 100644
--- a/site/api/preferences.lua
+++ b/site/api/preferences.lua
@@ -275,13 +275,13 @@ Pony Mail - Email for Ponies and People.
end
end
- -- Get lists (cached if possible)
- local lists = {}
+ -- Get list counts (cached if possible)
local NOWISH = math.floor(os.time() / 600)
- local PM_LISTS_KEY = "pm_lists_cache_" .. r.hostname .. "-" .. NOWISH
+ local PM_LISTS_KEY = "pm_lists_counts_" .. r.hostname .. "-" .. NOWISH
local cache = r:ivm_get(PM_LISTS_KEY)
+ local listcounts = {} -- summary of aggregated data for cache
if cache then
- lists = JSON.decode(cache)
+ listcounts = JSON.decode(cache)
else
-- aggregate the documents by listname, privacy flag, recent docs
@@ -313,33 +313,41 @@ Pony Mail - Email for Ponies and People.
}
}
}
- -- Now process the docs that are visible to the user
+ -- squash the output for caching (it's quite verbose otherwise)
for _, entry in pairs (alldocs.aggregations.listnames.buckets) do
local listname = entry.key:lower()
- local _, list, domain = aaa.parseLid(listname)
- -- TODO is it necessary to check the lengths?
- if list and domain and #list > 0 and #domain > 3 then
- -- check public and private (only one may be present)
- for _, privacy in pairs(entry.privacy.buckets) do
- local isPublic = privacy.key_as_string == 'false'
- -- do the user have access?
- if isPublic or aaa.canAccessList(r, listname, account) then
- -- there is only a single recent bucket; access it directly
- local recent_count = privacy.recent.buckets[1].doc_count
- -- create the domain entry if necessary
- lists[domain] = lists[domain] or {}
- -- check if we have a list entry yet
- if lists[domain][list] then
- lists[domain][list] = lists[domain][list] + recent_count
- else
- lists[domain][list] = recent_count -- init the entry
- end
+ listcounts[listname] = {}
+ -- the same list may have both private and public docs
+ for _, privacy in pairs(entry.privacy.buckets) do
+ listcounts[listname][privacy.key_as_string] = privacy.recent.buckets[1].doc_count
+ end
+ end
+ -- save the squashed counts in cache
+ r:ivm_set(PM_LISTS_KEY, JSON.encode(listcounts))
+ end
+
+ -- Now count the docs and lists that are visible to the current user
+ local lists = {}
+ for listname, entry in pairs(listcounts) do
+ local _, list, domain = aaa.parseLid(listname)
+ -- TODO is it necessary to check the lengths?
+ if list and domain and #list > 0 and #domain > 3 then
+ -- there may be both private and public docs in the list
+ for privacy, recent_count in pairs(entry) do
+ local isPublic = privacy == 'false'
+ -- does the user have access to this list?
+ if isPublic or aaa.canAccessList(r, listname, account) then
+ -- create the domain entry if necessary
+ lists[domain] = lists[domain] or {}
+ -- check if we have a list entry yet
+ if lists[domain][list] then
+ lists[domain][list] = lists[domain][list] + recent_count
+ else
+ lists[domain][list] = recent_count -- init the entry
end
end
end
end
- -- save temporary list in cache
- r:ivm_set(PM_LISTS_KEY, JSON.encode(lists))
end
-- do we need to remove junk?