blah
This commit is contained in:
parent
1a64c21301
commit
f651f850a4
|
@ -281,10 +281,32 @@ class ChunkDBOrderedListStore(OrderedListStore):
|
||||||
# We pick the interval to try and minimise the number of decimal
|
# We pick the interval to try and minimise the number of decimal
|
||||||
# places, i.e. we round to nearest float with `rebalance_digits` and
|
# places, i.e. we round to nearest float with `rebalance_digits` and
|
||||||
# use that as one side of the interval
|
# use that as one side of the interval
|
||||||
|
|
||||||
order = self._get_order(node_id)
|
order = self._get_order(node_id)
|
||||||
|
rebalance_digits = self.rebalance_digits
|
||||||
a = round(order, self.rebalance_digits)
|
a = round(order, self.rebalance_digits)
|
||||||
min_order = a - 10 ** -self.rebalance_digits
|
diff = 10 ** - self.rebalance_digits
|
||||||
max_order = a + 10 ** -self.rebalance_digits
|
|
||||||
|
while True:
|
||||||
|
min_order = a - diff
|
||||||
|
max_order = a + diff
|
||||||
|
|
||||||
|
sql = """
|
||||||
|
SELECT count(chunk_id) FROM chunk_linearized
|
||||||
|
WHERE ordering >= ? AND ordering <= ? AND room_id = ?
|
||||||
|
"""
|
||||||
|
self.txn.execute(sql, (
|
||||||
|
min_order - self.min_difference,
|
||||||
|
max_order + self.min_difference,
|
||||||
|
self.room_id,
|
||||||
|
))
|
||||||
|
|
||||||
|
cnt, = self.txn.fetchone()
|
||||||
|
step = (max_order - min_order) / cnt
|
||||||
|
if step > 1 / self.min_difference:
|
||||||
|
break
|
||||||
|
|
||||||
|
diff *= 2
|
||||||
|
|
||||||
# Now we get all the nodes in the range. We add the minimum difference
|
# Now we get all the nodes in the range. We add the minimum difference
|
||||||
# to the bounds to ensure that we don't accidentally move a node to be
|
# to the bounds to ensure that we don't accidentally move a node to be
|
||||||
|
@ -292,6 +314,7 @@ class ChunkDBOrderedListStore(OrderedListStore):
|
||||||
sql = """
|
sql = """
|
||||||
SELECT chunk_id FROM chunk_linearized
|
SELECT chunk_id FROM chunk_linearized
|
||||||
WHERE ordering >= ? AND ordering <= ? AND room_id = ?
|
WHERE ordering >= ? AND ordering <= ? AND room_id = ?
|
||||||
|
ORDER BY ordering ASC
|
||||||
"""
|
"""
|
||||||
self.txn.execute(sql, (
|
self.txn.execute(sql, (
|
||||||
min_order - self.min_difference,
|
min_order - self.min_difference,
|
||||||
|
|
|
@ -112,6 +112,12 @@ class OrderedListStore(object):
|
||||||
pe_s = self.get_nodes_with_edges_to(s)
|
pe_s = self.get_nodes_with_edges_to(s)
|
||||||
fe_t = self.get_nodes_with_edges_from(t)
|
fe_t = self.get_nodes_with_edges_from(t)
|
||||||
|
|
||||||
|
for n, _ in pe_s:
|
||||||
|
assert n not in to_s
|
||||||
|
|
||||||
|
for n, _ in fe_t:
|
||||||
|
assert n not in from_t
|
||||||
|
|
||||||
l_s = len(pe_s)
|
l_s = len(pe_s)
|
||||||
l_t = len(fe_t)
|
l_t = len(fe_t)
|
||||||
|
|
||||||
|
@ -145,15 +151,19 @@ class OrderedListStore(object):
|
||||||
if t is None:
|
if t is None:
|
||||||
t = self.get_next(source)
|
t = self.get_next(source)
|
||||||
|
|
||||||
|
for node_id in to_s:
|
||||||
|
self._delete_ordering(node_id)
|
||||||
|
|
||||||
while to_s:
|
while to_s:
|
||||||
s1 = to_s.pop()
|
s1 = to_s.pop()
|
||||||
self._delete_ordering(s1)
|
|
||||||
self._insert_after(s1, s)
|
self._insert_after(s1, s)
|
||||||
s = s1
|
s = s1
|
||||||
|
|
||||||
|
for node_id in from_t:
|
||||||
|
self._delete_ordering(node_id)
|
||||||
|
|
||||||
while from_t:
|
while from_t:
|
||||||
t1 = from_t.pop()
|
t1 = from_t.pop()
|
||||||
self._delete_ordering(t1)
|
|
||||||
self._insert_before(t1, t)
|
self._insert_before(t1, t)
|
||||||
t = t1
|
t = t1
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ class ChunkLinearizerStoreTestCase(tests.unittest.TestCase):
|
||||||
table.add_node("A")
|
table.add_node("A")
|
||||||
table._insert_after("B", "A")
|
table._insert_after("B", "A")
|
||||||
table._insert_before("C", "A")
|
table._insert_before("C", "A")
|
||||||
|
table._insert_after("D", "A")
|
||||||
|
|
||||||
sql = """
|
sql = """
|
||||||
SELECT chunk_id FROM chunk_linearized
|
SELECT chunk_id FROM chunk_linearized
|
||||||
|
@ -58,7 +59,7 @@ class ChunkLinearizerStoreTestCase(tests.unittest.TestCase):
|
||||||
|
|
||||||
ordered = [r for r, in txn]
|
ordered = [r for r, in txn]
|
||||||
|
|
||||||
self.assertEqual(["C", "A", "B"], ordered)
|
self.assertEqual(["C", "A", "D", "B"], ordered)
|
||||||
|
|
||||||
yield self.store.runInteraction("test", test_txn)
|
yield self.store.runInteraction("test", test_txn)
|
||||||
|
|
||||||
|
@ -183,3 +184,44 @@ class ChunkLinearizerStoreTestCase(tests.unittest.TestCase):
|
||||||
self.assertEqual(expected, ordered)
|
self.assertEqual(expected, ordered)
|
||||||
|
|
||||||
yield self.store.runInteraction("test", test_txn)
|
yield self.store.runInteraction("test", test_txn)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def test_get_edges_to(self):
|
||||||
|
room_id = "foo_room4"
|
||||||
|
|
||||||
|
def test_txn(txn):
|
||||||
|
table = ChunkDBOrderedListStore(
|
||||||
|
txn, room_id, self.clock, 1, 100,
|
||||||
|
)
|
||||||
|
|
||||||
|
table.add_node("A")
|
||||||
|
table._insert_after("B", "A")
|
||||||
|
table._add_edge_to_graph("A", "B")
|
||||||
|
table._insert_before("C", "A")
|
||||||
|
table._add_edge_to_graph("C", "A")
|
||||||
|
|
||||||
|
nodes = table.get_nodes_with_edges_from("A")
|
||||||
|
self.assertEqual([n for _, n in nodes], ["B"])
|
||||||
|
|
||||||
|
nodes = table.get_nodes_with_edges_to("A")
|
||||||
|
self.assertEqual([n for _, n in nodes], ["C"])
|
||||||
|
|
||||||
|
yield self.store.runInteraction("test", test_txn)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def test_get_next_and_prev(self):
|
||||||
|
room_id = "foo_room5"
|
||||||
|
|
||||||
|
def test_txn(txn):
|
||||||
|
table = ChunkDBOrderedListStore(
|
||||||
|
txn, room_id, self.clock, 1, 100,
|
||||||
|
)
|
||||||
|
|
||||||
|
table.add_node("A")
|
||||||
|
table._insert_after("B", "A")
|
||||||
|
table._insert_before("C", "A")
|
||||||
|
|
||||||
|
self.assertEqual(table.get_next("A"), "B")
|
||||||
|
self.assertEqual(table.get_prev("A"), "C")
|
||||||
|
|
||||||
|
yield self.store.runInteraction("test", test_txn)
|
||||||
|
|
|
@ -56,3 +56,29 @@ class KatrielBodlaenderTests(unittest.TestCase):
|
||||||
store.add_edge("node_4", "node_3")
|
store.add_edge("node_4", "node_3")
|
||||||
|
|
||||||
self.assertEqual(list(reversed(nodes)), store.list)
|
self.assertEqual(list(reversed(nodes)), store.list)
|
||||||
|
|
||||||
|
def test_divergent_graph(self):
|
||||||
|
store = InMemoryOrderedListStore()
|
||||||
|
|
||||||
|
nodes = [
|
||||||
|
"node_1",
|
||||||
|
"node_2",
|
||||||
|
"node_3",
|
||||||
|
"node_4",
|
||||||
|
"node_5",
|
||||||
|
"node_6",
|
||||||
|
]
|
||||||
|
|
||||||
|
for node in reversed(nodes):
|
||||||
|
store.add_node(node)
|
||||||
|
|
||||||
|
store.add_edge("node_2", "node_3")
|
||||||
|
store.add_edge("node_2", "node_5")
|
||||||
|
store.add_edge("node_1", "node_2")
|
||||||
|
store.add_edge("node_3", "node_4")
|
||||||
|
store.add_edge("node_1", "node_3")
|
||||||
|
store.add_edge("node_4", "node_5")
|
||||||
|
store.add_edge("node_5", "node_6")
|
||||||
|
store.add_edge("node_4", "node_6")
|
||||||
|
|
||||||
|
self.assertEqual(nodes, store.list)
|
||||||
|
|
Loading…
Reference in New Issue