Skip to content

Commit 863e5e0

Browse files
committed
fix(be): change join query filters to be subqueries
After c16369d0, filtering when paginating needs to be done on fields of the model being listed. This change address that for a couple of entities.
1 parent 3b48f4d commit 863e5e0

3 files changed

Lines changed: 27 additions & 24 deletions

File tree

common/entity_services/company_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def get_organizations_with_rules(company_id: str, rules: ListRules) -> Page[Orga
2626

2727
@staticmethod
2828
def get_users_with_rules(company_id: str, rules: ListRules) -> Page[User]:
29-
query = User.select().join(Company).where(Company.id == company_id)
29+
query = User.select().join(Company).where(User.primary_company == company_id)
3030
return Page[User].get_paginated_results(query, User.name, rules)
3131

3232
@staticmethod

common/entity_services/journey_service.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,18 @@ def get_action_by_implementation(journey_id: UUID, action_impl: str) -> Optional
5252

5353
@staticmethod
5454
def get_components_with_rules(journey_id: str, rules: ListRules, filters: ComponentFilters) -> Page[Component]:
55-
query = JourneyDagEdge.journey_id == journey_id
55+
join_on = (JourneyDagEdge.journey_id == journey_id) & (
56+
(JourneyDagEdge.left == Component.id) | (JourneyDagEdge.right == Component.id)
57+
)
58+
query = Component.select(Component).join(JourneyDagEdge, on=join_on)
5659
if rules.search is not None:
57-
query &= Component.key ** f"%{rules.search}%"
60+
query = query.where(Component.key ** f"%{rules.search}%")
5861
if filters.component_types:
59-
query &= Component.type.in_(filters.component_types)
62+
query = query.where(Component.type.in_(filters.component_types))
6063
if filters.tools:
61-
query &= Component.tool.in_(filters.tools)
62-
join_on = (JourneyDagEdge.left == Component.id) | (JourneyDagEdge.right == Component.id)
63-
query = Component.select(Component).join(JourneyDagEdge, on=join_on).where(query).distinct()
64-
return Page[Component].get_paginated_results(query, Component.key, rules)
64+
query = query.where(Component.tool.in_(filters.tools))
65+
66+
return Page[Component].get_paginated_results(query.distinct(), Component.key, rules)
6567

6668
@staticmethod
6769
def get_upstream_nodes(journey: Journey, component_id: UUID) -> set:

common/entity_services/project_service.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,36 +55,37 @@ class ProjectService:
5555
def get_test_outcomes_with_rules(
5656
project: Project, rules: ListRules, filters: TestOutcomeItemFilters
5757
) -> Page[TestOutcome]:
58-
clauses = [TestOutcome.component.in_(project.components)]
58+
query = TestOutcome.select(TestOutcome).where(TestOutcome.component.in_(project.components))
5959
if rules.search is not None:
60-
clauses.append(
60+
query = query.where(
6161
((TestOutcome.name ** f"%{rules.search}%") | (TestOutcome.description ** f"%{rules.search}%"))
6262
)
63+
6364
if filters:
6465
if statuses := filters.statuses:
65-
clauses.append(TestOutcome.status.in_(statuses))
66+
query = query.where(TestOutcome.status.in_(statuses))
6667
if component_ids := filters.component_ids:
67-
clauses.append(TestOutcome.component << component_ids)
68+
query = query.where(TestOutcome.component << component_ids)
6869
if start_range_begin := filters.start_range_begin:
69-
clauses.append(TestOutcome.start_time >= start_range_begin)
70+
query = query.where(TestOutcome.start_time >= start_range_begin)
7071
if start_range_end := filters.start_range_end:
71-
clauses.append(TestOutcome.start_time < start_range_end)
72+
query = query.where(TestOutcome.start_time < start_range_end)
7273
if end_range_begin := filters.end_range_begin:
73-
clauses.append(TestOutcome.end_time >= end_range_begin)
74+
query = query.where(TestOutcome.end_time >= end_range_begin)
7475
if end_range_end := filters.end_range_end:
75-
clauses.append(TestOutcome.end_time < end_range_end)
76+
query = query.where(TestOutcome.end_time < end_range_end)
7677
if run_ids := filters.run_ids:
77-
clauses.append(TestOutcome.run.in_(run_ids))
78+
query = query.where(TestOutcome.run.in_(run_ids))
7879
if instance_ids := filters.instance_ids:
79-
clauses.append(InstancesInstanceSets.instance.in_(instance_ids))
80+
instance_set_subquery = (
81+
InstanceSet.select(InstanceSet.id)
82+
.join(InstancesInstanceSets)
83+
.where(InstancesInstanceSets.instance.in_(instance_ids))
84+
)
85+
query = query.where(TestOutcome.instance_set.in_(instance_set_subquery))
8086
if key := filters.key:
81-
clauses.append(TestOutcome.key == key)
87+
query = query.where(TestOutcome.key == key)
8288

83-
# If filtering on instance_ids we need to join the InstanceSet tables
84-
if filters and filters.instance_ids:
85-
query = TestOutcome.select(TestOutcome).join(InstanceSet).join(InstancesInstanceSets).where(*clauses)
86-
else:
87-
query = TestOutcome.select(TestOutcome).where(*clauses)
8889
return Page[TestOutcome].get_paginated_results(query, TestOutcome.start_time, rules)
8990

9091
@staticmethod

0 commit comments

Comments
 (0)