Skip to content

Commit 22821ac

Browse files
committed
perf model + regex name_get
1 parent 3fe6838 commit 22821ac

File tree

5 files changed

+132
-2
lines changed

5 files changed

+132
-2
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
!exists_smarty.py
1919
!modified_trigger_perf.py
2020
!new_domain_object.py
21+
!regex_name_get.py
2122
!__init__.py
2223

2324
!psql_exists_in_join/*.py
@@ -29,6 +30,6 @@
2930
!new_read_group/*.txt
3031
!expression_tests.sql
3132
!aggregate_perf.py
32-
!expression_performance/**
33+
!expression_performance/**/*.py
3334

3435
!read_group_replacement.py
Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,79 @@
1-
from odoo import api, fields, models, tools, SUPERUSER_ID, _
1+
import itertools
2+
from random import Random
3+
4+
from odoo import fields, models
5+
from odoo.tools import split_every
6+
7+
8+
BATCH_SIZE_CREATION = 50_000
9+
10+
class BaseModelExtention(models.AbstractModel):
11+
_inherit = 'base'
12+
13+
def _custom_populate(self, nb_to_create):
14+
rng = Random(f'{self._name} {nb_to_create}')
15+
generator = self._custom_populate_factories(rng)
16+
generator = itertools.islice(self._custom_populate_factories(rng), nb_to_create)
17+
generator = split_every(BATCH_SIZE_CREATION, generator)
18+
19+
for i, pieces in enumerate(generator):
20+
print(f"Insert {i * BATCH_SIZE_CREATION}/{nb_to_create} {self._name}")
21+
self.create(pieces)
22+
self.env.cr.commit()
23+
24+
return super()._populate_factories()
25+
26+
class PerfAbstract(models.AbstractModel):
27+
28+
_name = _description = 'perf.abstract'
29+
30+
unique_name = fields.Char('Unique name')
31+
uniform_1000 = fields.Integer('Uniform 1000') # [0, 1000]
32+
float_uniform_1000 = fields.Float('Uniform 1000 Float') # [0.0, 1000.0]
33+
34+
def _create_indexes(self):
35+
pass
36+
37+
def _custom_populate_factories(self, rng: Random):
38+
for i in itertools.count():
39+
yield {
40+
'unique_name': f'{self._name}/{i}',
41+
'uniform_1000': rng.randint(0, 1000),
42+
'float_uniform_1000': rng.random() * 1000,
43+
}
44+
45+
class PerfParent(models.Model):
46+
_name = _description = 'perf.parent'
47+
_inherit = 'perf.abstract'
48+
49+
child_ids = fields.One2many('perf.child', 'uniform_parent_id')
50+
main_tag_id = fields.Many2one('perf.tag')
51+
52+
53+
54+
class PerfChild(models.Model):
55+
_name = _description = 'perf.child'
56+
_inherit = 'perf.abstract'
57+
58+
uniform_parent_id = fields.Many2one('perf.parent', 'Parent')
59+
tag_ids = fields.Many2many('perf.tag')
60+
61+
def _custom_populate_factories(self, rng: Random):
62+
ids_parent = self.env['perf.parent'].search([])._ids
63+
generator_ab = super()._custom_populate_factories(rng)
64+
for __ in itertools.count():
65+
yield next(generator_ab) | {
66+
'uniform_parent_id': rng.choice(ids_parent),
67+
}
68+
69+
70+
71+
class PerfTag(models.Model):
72+
_name = _description = 'perf.tag'
73+
_inherit = 'perf.abstract'
74+
75+
76+
77+
278

379

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from . import test_sql
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import threading
2+
3+
import odoo
4+
from odoo import api
5+
from odoo.tests.common import BaseCase
6+
7+
def get_db_name():
8+
db = odoo.tools.config['db_name']
9+
# If the database name is not provided on the command-line,
10+
# use the one on the thread (which means if it is provided on
11+
# the command-line, this will break when installing another
12+
# database from XML-RPC).
13+
if not db and hasattr(threading.current_thread(), 'dbname'):
14+
return threading.current_thread().dbname
15+
return db
16+
17+
18+
class TestPerformanceSQL(BaseCase):
19+
20+
@classmethod
21+
def setUpClass(cls):
22+
super().setUpClass()
23+
24+
cls.registry = odoo.registry(get_db_name())
25+
cls.addClassCleanup(cls.registry.reset_changes)
26+
cls.addClassCleanup(cls.registry.clear_caches)
27+
28+
cls.cr = cls.registry.cursor()
29+
cls.addClassCleanup(cls.cr.close)
30+
31+
cls.env = api.Environment(cls.cr, odoo.SUPERUSER_ID, {})
32+
33+
def test_populate(self):
34+
models = {
35+
'perf.tag': 0,
36+
'perf.parent': 1000,
37+
'perf.child': 500000,
38+
}
39+
for model, nb in models.items():
40+
self.env[model]._custom_populate(nb)

regex_name_get.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
3+
4+
# [(batch.id, f'{batch.name} ({state_values.get(batch.state)})') for batch in self]
5+
6+
for batch in self:
7+
batch.display_name = f'{batch.name} ({state_values.get(batch.state)})'
8+
9+
list_comprehension = r"( +)(?:return)?[\s\n]*\[[\s\n]*\([\s\n]*.+,[\s\n]*(.+)[\s\n]*\)[\s\n]*for[\s\n]*(\w+)[\s\n]*in[\s\n]*self\]"
10+
list_comprehension_into = r"""$1for $3 in self:
11+
\n$1 $3.display_name = $2"
12+
"""

0 commit comments

Comments
 (0)