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:
parent
090fac34bc
commit
0241f2b9a1
3 changed files with 129 additions and 45 deletions
|
@ -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;
|
||||||
|
|
||||||
|
|
127
ircd/m_room.cc
127
ircd/m_room.cc
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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];
|
||||||
|
|
Loading…
Reference in a new issue