Software /
code /
prosody-modules
Diff
mod_storage_xmlarchive/mod_storage_xmlarchive.lua @ 4649:62d41447615d
mod_storage_xmlarchive: Support query by list of IDs
Needed for extended MAM
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 15 Aug 2021 12:57:00 +0200 |
parent | 4648:37ca6109077f |
child | 4671:98bf0f597df4 |
line wrap: on
line diff
--- a/mod_storage_xmlarchive/mod_storage_xmlarchive.lua Fri Aug 13 01:23:34 2021 +0200 +++ b/mod_storage_xmlarchive/mod_storage_xmlarchive.lua Sun Aug 15 12:57:00 2021 +0200 @@ -26,6 +26,7 @@ total = false, quota = nil, full_id_range = true; + ids = true; }; local is_stanza = st.is_stanza or function (s) @@ -204,6 +205,33 @@ end reset_stream(); + local filtered_ids = false; + local filtered_dates = false; + if query.ids then + filtered_ids = {}; + filtered_dates = {}; + for _, id in ipairs(query.ids) do + filtered_ids[id] = true; + if filtered_dates then + local date = id:match("^%d%d%d%d%-%d%d%-%d%d"); + if date then + filtered_dates[date] = true; + else + -- if any id diverges from the standard then the item could be from any date + filtered_dates = nil; + end + end + end + end + + if filtered_dates then + for i = #dates, 1, -1 do + if not filtered_dates[ dates[i] ] then + table.remove(dates, i); + end + end + end + local limit = query.limit; local start_day, step, last_day = 1, 1, #dates; local count = 0; @@ -339,7 +367,8 @@ if (not q_with or i_with == q_with) and (not q_start or i_when >= q_start) - and (not q_end or i_when <= q_end) then + and (not q_end or i_when <= q_end) + and (not filtered_ids or filtered_ids[item.id]) then count = count + 1; first_item = i + step;