Skip to content

Commit b931fb0

Browse files
committed
optimized filters
1 parent 3a1f27c commit b931fb0

File tree

2 files changed

+59
-76
lines changed

2 files changed

+59
-76
lines changed

Diff for: functions/categories/libs/queries.py

+20-27
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,34 @@
11
import os
22
from google.cloud import firestore
3-
from google.cloud.firestore_v1.base_query import FieldFilter
3+
from google.cloud.firestore_v1.base_query import FieldFilter, Or
44
from .result import Result
55
from .utils import convert_to_array
66

7-
DB = firestore.Client(project=os.environ.get('PROJECT'), database=os.environ.get('DATABASE'))
8-
TABLE = 'categories'
7+
DB = firestore.Client(
8+
project=os.environ.get("PROJECT"), database=os.environ.get("DATABASE")
9+
)
910

1011
def list_data(params):
11-
ref = DB.collection(TABLE)
12+
ref = DB.collection("categories")
1213

13-
query = ref.order_by('category', direction=firestore.Query.ASCENDING)
14+
query = ref.order_by("category", "asc")
1415

15-
data = []
16+
if "category" in params:
17+
category_array = convert_to_array(params["category"])
18+
filter_array = []
19+
for category in category_array:
20+
filter_array.append(FieldFilter("category", "==", category))
21+
query = query.where(filter=Or(filters=filter_array))
1622

17-
if 'onlyname' in params:
1823
documents = query.stream()
19-
20-
for doc in documents:
21-
item = doc.to_dict()
22-
if 'category' in item:
23-
data.append(item['category'])
24-
25-
else:
26-
27-
if 'category' in params:
28-
category_array = convert_to_array(params['category'])
29-
30-
for category in category_array:
31-
results = query.where(filter=FieldFilter("category", "==", category)).stream()
32-
for doc in results:
33-
data.append(doc.to_dict())
24+
data = []
25+
26+
if "onlyname" in params:
27+
for doc in documents:
28+
data.append(doc.get("category"))
3429

3530
else:
36-
documents = query.stream()
37-
38-
for doc in documents:
39-
data.append(doc.to_dict())
31+
for doc in documents:
32+
data.append(doc.to_dict())
4033

41-
return Result(result=data)
34+
return Result(result=data)

Diff for: functions/technologies/libs/queries.py

+39-49
Original file line numberDiff line numberDiff line change
@@ -7,54 +7,44 @@
77
from .utils import convert_to_array
88
from .presenters import Presenters
99

10-
DB = firestore.Client(project=os.environ.get('PROJECT'), database=os.environ.get('DATABASE'))
10+
DB = firestore.Client(
11+
project=os.environ.get("PROJECT"), database=os.environ.get("DATABASE")
12+
)
1113

1214
def list_data(params):
13-
onlyname = False
14-
ref = DB.collection('technologies')
15-
16-
query = ref
17-
18-
if 'technology' in params:
19-
arfilters = []
20-
params_array = convert_to_array(params['technology'])
21-
for tech in params_array:
22-
arfilters.append(FieldFilter('technology', '==', tech))
23-
24-
or_filter = Or(filters=arfilters)
25-
26-
query = query.where(filter=or_filter)
27-
28-
if 'category' in params:
29-
params_array = convert_to_array(params['category'])
30-
query = query.where(filter=FieldFilter('category_obj', 'array_contains_any', params_array))
31-
32-
if 'client' in params:
33-
query = query.where(filter=FieldFilter('client', '==', params['client']))
34-
35-
if 'onlyname' in params:
36-
onlyname = True
37-
38-
if 'sort' not in params:
39-
query = query.order_by('technology', direction=firestore.Query.ASCENDING)
40-
else:
41-
if params['sort'] == 'origins':
42-
query = query.order_by('origins', direction=firestore.Query.DESCENDING)
43-
44-
45-
documents = query.stream()
46-
47-
data = []
48-
if onlyname and 'client' not in params:
49-
appended_technologies = set()
50-
for doc in documents:
51-
technology = doc.get('technology')
52-
if technology not in appended_technologies:
53-
appended_technologies.add(technology)
54-
data.append(technology)
55-
56-
else:
57-
for doc in documents:
58-
data.append(Presenters.technology(doc.to_dict()))
59-
60-
return Result(result=data)
15+
ref = DB.collection("technologies")
16+
17+
query = ref.order_by("technology", 'asc')
18+
19+
if "technology" in params:
20+
arfilters = []
21+
params_array = convert_to_array(params["technology"])
22+
for tech in params_array:
23+
arfilters.append(FieldFilter("technology", "==", tech))
24+
query = query.where(filter=Or(filters=arfilters))
25+
26+
if "category" in params:
27+
params_array = convert_to_array(params["category"])
28+
query = query.where(
29+
filter=FieldFilter("category_obj", "array_contains_any", params_array)
30+
)
31+
32+
if "client" in params:
33+
query = query.where(filter=FieldFilter("client", "==", params["client"]))
34+
35+
documents = query.stream()
36+
data = []
37+
38+
if "onlyname" in params and "client" not in params:
39+
appended_tech = set()
40+
for doc in documents:
41+
tech = doc.get("technology")
42+
if tech not in appended_tech:
43+
appended_tech.add(tech)
44+
data.append(tech)
45+
46+
else:
47+
for doc in documents:
48+
data.append(Presenters.technology(doc.to_dict()))
49+
50+
return Result(result=data)

0 commit comments

Comments
 (0)