Skip to content

Commit 0225544

Browse files
fix: TT-225 Add build query with not in (#281)
* fix: TT-225 Add build query with not in and add id_running_entry in params * fix: TT-225 Add test_add_sql_not_in_condition test and remove build_with_order_by method
1 parent 3cea4e7 commit 0225544

File tree

5 files changed

+44
-10
lines changed

5 files changed

+44
-10
lines changed

tests/time_tracker_api/time_entries/time_entries_model_test.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ def test_get_last_entry(
334334
time_entry_repository.container = Mock()
335335
time_entry_repository.container.query_items = query_items_mock
336336

337-
time_entry = time_entry_repository.get_last_entry('id1', event_context)
337+
time_entry = time_entry_repository.get_last_entry('id1', ['id1'], event_context)
338338

339339
find_partition_key_value_mock.assert_called_once()
340340
assert isinstance(time_entry, TimeEntryCosmosDBModel)
@@ -356,6 +356,7 @@ def test_get_last_entry(
356356
running_item = {
357357
'id': 'id',
358358
'owner_id': '1',
359+
'id_running_entry': '1',
359360
'update_last_entry_if_overlap': True,
360361
'start_date': '2021-03-22T10:30:00.000Z',
361362
'end_date': '2021-03-22T11:30:00.000Z',
@@ -400,6 +401,7 @@ def test_update_last_entry(
400401
time_entry_repository.update_last_entry(
401402
running_item.get('owner_id'),
402403
running_item.get('start_date'),
404+
running_item.get('id_running_entry'),
403405
event_context,
404406
)
405407

tests/utils/query_builder_test.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,3 +302,30 @@ def test__build_order_by(
302302
orderBy_condition = query_builder._CosmosDBQueryBuilder__build_order_by()
303303

304304
assert orderBy_condition == expected_order_by_condition
305+
306+
@pytest.mark.parametrize(
307+
"attribute,ids_list,expected_not_in_list",
308+
[
309+
("id", [], []),
310+
(None, None, []),
311+
("id", None, []),
312+
(None, ["id"], []),
313+
("id", ["id"], ["c.id NOT IN ('id')"]),
314+
("id", ["id1", "id2"], ["c.id NOT IN ('id1', 'id2')"]),
315+
("owner_id", ["id1", "id2"], ["c.owner_id NOT IN ('id1', 'id2')"]),
316+
("customer_id", ["id1", "id2"], [
317+
"c.customer_id NOT IN ('id1', 'id2')"]),
318+
],
319+
)
320+
def test_add_sql_not_in_condition(
321+
attribute,
322+
ids_list,
323+
expected_not_in_list,
324+
):
325+
query_builder = CosmosDBQueryBuilder().add_sql_not_in_condition(
326+
attribute, ids_list
327+
)
328+
assert len(query_builder.where_conditions) == len(
329+
expected_not_in_list
330+
)
331+
assert query_builder.where_conditions == expected_not_in_list

time_tracker_api/time_entries/time_entries_dao.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def update(self, id, data: dict, description=None):
230230

231231
if data.get('update_last_entry_if_overlap', None):
232232
self.repository.update_last_entry(
233-
data.get('owner_id'), data.get('start_date'), event_ctx
233+
data.get('owner_id'), data.get('start_date'), data.get('id'), event_ctx
234234
)
235235

236236
return self.repository.partial_update(

time_tracker_api/time_entries/time_entries_repository.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ def find_all_v2(
238238
def get_last_entry(
239239
self,
240240
owner_id: str,
241+
id_running_entry: str,
241242
event_context: EventContext,
242243
visible_only=True,
243244
mapper: Callable = None,
@@ -246,29 +247,26 @@ def get_last_entry(
246247
CosmosDBQueryBuilder()
247248
.add_sql_where_equal_condition({'owner_id': owner_id})
248249
.add_sql_order_by_condition('end_date', Order.DESC)
249-
.add_sql_limit_condition(1)
250-
.add_sql_offset_condition(1)
250+
.add_sql_not_in_condition('id', [id_running_entry])
251251
.build()
252252
)
253-
254253
query_str = query_builder.get_query()
255254
params = query_builder.get_parameters()
256-
257255
partition_key_value = self.find_partition_key_value(event_context)
258256
result = self.container.query_items(
259257
query=query_str,
260258
parameters=params,
261259
partition_key=partition_key_value,
262260
)
263-
264261
function_mapper = self.get_mapper_or_dict(mapper)
265262
return function_mapper(next(result))
266263

264+
267265
def update_last_entry(
268-
self, owner_id: str, start_date: str, event_context: EventContext
266+
self, owner_id: str, start_date: str, id_running_entry: str, event_context: EventContext
269267
):
270-
last_entry = self.get_last_entry(owner_id, event_context)
271-
268+
last_entry = self.get_last_entry(
269+
owner_id, id_running_entry, event_context)
272270
end_date = str_to_datetime(last_entry.end_date)
273271
_start_date = str_to_datetime(start_date)
274272

utils/query_builder.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ def add_sql_order_by_condition(self, attribute: str, order: Order):
6161
self.order_by = (attribute, order.name)
6262
return self
6363

64+
65+
def add_sql_not_in_condition(self, attribute: str = None, ids_list: List[str] = None):
66+
if ids_list and attribute and len(ids_list) > 0:
67+
ids_values = convert_list_to_tuple_string(ids_list)
68+
self.where_conditions.append(f"c.{attribute} NOT IN {ids_values}")
69+
return self
70+
6471
def __build_select(self):
6572
if len(self.select_conditions) < 1:
6673
self.select_conditions.append("*")

0 commit comments

Comments
 (0)