Skip to content

Commit ec5aceb

Browse files
committed
RoundRobinSet->OrderedSet plus tests
1 parent f1c1c83 commit ec5aceb

File tree

2 files changed

+56
-76
lines changed

2 files changed

+56
-76
lines changed

neo4j/v1/routing.py

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
LOAD_BALANCING_STRATEGY_DEFAULT = LOAD_BALANCING_STRATEGY_LEAST_CONNECTED
4040

4141

42-
class RoundRobinSet(MutableSet):
42+
class OrderedSet(MutableSet):
4343

4444
def __init__(self, elements=()):
4545
self._elements = OrderedDict.fromkeys(elements)
@@ -51,22 +51,15 @@ def __repr__(self):
5151
def __contains__(self, element):
5252
return element in self._elements
5353

54-
def __next__(self):
55-
current = None
56-
if self._elements:
57-
if self._current is None:
58-
self._current = 0
59-
else:
60-
self._current = (self._current + 1) % len(self._elements)
61-
current = self.get(self._current)
62-
return current
63-
6454
def __iter__(self):
6555
return iter(self._elements)
6656

6757
def __len__(self):
6858
return len(self._elements)
6959

60+
def __getitem__(self, index):
61+
return list(self._elements.keys())[index]
62+
7063
def add(self, element):
7164
self._elements[element] = None
7265

@@ -79,9 +72,6 @@ def discard(self, element):
7972
except KeyError:
8073
pass
8174

82-
def next(self):
83-
return self.__next__()
84-
8575
def remove(self, element):
8676
try:
8777
del self._elements[element]
@@ -96,9 +86,6 @@ def replace(self, elements=()):
9686
e.clear()
9787
e.update(OrderedDict.fromkeys(elements))
9888

99-
def get(self, index):
100-
return list(self._elements.keys())[index]
101-
10289

10390
class RoutingTable(object):
10491

@@ -135,9 +122,9 @@ def parse_routing_info(cls, records):
135122
return cls(routers, readers, writers, ttl)
136123

137124
def __init__(self, routers=(), readers=(), writers=(), ttl=0):
138-
self.routers = RoundRobinSet(routers)
139-
self.readers = RoundRobinSet(readers)
140-
self.writers = RoundRobinSet(writers)
125+
self.routers = OrderedSet(routers)
126+
self.readers = OrderedSet(readers)
127+
self.writers = OrderedSet(writers)
141128
self.last_updated_time = self.timer()
142129
self.ttl = ttl
143130

@@ -250,7 +237,7 @@ def select(self, offset, addresses):
250237
least_in_use_connections = maxsize
251238

252239
while True:
253-
address = addresses.get(index)
240+
address = addresses[index]
254241
in_use_connections = self._connection_pool.in_use_connection_count(address)
255242

256243
if in_use_connections < least_in_use_connections:

test/unit/test_routing.py

Lines changed: 48 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
from neo4j.bolt import ProtocolError
2424
from neo4j.bolt.connection import connect
25-
from neo4j.v1.routing import RoundRobinSet, RoutingTable, RoutingConnectionPool
25+
from neo4j.v1.routing import OrderedSet, RoutingTable, RoutingConnectionPool
2626
from neo4j.v1.security import basic_auth
2727
from neo4j.v1.api import Driver, READ_ACCESS, WRITE_ACCESS
2828

@@ -58,87 +58,80 @@ def connector(address):
5858
class RoundRobinSetTestCase(TestCase):
5959

6060
def test_should_repr_as_set(self):
61-
rrs = RoundRobinSet([1, 2, 3])
62-
assert repr(rrs) == "{1, 2, 3}"
61+
s = OrderedSet([1, 2, 3])
62+
assert repr(s) == "{1, 2, 3}"
6363

6464
def test_should_contain_element(self):
65-
rrs = RoundRobinSet([1, 2, 3])
66-
assert 2 in rrs
65+
s = OrderedSet([1, 2, 3])
66+
assert 2 in s
6767

6868
def test_should_not_contain_non_element(self):
69-
rrs = RoundRobinSet([1, 2, 3])
70-
assert 4 not in rrs
71-
72-
def test_should_be_able_to_get_next_if_empty(self):
73-
rrs = RoundRobinSet([])
74-
assert next(rrs) is None
75-
76-
def test_should_be_able_to_get_next_repeatedly(self):
77-
rrs = RoundRobinSet([1, 2, 3])
78-
assert next(rrs) == 1
79-
assert next(rrs) == 2
80-
assert next(rrs) == 3
81-
assert next(rrs) == 1
82-
83-
def test_should_be_able_to_get_next_repeatedly_via_old_method(self):
84-
rrs = RoundRobinSet([1, 2, 3])
85-
assert rrs.next() == 1
86-
assert rrs.next() == 2
87-
assert rrs.next() == 3
88-
assert rrs.next() == 1
69+
s = OrderedSet([1, 2, 3])
70+
assert 4 not in s
71+
72+
def test_should_be_able_to_get_item_if_empty(self):
73+
s = OrderedSet([])
74+
with self.assertRaises(IndexError):
75+
_ = s[0]
76+
77+
def test_should_be_able_to_get_items_by_index(self):
78+
s = OrderedSet([1, 2, 3])
79+
self.assertEqual(s[0], 1)
80+
self.assertEqual(s[1], 2)
81+
self.assertEqual(s[2], 3)
8982

9083
def test_should_be_iterable(self):
91-
rrs = RoundRobinSet([1, 2, 3])
92-
assert list(iter(rrs)) == [1, 2, 3]
84+
s = OrderedSet([1, 2, 3])
85+
assert list(iter(s)) == [1, 2, 3]
9386

9487
def test_should_have_length(self):
95-
rrs = RoundRobinSet([1, 2, 3])
96-
assert len(rrs) == 3
88+
s = OrderedSet([1, 2, 3])
89+
assert len(s) == 3
9790

9891
def test_should_be_able_to_add_new(self):
99-
rrs = RoundRobinSet([1, 2, 3])
100-
rrs.add(4)
101-
assert list(rrs) == [1, 2, 3, 4]
92+
s = OrderedSet([1, 2, 3])
93+
s.add(4)
94+
assert list(s) == [1, 2, 3, 4]
10295

10396
def test_should_be_able_to_add_existing(self):
104-
rrs = RoundRobinSet([1, 2, 3])
105-
rrs.add(2)
106-
assert list(rrs) == [1, 2, 3]
97+
s = OrderedSet([1, 2, 3])
98+
s.add(2)
99+
assert list(s) == [1, 2, 3]
107100

108101
def test_should_be_able_to_clear(self):
109-
rrs = RoundRobinSet([1, 2, 3])
110-
rrs.clear()
111-
assert list(rrs) == []
102+
s = OrderedSet([1, 2, 3])
103+
s.clear()
104+
assert list(s) == []
112105

113106
def test_should_be_able_to_discard_existing(self):
114-
rrs = RoundRobinSet([1, 2, 3])
115-
rrs.discard(2)
116-
assert list(rrs) == [1, 3]
107+
s = OrderedSet([1, 2, 3])
108+
s.discard(2)
109+
assert list(s) == [1, 3]
117110

118111
def test_should_be_able_to_discard_non_existing(self):
119-
rrs = RoundRobinSet([1, 2, 3])
120-
rrs.discard(4)
121-
assert list(rrs) == [1, 2, 3]
112+
s = OrderedSet([1, 2, 3])
113+
s.discard(4)
114+
assert list(s) == [1, 2, 3]
122115

123116
def test_should_be_able_to_remove_existing(self):
124-
rrs = RoundRobinSet([1, 2, 3])
125-
rrs.remove(2)
126-
assert list(rrs) == [1, 3]
117+
s = OrderedSet([1, 2, 3])
118+
s.remove(2)
119+
assert list(s) == [1, 3]
127120

128121
def test_should_not_be_able_to_remove_non_existing(self):
129-
rrs = RoundRobinSet([1, 2, 3])
122+
s = OrderedSet([1, 2, 3])
130123
with self.assertRaises(ValueError):
131-
rrs.remove(4)
124+
s.remove(4)
132125

133126
def test_should_be_able_to_update(self):
134-
rrs = RoundRobinSet([1, 2, 3])
135-
rrs.update([3, 4, 5])
136-
assert list(rrs) == [1, 2, 3, 4, 5]
127+
s = OrderedSet([1, 2, 3])
128+
s.update([3, 4, 5])
129+
assert list(s) == [1, 2, 3, 4, 5]
137130

138131
def test_should_be_able_to_replace(self):
139-
rrs = RoundRobinSet([1, 2, 3])
140-
rrs.replace([3, 4, 5])
141-
assert list(rrs) == [3, 4, 5]
132+
s = OrderedSet([1, 2, 3])
133+
s.replace([3, 4, 5])
134+
assert list(s) == [3, 4, 5]
142135

143136

144137
class RoutingTableConstructionTestCase(TestCase):

0 commit comments

Comments
 (0)