Skip to content

Commit 628945a

Browse files
committed
refactor: TT-245 Refactor function find all inside cosmosdb Repository
1 parent 58dbc15 commit 628945a

File tree

2 files changed

+59
-40
lines changed

2 files changed

+59
-40
lines changed

commons/data_access_layer/cosmos_db.py

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import dataclasses
22
import logging
3-
from typing import Callable, List
3+
from typing import Callable
44

55
import azure.cosmos.cosmos_client as cosmos_client
66
import azure.cosmos.exceptions as exceptions
7-
import flask
87
from azure.cosmos import ContainerProxy, PartitionKey
98
from flask import Flask
109
from werkzeug.exceptions import HTTPException
1110

1211
from commons.data_access_layer.database import CRUDDao, EventContext
12+
from utils.query_builder import CosmosDBQueryBuilder
1313

1414

1515
class CosmosDBFacade:
@@ -257,53 +257,38 @@ def find_all(
257257
mapper: Callable = None,
258258
):
259259
conditions = conditions if conditions else {}
260-
partition_key_value = self.find_partition_key_value(event_context)
261-
max_count = self.get_page_size_or(max_count)
262-
params = [
263-
{"name": "@partition_key_value", "value": partition_key_value},
264-
{"name": "@offset", "value": offset},
265-
{"name": "@max_count", "value": max_count},
266-
]
267-
268-
status_value = None
269-
if conditions.get('status') != None:
270-
status_value = conditions.get('status')
260+
max_count: int = self.get_page_size_or(max_count)
261+
262+
status_value = conditions.get('status')
263+
if status_value:
271264
conditions.pop('status')
272265

273266
date_range = date_range if date_range else {}
274-
date_range_params = (
275-
self.generate_params(date_range) if date_range else []
276-
)
277-
params.extend(self.generate_params(conditions))
278-
params.extend(date_range_params)
279-
280-
query_str = """
281-
SELECT * FROM c
282-
WHERE c.{partition_key_attribute}=@partition_key_value
283-
{conditions_clause}
284-
{active_condition}
285-
{date_range_sql_condition}
286-
{visibility_condition}
287-
{order_clause}
288-
OFFSET @offset LIMIT @max_count
289-
""".format(
290-
partition_key_attribute=self.partition_key_attribute,
291-
visibility_condition=self.create_sql_condition_for_visibility(
292-
visible_only
293-
),
294-
active_condition=self.create_sql_active_condition(status_value),
295-
conditions_clause=self.create_sql_where_conditions(conditions),
296-
date_range_sql_condition=self.create_sql_date_range_filter(
297-
date_range
298-
),
299-
order_clause=self.create_sql_order_clause(),
267+
268+
query_builder = (
269+
CosmosDBQueryBuilder()
270+
.add_sql_where_equal_condition(conditions)
271+
.add_sql_active_condition(status_value)
272+
.add_sql_date_range_filter(date_range)
273+
.add_sql_visibility_condition(visible_only)
274+
.add_sql_limit_condition(max_count)
275+
.add_sql_offset_condition(offset)
276+
.build()
300277
)
301278

279+
if len(self.order_fields) > 1:
280+
attribute = self.order_fields[0]
281+
order = self.order_fields[1]
282+
query_builder.add_sql_order_by_condition(attribute, order)
283+
284+
query_str = query_builder.get_query()
285+
params = query_builder.get_parameters()
286+
partition_key_value = self.find_partition_key_value(event_context)
287+
302288
result = self.container.query_items(
303289
query=query_str,
304290
parameters=params,
305291
partition_key=partition_key_value,
306-
max_item_count=max_count,
307292
)
308293

309294
function_mapper = self.get_mapper_or_dict(mapper)

utils/query_builder.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,40 @@ def add_sql_in_condition(
3434
self.where_conditions.append(f"c.{attribute} IN {ids_values}")
3535
return self
3636

37+
def add_sql_active_condition(self, status_value: str):
38+
if status_value:
39+
not_defined_condition = ''
40+
condition_operand = ''
41+
if status_value == 'active':
42+
not_defined_condition = 'NOT IS_DEFINED(c.status)'
43+
condition_operand = ' OR '
44+
45+
defined_condition = (
46+
f"(IS_DEFINED(c.status) AND c.status = '{status_value}')"
47+
)
48+
condition = (
49+
not_defined_condition + condition_operand + defined_condition
50+
)
51+
self.where_conditions.append(condition)
52+
return self
53+
54+
def add_sql_date_range_filter(self, date_range: dict):
55+
start_date = date_range.get('start_date')
56+
end_date = date_range.get('end_date')
57+
if start_date and end_date:
58+
condition = """
59+
((c.start_date BETWEEN @start_date AND @end_date) OR
60+
(c.end_date BETWEEN @start_date AND @end_date))
61+
"""
62+
self.where_conditions.append(condition)
63+
self.parameters.extend(
64+
[
65+
{'name': '@start_date', 'value': start_date},
66+
{'name': '@end_date', 'value': end_date},
67+
]
68+
)
69+
return self
70+
3771
def add_sql_where_equal_condition(self, data: dict = None):
3872
if data:
3973
for k, v in data.items():

0 commit comments

Comments
 (0)