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
|