-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Add an approximate difference method to StateFilters #10825
Changes from 3 commits
7dad902
1fe75e6
a05692c
10a7071
d0e14d5
a5fdd46
0e0085c
9d50f05
ace3316
c72c436
bacd394
cd1de9b
6bedcba
42617db
0c8e930
b6274d6
f6b4dc5
0d1c3d8
18714d7
770afea
e119af9
70f646a
c9bb226
093f670
a187c24
4bbe3d1
20bc299
27c3a7a
54d77c9
538f99e
bf202bc
9169d38
1f3008b
3552bc1
4eaf980
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Add an 'approximate difference' method to `StateFilter`. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -105,7 +105,6 @@ def test_get_state_groups(self): | |
self.assertEqual({ev.event_id for ev in state_list}, {e1.event_id, e2.event_id}) | ||
|
||
def test_get_state_for_event(self): | ||
|
||
# this defaults to a linear DAG as each new injection defaults to whatever | ||
# forward extremities are currently in the DB for this room. | ||
e1 = self.inject_state_event(self.room, self.u_alice, EventTypes.Create, "", {}) | ||
|
@@ -483,3 +482,88 @@ def test_get_state_for_event(self): | |
|
||
self.assertEqual(is_all, True) | ||
self.assertDictEqual({(e5.type, e5.state_key): e5.event_id}, state_dict) | ||
|
||
def test_state_filter_difference(self): | ||
def assert_difference( | ||
minuend: StateFilter, subtrahend: StateFilter, expected: StateFilter | ||
): | ||
self.assertEqual( | ||
minuend.approx_difference(subtrahend), | ||
expected, | ||
f"StateFilter difference not correct:\n\n\t{minuend!r}\nminus\n\t{subtrahend!r}\nwas\n\t{minuend.approx_difference(subtrahend)}\nexpected\n\t{expected}", | ||
) | ||
|
||
# it's not possible to subtract individual state keys from | ||
# a wildcard | ||
assert_difference( | ||
StateFilter.all(), | ||
StateFilter.from_types( | ||
((EventTypes.Member, "@wombat:hs1"), (EventTypes.Member, "@spqr:hs1")) | ||
), | ||
StateFilter.all(), | ||
) | ||
self.assertEqual( | ||
StateFilter.all().approx_difference( | ||
StateFilter.from_types( | ||
( | ||
(EventTypes.Member, "@wombat:hs1"), | ||
(EventTypes.Member, "@spqr:hs1"), | ||
) | ||
) | ||
), | ||
StateFilter.all(), | ||
) | ||
reivilibre marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
# we can subtract wildcards from wildcards | ||
assert_difference(StateFilter.all(), StateFilter.all(), StateFilter.none()) | ||
assert_difference( | ||
StateFilter( | ||
types=frozendict( | ||
{ | ||
EventTypes.Member: frozenset(), | ||
EventTypes.CanonicalAlias: None, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not really relevant to this change, but: it wasn't obvious to me what an empty set and None mean here (and if they ought to have different meanings). I don't know if there's a nice way. If we had sum types I'd suggest enum Fetch {
All,
None,
WithStateKey(set_of_strings),
} But that's slightly awkward because There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The docstring for StateFilter specifies what they mean, though that's not to say I don't agree with you — and yeah, I think empty set makes sense, but 'None' very much reads as, well, none. It's half tempting to have a constant |
||
} | ||
), | ||
include_others=True, | ||
), | ||
StateFilter( | ||
types=frozendict({EventTypes.JoinRules: None}), include_others=False | ||
), | ||
StateFilter( | ||
types=frozendict( | ||
{EventTypes.Member: frozenset(), EventTypes.JoinRules: frozenset()} | ||
), | ||
include_others=True, | ||
), | ||
) | ||
|
||
# we can subtract individual state keys, except from wildcards | ||
assert_difference( | ||
StateFilter( | ||
types=frozendict( | ||
{ | ||
EventTypes.Member: frozenset({"@wombat:hs1", "@kristina:hs2"}), | ||
EventTypes.CanonicalAlias: None, | ||
} | ||
), | ||
include_others=False, | ||
), | ||
StateFilter( | ||
types=frozendict( | ||
{ | ||
EventTypes.Member: frozenset({"@kristina:hs2"}), | ||
EventTypes.CanonicalAlias: frozenset({""}), | ||
} | ||
), | ||
include_others=False, | ||
), | ||
StateFilter( | ||
types=frozendict( | ||
{ | ||
EventTypes.Member: frozenset({"@wombat:hs1"}), | ||
EventTypes.CanonicalAlias: None, | ||
} | ||
), | ||
include_others=False, | ||
), | ||
) |
Uh oh!
There was an error while loading. Please reload this page.