|
|
|
@@ -112,37 +112,37 @@ class TestPerformance(SavepointCaseWithUserDemo):
|
|
|
|
|
rec1 = self.env['test_performance.base'].create({'name': 'X'})
|
|
|
|
|
|
|
|
|
|
# create N lines on rec1: O(N) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(2):
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'line_ids': [Command.create({'value': 0})]})
|
|
|
|
|
self.assertEqual(len(rec1.line_ids), 1)
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(15):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'line_ids': [Command.create({'value': val}) for val in range(1, 12)]})
|
|
|
|
|
self.assertEqual(len(rec1.line_ids), 12)
|
|
|
|
|
|
|
|
|
|
lines = rec1.line_ids
|
|
|
|
|
|
|
|
|
|
# update N lines: O(N) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(6):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'line_ids': [Command.update(line.id, {'value': 42}) for line in lines[0]]})
|
|
|
|
|
self.assertEqual(rec1.line_ids, lines)
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(26):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'line_ids': [Command.update(line.id, {'value': 42 + line.id}) for line in lines[1:]]})
|
|
|
|
|
self.assertEqual(rec1.line_ids, lines)
|
|
|
|
|
|
|
|
|
|
# delete N lines: O(1) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(__system__=14, demo=14):
|
|
|
|
|
with self.assertQueryCount(14):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'line_ids': [Command.delete(line.id) for line in lines[0]]})
|
|
|
|
|
self.assertEqual(rec1.line_ids, lines[1:])
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(__system__=12, demo=12):
|
|
|
|
|
with self.assertQueryCount(12):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'line_ids': [Command.delete(line.id) for line in lines[1:]]})
|
|
|
|
|
self.assertFalse(rec1.line_ids)
|
|
|
|
|
self.assertFalse(lines.exists())
|
|
|
|
@@ -151,13 +151,13 @@ class TestPerformance(SavepointCaseWithUserDemo):
|
|
|
|
|
lines = rec1.line_ids
|
|
|
|
|
|
|
|
|
|
# unlink N lines: O(1) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(__system__=11, demo=11):
|
|
|
|
|
with self.assertQueryCount(14):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'line_ids': [Command.unlink(line.id) for line in lines[0]]})
|
|
|
|
|
self.assertEqual(rec1.line_ids, lines[1:])
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(__system__=12, demo=12):
|
|
|
|
|
with self.assertQueryCount(12):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'line_ids': [Command.unlink(line.id) for line in lines[1:]]})
|
|
|
|
|
self.assertFalse(rec1.line_ids)
|
|
|
|
|
self.assertFalse(lines.exists())
|
|
|
|
@@ -167,36 +167,36 @@ class TestPerformance(SavepointCaseWithUserDemo):
|
|
|
|
|
rec2 = self.env['test_performance.base'].create({'name': 'X'})
|
|
|
|
|
|
|
|
|
|
# link N lines from rec1 to rec2: O(1) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(2):
|
|
|
|
|
with self.assertQueryCount(7):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'line_ids': [Command.link(line.id) for line in lines[0]]})
|
|
|
|
|
self.assertEqual(rec1.line_ids, lines[1:])
|
|
|
|
|
self.assertEqual(rec2.line_ids, lines[0])
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(7):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'line_ids': [Command.link(line.id) for line in lines[1:]]})
|
|
|
|
|
self.assertFalse(rec1.line_ids)
|
|
|
|
|
self.assertEqual(rec2.line_ids, lines)
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(5):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'line_ids': [Command.link(line.id) for line in lines[0]]})
|
|
|
|
|
self.assertEqual(rec2.line_ids, lines)
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(5):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'line_ids': [Command.link(line.id) for line in lines[1:]]})
|
|
|
|
|
self.assertEqual(rec2.line_ids, lines)
|
|
|
|
|
|
|
|
|
|
# empty N lines in rec2: O(1) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(__system__=13, demo=13):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'line_ids': [Command.clear()]})
|
|
|
|
|
self.assertFalse(rec2.line_ids)
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'line_ids': [Command.clear()]})
|
|
|
|
|
self.assertFalse(rec2.line_ids)
|
|
|
|
|
|
|
|
|
@@ -204,18 +204,20 @@ class TestPerformance(SavepointCaseWithUserDemo):
|
|
|
|
|
lines = rec1.line_ids
|
|
|
|
|
|
|
|
|
|
# set N lines in rec2: O(1) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(4):
|
|
|
|
|
with self.assertQueryCount(8):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'line_ids': [Command.set(lines[0].ids)]})
|
|
|
|
|
self.assertEqual(rec1.line_ids, lines[1:])
|
|
|
|
|
self.assertEqual(rec2.line_ids, lines[0])
|
|
|
|
|
|
|
|
|
|
with self.assertQueryCount(5):
|
|
|
|
|
with self.assertQueryCount(7):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'line_ids': [Command.set(lines.ids)]})
|
|
|
|
|
self.assertFalse(rec1.line_ids)
|
|
|
|
|
self.assertEqual(rec2.line_ids, lines)
|
|
|
|
|
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
with self.assertQueryCount(5):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'line_ids': [Command.set(lines.ids)]})
|
|
|
|
|
self.assertEqual(rec2.line_ids, lines)
|
|
|
|
|
|
|
|
|
@@ -238,37 +240,37 @@ class TestPerformance(SavepointCaseWithUserDemo):
|
|
|
|
|
rec1 = self.env['test_performance.base'].create({'name': 'X'})
|
|
|
|
|
|
|
|
|
|
# create N tags on rec1: O(N) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(4):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'tag_ids': [Command.create({'name': 0})]})
|
|
|
|
|
self.assertEqual(len(rec1.tag_ids), 1)
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(14):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'tag_ids': [Command.create({'name': val}) for val in range(1, 12)]})
|
|
|
|
|
self.assertEqual(len(rec1.tag_ids), 12)
|
|
|
|
|
|
|
|
|
|
tags = rec1.tag_ids
|
|
|
|
|
|
|
|
|
|
# update N tags: O(N) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'tag_ids': [Command.update(tag.id, {'name': 'X'}) for tag in tags[0]]})
|
|
|
|
|
self.assertEqual(rec1.tag_ids, tags)
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'tag_ids': [Command.update(tag.id, {'name': 'X'}) for tag in tags[1:]]})
|
|
|
|
|
self.assertEqual(rec1.tag_ids, tags)
|
|
|
|
|
|
|
|
|
|
# delete N tags: O(1) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(__system__=8, demo=8):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'tag_ids': [Command.delete(tag.id) for tag in tags[0]]})
|
|
|
|
|
self.assertEqual(rec1.tag_ids, tags[1:])
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(__system__=8, demo=8):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'tag_ids': [Command.delete(tag.id) for tag in tags[1:]]})
|
|
|
|
|
self.assertFalse(rec1.tag_ids)
|
|
|
|
|
self.assertFalse(tags.exists())
|
|
|
|
@@ -277,13 +279,13 @@ class TestPerformance(SavepointCaseWithUserDemo):
|
|
|
|
|
tags = rec1.tag_ids
|
|
|
|
|
|
|
|
|
|
# unlink N tags: O(1) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'tag_ids': [Command.unlink(tag.id) for tag in tags[0]]})
|
|
|
|
|
self.assertEqual(rec1.tag_ids, tags[1:])
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec1.write({'tag_ids': [Command.unlink(tag.id) for tag in tags[1:]]})
|
|
|
|
|
self.assertFalse(rec1.tag_ids)
|
|
|
|
|
self.assertTrue(tags.exists())
|
|
|
|
@@ -291,56 +293,56 @@ class TestPerformance(SavepointCaseWithUserDemo):
|
|
|
|
|
rec2 = self.env['test_performance.base'].create({'name': 'X'})
|
|
|
|
|
|
|
|
|
|
# link N tags from rec1 to rec2: O(1) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'tag_ids': [Command.link(tag.id) for tag in tags[0]]})
|
|
|
|
|
self.assertEqual(rec2.tag_ids, tags[0])
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'tag_ids': [Command.link(tag.id) for tag in tags[1:]]})
|
|
|
|
|
self.assertEqual(rec2.tag_ids, tags)
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(2):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'tag_ids': [Command.link(tag.id) for tag in tags[1:]]})
|
|
|
|
|
self.assertEqual(rec2.tag_ids, tags)
|
|
|
|
|
|
|
|
|
|
# empty N tags in rec2: O(1) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'tag_ids': [Command.clear()]})
|
|
|
|
|
self.assertFalse(rec2.tag_ids)
|
|
|
|
|
self.assertTrue(tags.exists())
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(2):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'tag_ids': [Command.clear()]})
|
|
|
|
|
self.assertFalse(rec2.tag_ids)
|
|
|
|
|
|
|
|
|
|
# set N tags in rec2: O(1) queries
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'tag_ids': [Command.set(tags.ids)]})
|
|
|
|
|
self.assertEqual(rec2.tag_ids, tags)
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'tag_ids': [Command.set(tags[:8].ids)]})
|
|
|
|
|
self.assertEqual(rec2.tag_ids, tags[:8])
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(4):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'tag_ids': [Command.set(tags[4:].ids)]})
|
|
|
|
|
self.assertEqual(rec2.tag_ids, tags[4:])
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(3):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'tag_ids': [Command.set(tags.ids)]})
|
|
|
|
|
self.assertEqual(rec2.tag_ids, tags)
|
|
|
|
|
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
with self.assertQueryCount(2):
|
|
|
|
|
rec1.invalidate_cache()
|
|
|
|
|
rec2.write({'tag_ids': [Command.set(tags.ids)]})
|
|
|
|
|
self.assertEqual(rec2.tag_ids, tags)
|
|
|
|
|
|
|
|
|
@@ -412,12 +414,12 @@ class TestPerformance(SavepointCaseWithUserDemo):
|
|
|
|
|
with self.assertQueryCount(__system__=2, demo=2):
|
|
|
|
|
records.mapped('value')
|
|
|
|
|
|
|
|
|
|
records.invalidate_cache(['value'])
|
|
|
|
|
with self.assertQueryCount(__system__=2, demo=2):
|
|
|
|
|
records.invalidate_cache(['value'])
|
|
|
|
|
records.mapped('value')
|
|
|
|
|
|
|
|
|
|
records.invalidate_cache(['value'])
|
|
|
|
|
with self.assertQueryCount(__system__=2, demo=2):
|
|
|
|
|
records.invalidate_cache(['value'])
|
|
|
|
|
new_recs = records.browse(records.new(origin=record).id for record in records)
|
|
|
|
|
new_recs.mapped('value')
|
|
|
|
|
|
|
|
|
|