11import platform
22from operator import attrgetter , itemgetter
33from pathlib import Path
4- from random import randint , sample
54
65import jinja2
76from aiohttp .web import Response
87from sqlalchemy import bindparam , select
98from sqlalchemy .orm .attributes import flag_modified
109
1110from .models import Fortune , World
11+ from .random_utils import random_id , random_unique_ids
1212
1313if platform .python_implementation () == "PyPy" :
1414 from aiohttp .web import json_response
@@ -23,6 +23,7 @@ def json_response(payload):
2323
2424ADDITIONAL_FORTUNE_ORM = Fortune (id = 0 , message = 'Additional fortune added at request time.' )
2525ADDITIONAL_FORTUNE_ROW = {'id' : 0 , 'message' : 'Additional fortune added at request time.' }
26+ JSON_MESSAGE = {'message' : 'Hello, World!' }
2627READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1'
2728READ_SELECT_ORM = select (World .randomnumber ).where (World .id == bindparam ("id" ))
2829READ_FORTUNES_ORM = select (Fortune .id , Fortune .message )
@@ -34,6 +35,7 @@ def json_response(payload):
3435sort_fortunes_orm = attrgetter ('message' )
3536sort_fortunes_raw = itemgetter ('message' )
3637
38+ db_query_id_params = [(i ,) for i in range (0 , 10002 )]
3739
3840def get_num_queries (request ):
3941 try :
@@ -51,14 +53,14 @@ async def json(request):
5153 """
5254 Test 1
5355 """
54- return json_response ({ 'message' : 'Hello, World!' } )
56+ return json_response (JSON_MESSAGE )
5557
5658
5759async def single_database_query_orm (request ):
5860 """
5961 Test 2 ORM
6062 """
61- id_ = randint ( 1 , 10000 )
63+ id_ = random_id ( )
6264 async with request .app ['db_session' ]() as sess :
6365 num = await sess .scalar (READ_SELECT_ORM , {"id" : id_ })
6466 return json_response ({'id' : id_ , 'randomNumber' : num })
@@ -68,7 +70,7 @@ async def single_database_query_raw(request):
6870 """
6971 Test 2 RAW
7072 """
71- id_ = randint ( 1 , 10000 )
73+ id_ = random_id ( )
7274
7375 async with request .app ['pg' ].acquire () as conn :
7476 r = await conn .fetchval (READ_ROW_SQL , id_ )
@@ -81,7 +83,7 @@ async def multiple_database_queries_orm(request):
8183 """
8284 num_queries = get_num_queries (request )
8385
84- ids = [ randint ( 1 , 10000 ) for _ in range ( num_queries )]
86+ ids = random_unique_ids ( num_queries )
8587
8688 result = []
8789 async with request .app ['db_session' ]() as sess :
@@ -96,12 +98,13 @@ async def multiple_database_queries_raw(request):
9698 Test 3 RAW
9799 """
98100 num_queries = get_num_queries (request )
99-
100- ids = [( randint ( 1 , 10000 ), ) for _ in range ( num_queries ) ]
101+ ids = random_unique_ids ( num_queries )
102+ id_params = [db_query_id_params [ id_ ] for id_ in ids ]
101103
102104 async with request .app ['pg' ].acquire () as conn :
103- rows = await conn .fetchmany (READ_ROW_SQL , ids )
104- result = [{'id' : id_ [0 ], 'randomNumber' : row [0 ]} for id_ , row in zip (ids , rows )]
105+ rows = await conn .fetchmany (READ_ROW_SQL , id_params )
106+
107+ result = [{'id' : id_ , 'randomNumber' : row [0 ]} for id_ , row in zip (ids , rows )]
105108 return json_response (result )
106109
107110
@@ -135,9 +138,10 @@ async def updates(request):
135138 Test 5 ORM
136139 """
137140 num_queries = get_num_queries (request )
138- update_ids = sample ( range ( 1 , 10001 ), num_queries )
141+ update_ids = random_unique_ids ( num_queries )
139142 update_ids .sort ()
140- updates = tuple (zip (update_ids , sample (range (1 , 10001 ), num_queries )))
143+
144+ updates = [* zip (update_ids , random_unique_ids (num_queries ))]
141145 worlds = [{'id' : row_id , 'randomNumber' : number } for row_id , number in updates ]
142146
143147 async with request .app ['db_session' ].begin () as sess :
@@ -154,13 +158,14 @@ async def updates_raw(request):
154158 Test 5 RAW
155159 """
156160 num_queries = get_num_queries (request )
157- update_ids = sample ( range ( 1 , 10001 ), num_queries )
161+ update_ids = random_unique_ids ( num_queries )
158162 update_ids .sort ()
159163
160- numbers = sample (range (1 , 10001 ), num_queries )
161- fetch_params = [(i ,) for i in update_ids ]
164+ numbers = random_unique_ids (num_queries )
162165 row_updates = [* zip (update_ids , numbers )]
163166
167+ fetch_params = [db_query_id_params [i ] for i in update_ids ]
168+
164169 async with request .app ['pg' ].acquire () as conn :
165170 # the result of this is the int previous random number which we don't actually use
166171 await conn .executemany (READ_ROW_SQL , fetch_params )
0 commit comments