This is an automated email from the ASF dual-hosted git repository.

sbp pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tooling-trusted-release.git


The following commit(s) were added to refs/heads/main by this push:
     new 000db29  Use joined loads for properties with single values
000db29 is described below

commit 000db29498a6b5d80c9f38c970a5308a8b2dc90b
Author: Sean B. Palmer <[email protected]>
AuthorDate: Mon Jun 23 15:43:20 2025 +0100

    Use joined loads for properties with single values
---
 atr/db/__init__.py | 58 ++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 43 insertions(+), 15 deletions(-)

diff --git a/atr/db/__init__.py b/atr/db/__init__.py
index 45ea068..a7bc4b6 100644
--- a/atr/db/__init__.py
+++ b/atr/db/__init__.py
@@ -190,7 +190,7 @@ class Session(sqlalchemy.ext.asyncio.AsyncSession):
             query = query.where(models.CheckResult.data == data)
 
         if _release:
-            query = query.options(select_in_load(models.CheckResult.release))
+            query = query.options(joined_load(models.CheckResult.release))
 
         return Query(self, query)
 
@@ -312,18 +312,24 @@ class Session(sqlalchemy.ext.asyncio.AsyncSession):
         if is_defined(status):
             query = query.where(models.Project.status == status)
 
-        if _committee:
-            query = query.options(select_in_load(models.Project.committee))
+        # Avoid multiple loaders for Project.committee on the same path
+        if _committee_public_signing_keys:
+            query = query.options(
+                joined_load(models.Project.committee).selectinload(
+                    
models.validate_instrumented_attribute(models.Committee.public_signing_keys)
+                )
+            )
+        elif _committee:
+            query = query.options(joined_load(models.Project.committee))
+
         if _releases:
             query = query.options(select_in_load(models.Project.releases))
         if _distribution_channels:
             query = 
query.options(select_in_load(models.Project.distribution_channels))
         if _super_project:
-            query = query.options(select_in_load(models.Project.super_project))
+            query = query.options(joined_load(models.Project.super_project))
         if _release_policy:
-            query = 
query.options(select_in_load(models.Project.release_policy))
-        if _committee_public_signing_keys:
-            query = 
query.options(select_in_load_nested(models.Project.committee, 
models.Committee.public_signing_keys))
+            query = query.options(joined_load(models.Project.release_policy))
 
         return Query(self, query)
 
@@ -410,12 +416,14 @@ class Session(sqlalchemy.ext.asyncio.AsyncSession):
             # query = query.where(models.Release.latest_revision_number == 
latest_revision_number)
             query = query.where(models.latest_revision_number_query() == 
latest_revision_number)
 
-        if _project:
-            query = query.options(select_in_load(models.Release.project))
-        if _release_policy:
-            query = 
query.options(select_in_load(models.Release.release_policy))
+        # Avoid multiple loaders for Release.project on the same path
         if _committee:
-            query = 
query.options(select_in_load_nested(models.Release.project, 
models.Project.committee))
+            query = query.options(joined_load_nested(models.Release.project, 
models.Project.committee))
+        elif _project:
+            query = query.options(joined_load(models.Release.project))
+
+        if _release_policy:
+            query = query.options(joined_load(models.Release.release_policy))
         if _revisions:
             query = query.options(select_in_load(models.Release.revisions))
 
@@ -488,11 +496,11 @@ class Session(sqlalchemy.ext.asyncio.AsyncSession):
             query = query.where(models.Revision.description == description)
 
         if _release:
-            query = query.options(select_in_load(models.Revision.release))
+            query = query.options(joined_load(models.Revision.release))
         if _parent:
-            query = query.options(select_in_load(models.Revision.parent))
+            query = query.options(joined_load(models.Revision.parent))
         if _child:
-            query = query.options(select_in_load(models.Revision.child))
+            query = query.options(joined_load(models.Revision.child))
 
         return Query(self, query)
 
@@ -681,6 +689,26 @@ def is_undefined(v: object | NotSet) -> TypeGuard[NotSet]:
     return isinstance(v, NotSet)
 
 
+def joined_load(*entities: Any) -> orm.strategy_options._AbstractLoad:
+    """Eagerly load the given entities from the query using joinedload."""
+    validated_entities = []
+    for entity in entities:
+        if not isinstance(entity, orm.InstrumentedAttribute):
+            raise ValueError(f"Object must be an orm.InstrumentedAttribute, 
got: {type(entity)}")
+        validated_entities.append(entity)
+    return orm.joinedload(*validated_entities)
+
+
+def joined_load_nested(parent: Any, *descendants: Any) -> 
orm.strategy_options._AbstractLoad:
+    """Eagerly load the given nested entities from the query using 
joinedload."""
+    if not isinstance(parent, orm.InstrumentedAttribute):
+        raise ValueError(f"Parent must be an orm.InstrumentedAttribute, got: 
{type(parent)}")
+    for descendant in descendants:
+        if not isinstance(descendant, orm.InstrumentedAttribute):
+            raise ValueError(f"Descendant must be an 
orm.InstrumentedAttribute, got: {type(descendant)}")
+    return orm.joinedload(parent).joinedload(*descendants)
+
+
 @contextlib.contextmanager
 def log_queries() -> Iterator[None]:
     """A context manager to temporarily enable global query logging."""


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to