diracx-db 0.0.1a14__py3-none-any.whl → 0.0.1a16__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- diracx/db/sql/jobs/db.py +32 -12
- diracx/db/sql/jobs/status_utility.py +1 -1
- {diracx_db-0.0.1a14.dist-info → diracx_db-0.0.1a16.dist-info}/METADATA +1 -1
- {diracx_db-0.0.1a14.dist-info → diracx_db-0.0.1a16.dist-info}/RECORD +7 -7
- {diracx_db-0.0.1a14.dist-info → diracx_db-0.0.1a16.dist-info}/WHEEL +0 -0
- {diracx_db-0.0.1a14.dist-info → diracx_db-0.0.1a16.dist-info}/entry_points.txt +0 -0
- {diracx_db-0.0.1a14.dist-info → diracx_db-0.0.1a16.dist-info}/top_level.txt +0 -0
    
        diracx/db/sql/jobs/db.py
    CHANGED
    
    | @@ -19,6 +19,9 @@ from diracx.core.models import ( | |
| 19 19 | 
             
                LimitedJobStatusReturn,
         | 
| 20 20 | 
             
                ScalarSearchOperator,
         | 
| 21 21 | 
             
                ScalarSearchSpec,
         | 
| 22 | 
            +
                SearchSpec,
         | 
| 23 | 
            +
                SortDirection,
         | 
| 24 | 
            +
                SortSpec,
         | 
| 22 25 | 
             
            )
         | 
| 23 26 | 
             
            from diracx.core.properties import JOB_SHARING, SecurityProperty
         | 
| 24 27 |  | 
| @@ -83,14 +86,14 @@ class JobDB(BaseSQLDB): | |
| 83 86 |  | 
| 84 87 | 
             
                async def search(
         | 
| 85 88 | 
             
                    self,
         | 
| 86 | 
            -
                    parameters,
         | 
| 87 | 
            -
                    search,
         | 
| 88 | 
            -
                    sorts,
         | 
| 89 | 
            +
                    parameters: list[str] | None,
         | 
| 90 | 
            +
                    search: list[SearchSpec],
         | 
| 91 | 
            +
                    sorts: list[SortSpec],
         | 
| 89 92 | 
             
                    *,
         | 
| 90 93 | 
             
                    distinct: bool = False,
         | 
| 91 94 | 
             
                    per_page: int = 100,
         | 
| 92 95 | 
             
                    page: int | None = None,
         | 
| 93 | 
            -
                ) -> list[dict[ | 
| 96 | 
            +
                ) -> tuple[int, list[dict[Any, Any]]]:
         | 
| 94 97 | 
             
                    # Find which columns to select
         | 
| 95 98 | 
             
                    columns = _get_columns(Jobs.__table__, parameters)
         | 
| 96 99 | 
             
                    stmt = select(*columns)
         | 
| @@ -98,28 +101,45 @@ class JobDB(BaseSQLDB): | |
| 98 101 | 
             
                    stmt = apply_search_filters(Jobs.__table__, stmt, search)
         | 
| 99 102 |  | 
| 100 103 | 
             
                    # Apply any sort constraints
         | 
| 104 | 
            +
                    sort_columns = []
         | 
| 101 105 | 
             
                    for sort in sorts:
         | 
| 102 106 | 
             
                        if sort["parameter"] not in Jobs.__table__.columns:
         | 
| 103 107 | 
             
                            raise InvalidQueryError(
         | 
| 104 108 | 
             
                                f"Cannot sort by {sort['parameter']}: unknown column"
         | 
| 105 109 | 
             
                            )
         | 
| 106 110 | 
             
                        column = Jobs.__table__.columns[sort["parameter"]]
         | 
| 107 | 
            -
                         | 
| 108 | 
            -
             | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 111 | 
            +
                        sorted_column = None
         | 
| 112 | 
            +
                        if sort["direction"] == SortDirection.ASC:
         | 
| 113 | 
            +
                            sorted_column = column.asc()
         | 
| 114 | 
            +
                        elif sort["direction"] == SortDirection.DESC:
         | 
| 115 | 
            +
                            sorted_column = column.desc()
         | 
| 111 116 | 
             
                        else:
         | 
| 112 117 | 
             
                            raise InvalidQueryError(f"Unknown sort {sort['direction']=}")
         | 
| 118 | 
            +
                        sort_columns.append(sorted_column)
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                    if sort_columns:
         | 
| 121 | 
            +
                        stmt = stmt.order_by(*sort_columns)
         | 
| 113 122 |  | 
| 114 123 | 
             
                    if distinct:
         | 
| 115 124 | 
             
                        stmt = stmt.distinct()
         | 
| 116 125 |  | 
| 126 | 
            +
                    # Calculate total count before applying pagination
         | 
| 127 | 
            +
                    total_count_subquery = stmt.alias()
         | 
| 128 | 
            +
                    total_count_stmt = select(func.count()).select_from(total_count_subquery)
         | 
| 129 | 
            +
                    total = (await self.conn.execute(total_count_stmt)).scalar_one()
         | 
| 130 | 
            +
             | 
| 117 131 | 
             
                    # Apply pagination
         | 
| 118 | 
            -
                    if page:
         | 
| 119 | 
            -
                         | 
| 132 | 
            +
                    if page is not None:
         | 
| 133 | 
            +
                        if page < 1:
         | 
| 134 | 
            +
                            raise InvalidQueryError("Page must be a positive integer")
         | 
| 135 | 
            +
                        if per_page < 1:
         | 
| 136 | 
            +
                            raise InvalidQueryError("Per page must be a positive integer")
         | 
| 137 | 
            +
                        stmt = stmt.offset((page - 1) * per_page).limit(per_page)
         | 
| 120 138 |  | 
| 121 139 | 
             
                    # Execute the query
         | 
| 122 | 
            -
                    return [ | 
| 140 | 
            +
                    return total, [
         | 
| 141 | 
            +
                        dict(row._mapping) async for row in (await self.conn.stream(stmt))
         | 
| 142 | 
            +
                    ]
         | 
| 123 143 |  | 
| 124 144 | 
             
                async def _insertNewJDL(self, jdl) -> int:
         | 
| 125 145 | 
             
                    from DIRAC.WorkloadManagementSystem.DB.JobDBUtils import compressJDL
         | 
| @@ -314,7 +334,7 @@ class JobDB(BaseSQLDB): | |
| 314 334 | 
             
                    from DIRAC.Core.Utilities.ClassAd.ClassAdLight import ClassAd
         | 
| 315 335 | 
             
                    from DIRAC.Core.Utilities.ReturnValues import SErrorException
         | 
| 316 336 |  | 
| 317 | 
            -
                    result = await self.search(
         | 
| 337 | 
            +
                    _, result = await self.search(
         | 
| 318 338 | 
             
                        parameters=[
         | 
| 319 339 | 
             
                            "Status",
         | 
| 320 340 | 
             
                            "MinorStatus",
         | 
| @@ -43,7 +43,7 @@ async def set_job_status( | |
| 43 43 | 
             
                for key, value in status.items():
         | 
| 44 44 | 
             
                    statusDict[key] = {k: v for k, v in value.dict().items() if v is not None}
         | 
| 45 45 |  | 
| 46 | 
            -
                res = await job_db.search(
         | 
| 46 | 
            +
                _, res = await job_db.search(
         | 
| 47 47 | 
             
                    parameters=["Status", "StartExecTime", "EndExecTime"],
         | 
| 48 48 | 
             
                    search=[
         | 
| 49 49 | 
             
                        {
         | 
| @@ -14,14 +14,14 @@ diracx/db/sql/dummy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu | |
| 14 14 | 
             
            diracx/db/sql/dummy/db.py,sha256=5PIPv6aKY7CGIwmvnGKowjVr9ZQWpbjFSd2PIX7YOUw,1627
         | 
| 15 15 | 
             
            diracx/db/sql/dummy/schema.py,sha256=uEkGDNVZbmJecytkHY1CO-M1MiKxe5w1_h0joJMPC9E,680
         | 
| 16 16 | 
             
            diracx/db/sql/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 17 | 
            -
            diracx/db/sql/jobs/db.py,sha256= | 
| 17 | 
            +
            diracx/db/sql/jobs/db.py,sha256=CyQIPX2g5ancBIBEMLijAyTi5HZxTgeVH0qQZ3p3KcU,30722
         | 
| 18 18 | 
             
            diracx/db/sql/jobs/schema.py,sha256=YkxIdjTkvLlEZ9IQt86nj80eMvOPbcrfk9aisjmNpqY,9275
         | 
| 19 | 
            -
            diracx/db/sql/jobs/status_utility.py,sha256= | 
| 19 | 
            +
            diracx/db/sql/jobs/status_utility.py,sha256=YZzQfU96A062NC4MkB5-0y96TCPq8Y8dfNBEETzPtrw,10528
         | 
| 20 20 | 
             
            diracx/db/sql/sandbox_metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
         | 
| 21 21 | 
             
            diracx/db/sql/sandbox_metadata/db.py,sha256=0EDFMfOW_O3pEPTShqBCME9z4j-JKpyYM6-BBccr27E,6303
         | 
| 22 22 | 
             
            diracx/db/sql/sandbox_metadata/schema.py,sha256=rngYYkJxBhjETBHGLD1CTipDGe44mRYR0wdaFoAJwp0,1400
         | 
| 23 | 
            -
            diracx_db-0.0. | 
| 24 | 
            -
            diracx_db-0.0. | 
| 25 | 
            -
            diracx_db-0.0. | 
| 26 | 
            -
            diracx_db-0.0. | 
| 27 | 
            -
            diracx_db-0.0. | 
| 23 | 
            +
            diracx_db-0.0.1a16.dist-info/METADATA,sha256=-weqkdxDh05swLO8E-bkWpbhm_Zno2qUnRyKy1pzA7c,681
         | 
| 24 | 
            +
            diracx_db-0.0.1a16.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
         | 
| 25 | 
            +
            diracx_db-0.0.1a16.dist-info/entry_points.txt,sha256=xEFGu_zgmPgQPlUeFtdahQfQIboJ1ugFOK8eMio9gtw,271
         | 
| 26 | 
            +
            diracx_db-0.0.1a16.dist-info/top_level.txt,sha256=vJx10tdRlBX3rF2Psgk5jlwVGZNcL3m_7iQWwgPXt-U,7
         | 
| 27 | 
            +
            diracx_db-0.0.1a16.dist-info/RECORD,,
         | 
| 
            File without changes
         | 
| 
            File without changes
         | 
| 
            File without changes
         |