Skip to content

Commit 91d6507

Browse files
fix: TT-220 remove custom sql conditions from find all (#292)
* fix: TT-220 refactoring for projects * fix: TT-238 activities find_all refactoring * fix: TT-220 Correction in get_all function for projects_model * fix: TT-220 Remove custom_sql_params from methods and replace for new arguments and function calls * fix: TT-220 apply refactoring on some code * fix: TT-220 Bugs corrections * fix: TT-220 Removes order conditions from activities * fix: TT-220 make adjustments in projects query for time-entries * fix: TT-220 adjustments according sonar suggestions * fix: TT-220 adjustments according sonar suggestions in activities * fix: TT-220 adjustments according sonar code analysis * fix: TT-220 adjustments according reviewers suggestions Co-authored-by: Pablo <Solorzano> Co-authored-by: Kevin Lopez <[email protected]>
1 parent f988a8e commit 91d6507

File tree

12 files changed

+192
-218
lines changed

12 files changed

+192
-218
lines changed

commons/data_access_layer/cosmos_db.py

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -173,17 +173,6 @@ def create_sql_where_conditions(
173173
else:
174174
return ""
175175

176-
@staticmethod
177-
def create_custom_sql_conditions(custom_sql_conditions: List[str]) -> str:
178-
if len(custom_sql_conditions) > 0:
179-
return "AND {custom_sql_conditions_clause}".format(
180-
custom_sql_conditions_clause=" AND ".join(
181-
custom_sql_conditions
182-
)
183-
)
184-
else:
185-
return ''
186-
187176
@staticmethod
188177
def generate_params(conditions: dict) -> list:
189178
result = []
@@ -217,6 +206,16 @@ def attach_context(data: dict, event_context: EventContext):
217206
"session_id": event_context.session_id,
218207
}
219208

209+
@staticmethod
210+
def create_sql_date_range_filter(date_range: dict) -> str:
211+
if 'start_date' in date_range and 'end_date' in date_range:
212+
return """
213+
AND ((c.start_date BETWEEN @start_date AND @end_date) OR
214+
(c.end_date BETWEEN @start_date AND @end_date))
215+
"""
216+
else:
217+
return ''
218+
220219
def create(
221220
self, data: dict, event_context: EventContext, mapper: Callable = None
222221
):
@@ -251,19 +250,13 @@ def find_all(
251250
self,
252251
event_context: EventContext,
253252
conditions: dict = None,
254-
custom_sql_conditions: List[str] = None,
255-
custom_params: dict = None,
253+
date_range: dict = None,
254+
visible_only=True,
256255
max_count=None,
257256
offset=0,
258-
visible_only=True,
259257
mapper: Callable = None,
260258
):
261259
conditions = conditions if conditions else {}
262-
custom_sql_conditions = (
263-
custom_sql_conditions if custom_sql_conditions else []
264-
)
265-
custom_params = custom_params if custom_params else {}
266-
267260
partition_key_value = self.find_partition_key_value(event_context)
268261
max_count = self.get_page_size_or(max_count)
269262
params = [
@@ -277,15 +270,20 @@ def find_all(
277270
status_value = conditions.get('status')
278271
conditions.pop('status')
279272

273+
date_range = date_range if date_range else {}
274+
date_range_params = (
275+
self.generate_params(date_range) if date_range else []
276+
)
280277
params.extend(self.generate_params(conditions))
281-
params.extend(custom_params)
278+
params.extend(date_range_params)
279+
282280
query_str = """
283281
SELECT * FROM c
284282
WHERE c.{partition_key_attribute}=@partition_key_value
285283
{conditions_clause}
286-
{visibility_condition}
287284
{active_condition}
288-
{custom_sql_conditions_clause}
285+
{date_range_sql_condition}
286+
{visibility_condition}
289287
{order_clause}
290288
OFFSET @offset LIMIT @max_count
291289
""".format(
@@ -295,11 +293,12 @@ def find_all(
295293
),
296294
active_condition=self.create_sql_active_condition(status_value),
297295
conditions_clause=self.create_sql_where_conditions(conditions),
298-
custom_sql_conditions_clause=self.create_custom_sql_conditions(
299-
custom_sql_conditions
296+
date_range_sql_condition=self.create_sql_date_range_filter(
297+
date_range
300298
),
301299
order_clause=self.create_sql_order_clause(),
302300
)
301+
303302
result = self.container.query_items(
304303
query=query_str,
305304
parameters=params,

tests/time_tracker_api/activities/activities_namespace_test.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,13 @@ def test_list_all_active(
7171
json_data = json.loads(response.data)
7272
assert [] == json_data
7373

74-
repository_find_all_mock.assert_called_once_with(ANY, conditions={})
74+
repository_find_all_mock.assert_called_once_with(
75+
event_context=ANY,
76+
activities_id=ANY,
77+
conditions={},
78+
visible_only=ANY,
79+
max_count=ANY,
80+
)
7581

7682

7783
def test_list_all_active_activities(
@@ -94,7 +100,11 @@ def test_list_all_active_activities(
94100
assert [] == json_data
95101

96102
repository_find_all_mock.assert_called_once_with(
97-
ANY, conditions={'status': 'active'}
103+
event_context=ANY,
104+
conditions={'status': 'active'},
105+
activities_id=ANY,
106+
visible_only=ANY,
107+
max_count=ANY,
98108
)
99109

100110

tests/time_tracker_api/projects/projects_model_test.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
@patch(
1212
'time_tracker_api.projects.projects_model.ProjectCosmosDBRepository.find_partition_key_value'
1313
)
14-
def test_find_all_v2(
14+
def test_find_all_projects_new_version(
1515
find_partition_key_value_mock,
1616
event_context: EventContext,
1717
project_repository: ProjectCosmosDBRepository,
@@ -28,13 +28,14 @@ def test_find_all_v2(
2828
project_repository.container = Mock()
2929
project_repository.container.query_items = query_items_mock
3030

31-
result = project_repository.find_all_v2(
32-
event_context,
33-
['id'],
34-
['customer_id']
31+
result = project_repository.find_all(
32+
event_context=event_context,
33+
conditions={"customer_id": "1"},
34+
project_ids=['id'],
35+
customer_ids=['customer_id'],
3536
)
3637
find_partition_key_value_mock.assert_called_once()
3738
assert len(result) == 1
3839
project = result[0]
3940
assert isinstance(project, ProjectCosmosDBModel)
40-
assert project.__dict__ == expected_item
41+
assert project.__dict__ == expected_item

tests/time_tracker_api/time_entries/time_entries_model_test.py

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -278,23 +278,11 @@ def test_updated_item_without_deleted_key_should_call_validate_data(
278278
@patch(
279279
'commons.data_access_layer.cosmos_db.CosmosDBRepository.generate_params'
280280
)
281-
@patch(
282-
'commons.data_access_layer.cosmos_db.CosmosDBRepository.create_sql_condition_for_visibility'
283-
)
284-
@patch(
285-
'commons.data_access_layer.cosmos_db.CosmosDBRepository.create_sql_where_conditions'
286-
)
287-
@patch(
288-
'commons.data_access_layer.cosmos_db.CosmosDBRepository.create_custom_sql_conditions'
289-
)
290281
@patch(
291282
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.add_complementary_info'
292283
)
293-
def test_find_all_v2(
284+
def test_find_all_time_entries_new_version(
294285
add_complementary_info_mock,
295-
create_custom_sql_conditions_mock,
296-
create_sql_where_conditions_mock,
297-
create_sql_condition_for_visibility_mock,
298286
generate_params_mock,
299287
get_page_size_or_mock,
300288
find_partition_key_value_mock,
@@ -319,25 +307,20 @@ def test_find_all_v2(
319307

320308
result = time_entry_repository.find_all(
321309
conditions={"user_id": "*"},
322-
custom_sql_conditions=[],
323310
event_context=event_context,
324311
date_range={
325312
'start_date': "2021-03-22T10:00:00.000Z",
326313
'end_date': "2021-03-22T11:00:00.000Z",
327314
},
328-
custom_params={},
329315
)
330316

331317
find_partition_key_value_mock.assert_called_once()
332318
get_page_size_or_mock.assert_called_once()
319+
333320
assert len(result) == 1
334321
time_entry = result[0]
335322
assert time_entry == expected_item
336323

337-
create_sql_condition_for_visibility_mock.assert_called_once()
338-
create_sql_where_conditions_mock.assert_called_once()
339-
create_custom_sql_conditions_mock.assert_called_once()
340-
341324

342325
@patch(
343326
'time_tracker_api.time_entries.time_entries_repository.TimeEntryCosmosDBRepository.find_partition_key_value'

tests/time_tracker_api/time_entries/time_entries_namespace_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ def test_get_time_entry_should_succeed_with_valid_id(
197197
Mock(),
198198
)
199199
@patch(
200-
'time_tracker_api.time_entries.time_entries_dao.TimeEntriesCosmosDBDao.build_custom_query',
200+
'time_tracker_api.time_entries.time_entries_dao.TimeEntriesCosmosDBDao.get_owner_ids',
201201
Mock(),
202202
)
203203
@patch(
@@ -278,7 +278,7 @@ def test_get_time_entries_by_type_of_user_when_is_user_tester(
278278
Mock(),
279279
)
280280
@patch(
281-
'time_tracker_api.time_entries.time_entries_dao.TimeEntriesCosmosDBDao.build_custom_query',
281+
'time_tracker_api.time_entries.time_entries_dao.TimeEntriesCosmosDBDao.get_owner_ids',
282282
Mock(),
283283
)
284284
@patch(

tests/utils/query_builder_test.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,7 @@ def test__build_order_by(
303303

304304
assert orderBy_condition == expected_order_by_condition
305305

306+
306307
@pytest.mark.parametrize(
307308
"attribute,ids_list,expected_not_in_list",
308309
[
@@ -313,8 +314,11 @@ def test__build_order_by(
313314
("id", ["id"], ["c.id NOT IN ('id')"]),
314315
("id", ["id1", "id2"], ["c.id NOT IN ('id1', 'id2')"]),
315316
("owner_id", ["id1", "id2"], ["c.owner_id NOT IN ('id1', 'id2')"]),
316-
("customer_id", ["id1", "id2"], [
317-
"c.customer_id NOT IN ('id1', 'id2')"]),
317+
(
318+
"customer_id",
319+
["id1", "id2"],
320+
["c.customer_id NOT IN ('id1', 'id2')"],
321+
),
318322
],
319323
)
320324
def test_add_sql_not_in_condition(
@@ -325,7 +329,5 @@ def test_add_sql_not_in_condition(
325329
query_builder = CosmosDBQueryBuilder().add_sql_not_in_condition(
326330
attribute, ids_list
327331
)
328-
assert len(query_builder.where_conditions) == len(
329-
expected_not_in_list
330-
)
331-
assert query_builder.where_conditions == expected_not_in_list
332+
assert len(query_builder.where_conditions) == len(expected_not_in_list)
333+
assert query_builder.where_conditions == expected_not_in_list

time_tracker_api/activities/activities_model.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
convert_list_to_tuple_string,
1515
create_sql_in_condition,
1616
)
17+
from utils.query_builder import CosmosDBQueryBuilder, Order
1718

1819

1920
class ActivityDao(CRUDDao):
@@ -85,6 +86,38 @@ def find_all_with_id_in_list(
8586
function_mapper = self.get_mapper_or_dict(mapper)
8687
return list(map(function_mapper, result))
8788

89+
def find_all(
90+
self,
91+
event_context: EventContext,
92+
conditions: dict = None,
93+
activities_id: List = None,
94+
visible_only=True,
95+
max_count=None,
96+
offset=0,
97+
mapper: Callable = None,
98+
):
99+
query_builder = (
100+
CosmosDBQueryBuilder()
101+
.add_sql_in_condition('id', activities_id)
102+
.add_sql_where_equal_condition(conditions)
103+
.add_sql_visibility_condition(visible_only)
104+
.add_sql_limit_condition(max_count)
105+
.add_sql_offset_condition(offset)
106+
.build()
107+
)
108+
109+
query_str = query_builder.get_query()
110+
tenant_id_value = self.find_partition_key_value(event_context)
111+
params = query_builder.get_parameters()
112+
113+
result = self.container.query_items(
114+
query=query_str,
115+
parameters=params,
116+
partition_key=tenant_id_value,
117+
)
118+
function_mapper = self.get_mapper_or_dict(mapper)
119+
return list(map(function_mapper, result))
120+
88121

89122
class ActivityCosmosDBDao(APICosmosDBDao, ActivityDao):
90123
def __init__(self, repository):
@@ -100,6 +133,25 @@ def get_all_with_id_in_list(
100133
activity_ids,
101134
)
102135

136+
def get_all(
137+
self,
138+
conditions: dict = None,
139+
activities_id: List = None,
140+
max_count=None,
141+
visible_only=True,
142+
) -> list:
143+
event_ctx = self.create_event_context("read-many")
144+
max_count = self.repository.get_page_size_or(max_count)
145+
146+
activities = self.repository.find_all(
147+
event_context=event_ctx,
148+
conditions=conditions,
149+
activities_id=activities_id,
150+
visible_only=visible_only,
151+
max_count=max_count,
152+
)
153+
return activities
154+
103155

104156
def create_dao() -> ActivityDao:
105157
repository = ActivityCosmosDBRepository()

0 commit comments

Comments
 (0)