0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-09-25 09:58:54 +02:00

ircd:Ⓜ️:room::type: Add prefix matching option.

This commit is contained in:
Jason Volk 2020-03-24 14:44:35 -07:00
parent d1f9b11b4c
commit 36b1fa6bde
2 changed files with 11 additions and 4 deletions

View file

@ -25,6 +25,7 @@ struct ircd::m::room::type
m::room room; m::room room;
string_view _type; string_view _type;
std::pair<uint64_t, int64_t> range; // highest (inclusive) to lowest (exclusive) std::pair<uint64_t, int64_t> range; // highest (inclusive) to lowest (exclusive)
bool prefixing; // true = startswith(type)
public: public:
bool for_each(const closure &) const; bool for_each(const closure &) const;
@ -33,7 +34,8 @@ struct ircd::m::room::type
type(const m::room &, type(const m::room &,
const string_view &type = {}, const string_view &type = {},
const decltype(range) & = { -1UL, -1L }); const decltype(range) & = { -1UL, -1L },
const bool &prefixing = false);
static bool prefetch(const room::id &, const string_view &type, const int64_t &depth); static bool prefetch(const room::id &, const string_view &type, const int64_t &depth);
static bool prefetch(const room::id &, const string_view &type); static bool prefetch(const room::id &, const string_view &type);
@ -42,8 +44,10 @@ struct ircd::m::room::type
inline inline
ircd::m::room::type::type(const m::room &room, ircd::m::room::type::type(const m::room &room,
const string_view &type, const string_view &type,
const decltype(range) &range) const decltype(range) &range,
const bool &prefixing)
:room{room} :room{room}
,_type{type} ,_type{type}
,range{range} ,range{range}
,prefixing{prefixing}
{} {}

View file

@ -77,10 +77,13 @@ const
dbs::room_type_key(it->first) dbs::room_type_key(it->first)
}; };
if(this->_type && this->_type != _type) if(int64_t(depth) <= range.second)
break; break;
if(int64_t(depth) <= range.second) if(this->_type && !prefixing && this->_type != _type)
break;
if(this->_type && prefixing && !startswith(_type, this->_type))
break; break;
if(!closure(_type, depth, event_idx)) if(!closure(_type, depth, event_idx))