From 92154be55de2e969a6bde0f3162aef897583eb71 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 23 Jan 2019 15:36:02 -0800 Subject: [PATCH] ircd::m: Use event::keys::selection bitset in event::fetch::opts rather than event::keys. --- include/ircd/m/event/fetch.h | 11 +++------- ircd/m.cc | 8 ++------ ircd/m_event.cc | 40 +++++++++++++++--------------------- ircd/m_room.cc | 35 ++++++++++++------------------- modules/m_rooms.cc | 7 ++----- 5 files changed, 37 insertions(+), 64 deletions(-) diff --git a/include/ircd/m/event/fetch.h b/include/ircd/m/event/fetch.h index 7c08fab66..8659cb6de 100644 --- a/include/ircd/m/event/fetch.h +++ b/include/ircd/m/event/fetch.h @@ -98,23 +98,18 @@ namespace ircd::m struct ircd::m::event::fetch::opts { /// Event property selector - event::keys keys; + event::keys::selection keys; /// Database get options passthru db::gopts gopts; - /// Whether to allow querying the event_json to populate the event. A value - /// of true only allows this type of query to be made; a value of false - /// prevents this query from ever being made. - bool query_json {true}; - /// Whether to force an attempt at populating the event from event_json /// first, bypassing any decision-making. This is useful if a key selection /// is used which would trigger a row query but the developer wants the /// json query anyway. bool query_json_force {false}; - opts(const event::keys &, const db::gopts & = {}); - opts(const db::gopts &, const event::keys & = {}); + opts(const event::keys::selection &, const db::gopts & = {}); + opts(const db::gopts &, const event::keys::selection & = {}); opts() = default; }; diff --git a/ircd/m.cc b/ircd/m.cc index e3955e5ff..f97d93cd8 100644 --- a/ircd/m.cc +++ b/ircd/m.cc @@ -2576,13 +2576,9 @@ ircd::m::user::rooms::for_each(const string_view &membership, const { // Setup the list of event fields to fetch for the closure - static const event::keys keys + static const event::keys::include keys { - event::keys::include - { - "state_key", - "content", - } + "state_key", "content", }; const m::event::fetch::opts fopts diff --git a/ircd/m_event.cc b/ircd/m_event.cc index 7e6892a51..18f0f9ae0 100644 --- a/ircd/m_event.cc +++ b/ircd/m_event.cc @@ -253,13 +253,13 @@ bool ircd::m::cached(const event::idx &event_idx, const event::fetch::opts &opts) { - const auto &select(opts.keys); - auto &columns(dbs::event_column); const byte_view &key { event_idx }; + auto &columns(dbs::event_column); + const event::keys &select(opts.keys); return std::all_of(begin(select), end(select), [&opts, &key, &columns] (const string_view &colname) { @@ -1228,11 +1228,8 @@ void ircd::m::prefetch(const event::idx &event_idx, const event::fetch::opts &opts) { - const vector_view cols - { - opts.keys - }; - + const event::keys keys{opts.keys}; + const vector_view cols{keys}; for(const auto &col : cols) if(col) prefetch(event_idx, col); @@ -1624,7 +1621,7 @@ ircd::m::event::fetch::fetch(const event::idx &event_idx, event_idx && !_json.valid(key(&event_idx))? key(&event_idx): string_view{}, - opts.keys, + event::keys{opts.keys}, cell, opts.gopts } @@ -1650,7 +1647,7 @@ ircd::m::event::fetch::fetch(const opts &opts) { *dbs::events, string_view{}, - opts.keys, + event::keys{opts.keys}, cell, opts.gopts } @@ -1704,21 +1701,18 @@ ircd::m::event::fetch::assign_from_row(const opts &opts, bool ircd::m::event::fetch::should_seek_json(const opts &opts) { - // User never wants to make the event_json query - if(!opts.query_json) - return false; - - // User always wants to make the event_json query + // User always wants to make the event_json query regardless + // of their keys selection. if(opts.query_json_force) return true; - // User is making specific column queries - if(opts.keys.count() < event::size()) - return false; - - // User is querying all columns - if(opts.keys.count() == event::size()) - return true; + // If and only if selected keys have direct columns we can return + // false to seek direct columns. If any other keys are selected we + /// must perform the event_json query instead. + for(size_t i(0); i < opts.keys.size(); ++i) + if(opts.keys.test(i)) + if(!dbs::event_column.at(i)) + return true; return false; } @@ -1735,7 +1729,7 @@ ircd::m::event::fetch::key(const event::idx *const &event_idx) // ircd::m::event::fetch::opts::opts(const db::gopts &gopts, - const event::keys &keys) + const event::keys::selection &keys) :opts { keys, gopts @@ -1743,7 +1737,7 @@ ircd::m::event::fetch::opts::opts(const db::gopts &gopts, { } -ircd::m::event::fetch::opts::opts(const event::keys &keys, +ircd::m::event::fetch::opts::opts(const event::keys::selection &keys, const db::gopts &gopts) :keys{keys} ,gopts{gopts} diff --git a/ircd/m_room.cc b/ircd/m_room.cc index 6669914eb..c44e16e0a 100644 --- a/ircd/m_room.cc +++ b/ircd/m_room.cc @@ -371,7 +371,7 @@ ircd::m::room::membership(const mutable_buffer &out, const m::id::user &user_id) const { - static const event::keys membership_keys + static const event::keys::selection membership_keys { event::keys::include{"membership"} }; @@ -405,7 +405,7 @@ const // is a rare case so both queries are optimized to only seek for their key. if(exists && !ret) { - static const event::keys content_membership_keys + static const event::keys::selection content_membership_keys { event::keys::include{"content"} }; @@ -1640,14 +1640,11 @@ const } // The list of event fields to fetch for the closure - static const event::keys keys + static const event::keys::include keys { - event::keys::include - { - "event_id", // Added for any upstack usage (but may be unnecessary). - "membership", // Required for membership test. - "content", // Required because synapse events randomly have no event.membership - } + "event_id", // Added for any upstack usage (but may be unnecessary). + "membership", // Required for membership test. + "content", // Required because synapse events randomly have no event.membership }; const m::event::fetch::opts fopts @@ -1726,15 +1723,12 @@ ircd::m::room::members::for_each(const string_view &membership, const { // Setup the list of event fields to fetch for the closure - static const event::keys keys + static const event::keys::include keys { - event::keys::include - { - "event_id", - "membership", - "state_key", - "content", // Required because synapse events randomly have no event.membership - } + "event_id", + "membership", + "state_key", + "content", // Required because synapse events randomly have no event.membership }; // In this case the fetch opts isn't static so it can maintain the @@ -2460,12 +2454,9 @@ bool ircd::m::room::power::view(const std::function &closure) const { - static const event::keys keys + static const event::keys::include keys { - event::keys::include - { - "content", - } + "content", }; const m::event::fetch::opts fopts diff --git a/modules/m_rooms.cc b/modules/m_rooms.cc index eb6ebdee9..3e89d4fa9 100644 --- a/modules/m_rooms.cc +++ b/modules/m_rooms.cc @@ -184,12 +184,9 @@ void ircd::m::rooms::local_summary_chunk(const m::room &room, json::stack::object &obj) { - static const event::keys keys + static const event::keys::include keys { - event::keys::include - { - "content", - } + "content", }; const m::event::fetch::opts fopts