0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-11-17 23:40:57 +01:00

ircd:Ⓜ️:room::members: Add host argument to interface stack for more efficient queries.

This commit is contained in:
Jason Volk 2019-09-11 10:03:10 -07:00
parent 090fac34bc
commit 0241f2b9a1
3 changed files with 129 additions and 45 deletions

View file

@ -26,17 +26,21 @@ struct ircd::m::room::members
m::room room; m::room room;
bool for_each_join_present(const closure &) const; bool for_each_join_present(const string_view &host, const closure &) const;
public: public:
bool for_each(const string_view &membership, const string_view &host, const closure &) const;
bool for_each(const string_view &membership, const string_view &host, const closure_idx &) const;
bool for_each(const string_view &membership, const closure &) const; bool for_each(const string_view &membership, const closure &) const;
bool for_each(const string_view &membership, const closure_idx &) const; bool for_each(const string_view &membership, const closure_idx &) const;
bool for_each(const closure &) const; bool for_each(const closure &) const;
bool for_each(const closure_idx &) const; bool for_each(const closure_idx &) const;
bool empty(const string_view &membership, const string_view &host) const;
bool empty(const string_view &membership) const; bool empty(const string_view &membership) const;
bool empty() const; bool empty() const;
size_t count(const string_view &membership, const string_view &host) const;
size_t count(const string_view &membership) const; size_t count(const string_view &membership) const;
size_t count() const; size_t count() const;

View file

@ -2990,14 +2990,23 @@ bool
ircd::m::room::members::empty() ircd::m::room::members::empty()
const const
{ {
return empty(string_view{}); return empty(string_view{}, string_view{});
} }
bool bool
ircd::m::room::members::empty(const string_view &membership) ircd::m::room::members::empty(const string_view &membership)
const const
{ {
return for_each(membership, closure{[](const auto &) return empty(membership, string_view{});
}
bool
ircd::m::room::members::empty(const string_view &membership,
const string_view &host)
const
{
return for_each(membership, host, closure{[]
(const user::id &user_id)
{ {
return false; return false;
}}); }});
@ -3007,16 +3016,24 @@ size_t
ircd::m::room::members::count() ircd::m::room::members::count()
const const
{ {
return count(string_view{}); return count(string_view{}, string_view{});
} }
size_t size_t
ircd::m::room::members::count(const string_view &membership) ircd::m::room::members::count(const string_view &membership)
const const
{
return count(membership, string_view{});
}
size_t
ircd::m::room::members::count(const string_view &membership,
const string_view &host)
const
{ {
size_t ret{0}; size_t ret{0};
this->for_each(membership, room::members::closure{[&ret] for_each(membership, host, closure{[&ret]
(const id::user &) (const user::id &user_id)
{ {
++ret; ++ret;
return true; return true;
@ -3041,6 +3058,51 @@ const
bool bool
ircd::m::room::members::for_each(const string_view &membership, ircd::m::room::members::for_each(const string_view &membership,
const closure &closure)
const
{
return for_each(membership, string_view{}, closure);
}
bool
ircd::m::room::members::for_each(const string_view &membership,
const closure_idx &closure)
const
{
return for_each(membership, string_view{}, closure);
}
bool
ircd::m::room::members::for_each(const string_view &membership,
const string_view &host,
const closure &closure)
const
{
const m::room::state state
{
room
};
const bool present
{
state.present()
};
// joined members optimization. Only possible when seeking
// membership="join" on the present state of the room.
if(membership == "join" && present)
return for_each_join_present(host, closure);
return this->for_each(membership, host, [&closure]
(const auto &user_id, const auto &event_idx)
{
return closure(user_id);
});
}
bool
ircd::m::room::members::for_each(const string_view &membership,
const string_view &host,
const closure_idx &closure) const closure_idx &closure)
const const
{ {
@ -3057,7 +3119,7 @@ const
// joined members optimization. Only possible when seeking // joined members optimization. Only possible when seeking
// membership="join" on the present state of the room. // membership="join" on the present state of the room.
if(membership == "join" && present) if(membership == "join" && present)
return for_each_join_present([&closure, &state] return for_each_join_present(host, [&closure, &state]
(const id::user &user_id) (const id::user &user_id)
{ {
const auto &event_idx const auto &event_idx
@ -3084,44 +3146,26 @@ const
return true; return true;
}); });
return state.for_each("m.room.member", [this, &membership, &closure] return state.for_each("m.room.member", [this, &host, &membership, &closure]
(const string_view &type, const string_view &state_key, const event::idx &event_idx) (const string_view &type, const string_view &state_key, const event::idx &event_idx)
{ {
const m::user::id &user_id
{
state_key
};
if(host && user_id.host() != host)
return true;
return !membership || this->membership(event_idx, membership)? return !membership || this->membership(event_idx, membership)?
closure(state_key, event_idx): closure(user_id, event_idx):
true; true;
}); });
} }
bool bool
ircd::m::room::members::for_each(const string_view &membership, ircd::m::room::members::for_each_join_present(const string_view &host,
const closure &closure) const closure &closure)
const
{
const m::room::state state
{
room
};
const bool present
{
state.present()
};
// joined members optimization. Only possible when seeking
// membership="join" on the present state of the room.
if(membership == "join" && present)
return for_each_join_present(closure);
return this->for_each(membership, [&closure]
(const auto &user_id, const auto &event_idx)
{
return closure(user_id);
});
}
bool
ircd::m::room::members::for_each_join_present(const closure &closure)
const const
{ {
db::domain &index db::domain &index
@ -3129,9 +3173,15 @@ const
dbs::room_joined dbs::room_joined
}; };
char keybuf[dbs::ROOM_JOINED_KEY_MAX_SIZE];
const string_view &key
{
dbs::room_joined_key(keybuf, room.room_id, host)
};
auto it auto it
{ {
index.begin(room.room_id) index.begin(key)
}; };
for(; bool(it); ++it) for(; bool(it); ++it)
@ -3141,6 +3191,9 @@ const
dbs::room_joined_key(it->first) dbs::room_joined_key(it->first)
}; };
if(host && origin != host)
break;
if(!closure(user_id)) if(!closure(user_id))
return false; return false;
} }

View file

@ -7792,13 +7792,33 @@ console_cmd__room__top(opt &out, const string_view &line)
char version_buf[32], display_buf[256]; char version_buf[32], display_buf[256];
out << "display name: " << m::display_name(display_buf, room_id) << std::endl; out << "display name: " << m::display_name(display_buf, room_id) << std::endl;
out << "creator: " << m::creator(room_id) << std::endl;
out << "version: " << m::version(version_buf, room_id) << std::endl; out << "version: " << m::version(version_buf, room_id) << std::endl;
out << "joined: " << m::room::members{room_id}.count("join") << std::endl; out << "internal: " << m::internal(room_id) << std::endl;
out << "remote joined: " << std::boolalpha << m::remote_joined(room_id) << std::endl;
out << "local joined: " << std::boolalpha << m::local_joined(room_id) << std::endl;
out << "local only: " << std::boolalpha << m::local_only(room_id) << std::endl; out << "local only: " << std::boolalpha << m::local_only(room_id) << std::endl;
out << "local joined: " << std::boolalpha << m::local_joined(room_id) << std::endl;
out << "remote joined: " << std::boolalpha << m::remote_joined(room_id) << std::endl;
out << std::endl; out << std::endl;
const m::room::members members(room_id);
out << "invite: " << std::setw(7) << members.count("invite")
<< std::endl
<< "invite local: " << std::setw(7) << members.count("invite", my_host())
<< std::endl
<< "join: " << std::setw(7) << members.count("join")
<< std::endl
<< "join local: " << std::setw(7) << members.count("join", my_host())
<< std::endl
<< "leave: " << std::setw(7) << members.count("leave")
<< std::endl
<< "leave local: " << std::setw(7) << members.count("leave", my_host())
<< std::endl
<< "ban: " << std::setw(7) << members.count("ban")
<< std::endl
<< "ban local: " << std::setw(7) << members.count("ban", my_host())
<< std::endl
<< std::endl;
out << "servers: " << m::room::origins{room_id}.count() << std::endl; out << "servers: " << m::room::origins{room_id}.count() << std::endl;
out << "servers up: " << m::room::origins{room_id}.count_online() << std::endl; out << "servers up: " << m::room::origins{room_id}.count_online() << std::endl;
out << "servers err: " << m::room::origins{room_id}.count_error() << std::endl; out << "servers err: " << m::room::origins{room_id}.count_error() << std::endl;
@ -8566,7 +8586,7 @@ console_cmd__room__members(opt &out, const string_view &line)
{ {
const params param{line, " ", const params param{line, " ",
{ {
"room_id", "[membership]" "room_id", "[membership]" "[host]"
}}; }};
const auto &room_id const auto &room_id
@ -8576,7 +8596,14 @@ console_cmd__room__members(opt &out, const string_view &line)
const string_view &membership const string_view &membership
{ {
param[1] param[1] != "\"\""?
param[1]:
string_view{}
};
const string_view &host
{
param[2]
}; };
const m::room room const m::room room
@ -8591,7 +8618,7 @@ console_cmd__room__members(opt &out, const string_view &line)
if(membership) if(membership)
{ {
members.for_each(membership, [&out, &membership] members.for_each(membership, host, [&out, &membership]
(const m::user::id &user_id) (const m::user::id &user_id)
{ {
out << std::setw(8) << std::left << membership out << std::setw(8) << std::left << membership
@ -8603,7 +8630,7 @@ console_cmd__room__members(opt &out, const string_view &line)
return true; return true;
} }
members.for_each(membership, [&out] members.for_each(membership, host, [&out]
(const m::user::id &user_id, const m::event::idx &event_idx) (const m::user::id &user_id, const m::event::idx &event_idx)
{ {
char buf[32]; char buf[32];