Coverage for /usr/local/lib/python3.12/site-packages/prefect/server/schemas/sorting.py: 100%
101 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 02:04 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 02:04 +0000
1"""
2Schemas for sorting Prefect REST API objects.
3"""
5from collections.abc import Iterable
6from typing import Any
8import sqlalchemy as sa
10from prefect.utilities.collections import AutoEnum
12# TODO: Consider moving the `as_sql_sort` functions out of here since they are a
13# database model level function and do not properly separate concerns when
14# present in the schemas module
17class FlowRunSort(AutoEnum):
18 """Defines flow run sorting options."""
20 ID_DESC = AutoEnum.auto()
21 START_TIME_ASC = AutoEnum.auto()
22 START_TIME_DESC = AutoEnum.auto()
23 EXPECTED_START_TIME_ASC = AutoEnum.auto()
24 EXPECTED_START_TIME_DESC = AutoEnum.auto()
25 NAME_ASC = AutoEnum.auto()
26 NAME_DESC = AutoEnum.auto()
27 NEXT_SCHEDULED_START_TIME_ASC = AutoEnum.auto()
28 END_TIME_DESC = AutoEnum.auto()
30 def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
31 """Return an expression used to sort flow runs"""
32 from prefect.server.database.dependencies import provide_database_interface
34 db = provide_database_interface()
35 sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
36 "ID_DESC": [db.FlowRun.id.desc()],
37 "START_TIME_ASC": [
38 sa.func.coalesce(
39 db.FlowRun.start_time, db.FlowRun.expected_start_time
40 ).asc()
41 ],
42 "START_TIME_DESC": [
43 sa.func.coalesce(
44 db.FlowRun.start_time, db.FlowRun.expected_start_time
45 ).desc()
46 ],
47 "EXPECTED_START_TIME_ASC": [db.FlowRun.expected_start_time.asc()],
48 "EXPECTED_START_TIME_DESC": [db.FlowRun.expected_start_time.desc()],
49 "NAME_ASC": [db.FlowRun.name.asc()],
50 "NAME_DESC": [db.FlowRun.name.desc()],
51 "NEXT_SCHEDULED_START_TIME_ASC": [
52 db.FlowRun.next_scheduled_start_time.asc()
53 ],
54 "END_TIME_DESC": [db.FlowRun.end_time.desc()],
55 }
56 return sort_mapping[self.value]
59class TaskRunSort(AutoEnum):
60 """Defines task run sorting options."""
62 ID_DESC = AutoEnum.auto()
63 EXPECTED_START_TIME_ASC = AutoEnum.auto()
64 EXPECTED_START_TIME_DESC = AutoEnum.auto()
65 NAME_ASC = AutoEnum.auto()
66 NAME_DESC = AutoEnum.auto()
67 NEXT_SCHEDULED_START_TIME_ASC = AutoEnum.auto()
68 END_TIME_DESC = AutoEnum.auto()
70 def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
71 """Return an expression used to sort task runs"""
72 from prefect.server.database.dependencies import provide_database_interface
74 db = provide_database_interface()
75 sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
76 "ID_DESC": [db.TaskRun.id.desc()],
77 "EXPECTED_START_TIME_ASC": [db.TaskRun.expected_start_time.asc()],
78 "EXPECTED_START_TIME_DESC": [db.TaskRun.expected_start_time.desc()],
79 "NAME_ASC": [db.TaskRun.name.asc()],
80 "NAME_DESC": [db.TaskRun.name.desc()],
81 "NEXT_SCHEDULED_START_TIME_ASC": [
82 db.TaskRun.next_scheduled_start_time.asc()
83 ],
84 "END_TIME_DESC": [db.TaskRun.end_time.desc()],
85 }
86 return sort_mapping[self.value]
89class LogSort(AutoEnum):
90 """Defines log sorting options."""
92 TIMESTAMP_ASC = AutoEnum.auto()
93 TIMESTAMP_DESC = AutoEnum.auto()
95 def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
96 """Return an expression used to sort task runs"""
97 from prefect.server.database.dependencies import provide_database_interface
99 db = provide_database_interface()
100 sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
101 "TIMESTAMP_ASC": [db.Log.timestamp.asc()],
102 "TIMESTAMP_DESC": [db.Log.timestamp.desc()],
103 }
104 return sort_mapping[self.value]
107class FlowSort(AutoEnum):
108 """Defines flow sorting options."""
110 CREATED_DESC = AutoEnum.auto()
111 UPDATED_DESC = AutoEnum.auto()
112 NAME_ASC = AutoEnum.auto()
113 NAME_DESC = AutoEnum.auto()
115 def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
116 """Return an expression used to sort task runs"""
117 from prefect.server.database.dependencies import provide_database_interface
119 db = provide_database_interface()
120 sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
121 "CREATED_DESC": [db.Flow.created.desc()],
122 "UPDATED_DESC": [db.Flow.updated.desc()],
123 "NAME_ASC": [db.Flow.name.asc()],
124 "NAME_DESC": [db.Flow.name.desc()],
125 }
126 return sort_mapping[self.value]
129class DeploymentSort(AutoEnum):
130 """Defines deployment sorting options."""
132 CREATED_DESC = AutoEnum.auto()
133 UPDATED_DESC = AutoEnum.auto()
134 NAME_ASC = AutoEnum.auto()
135 NAME_DESC = AutoEnum.auto()
137 def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
138 """Return an expression used to sort task runs"""
139 from prefect.server.database.dependencies import provide_database_interface
141 db = provide_database_interface()
142 sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
143 "CREATED_DESC": [db.Deployment.created.desc()],
144 "UPDATED_DESC": [db.Deployment.updated.desc()],
145 "NAME_ASC": [db.Deployment.name.asc()],
146 "NAME_DESC": [db.Deployment.name.desc()],
147 }
148 return sort_mapping[self.value]
151class ArtifactSort(AutoEnum):
152 """Defines artifact sorting options."""
154 CREATED_DESC = AutoEnum.auto()
155 UPDATED_DESC = AutoEnum.auto()
156 ID_DESC = AutoEnum.auto()
157 KEY_DESC = AutoEnum.auto()
158 KEY_ASC = AutoEnum.auto()
160 def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
161 """Return an expression used to sort task runs"""
162 from prefect.server.database.dependencies import provide_database_interface
164 db = provide_database_interface()
165 sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
166 "CREATED_DESC": [db.Artifact.created.desc()],
167 "UPDATED_DESC": [db.Artifact.updated.desc()],
168 "ID_DESC": [db.Artifact.id.desc()],
169 "KEY_DESC": [db.Artifact.key.desc()],
170 "KEY_ASC": [db.Artifact.key.asc()],
171 }
172 return sort_mapping[self.value]
175class ArtifactCollectionSort(AutoEnum):
176 """Defines artifact collection sorting options."""
178 CREATED_DESC = AutoEnum.auto()
179 UPDATED_DESC = AutoEnum.auto()
180 ID_DESC = AutoEnum.auto()
181 KEY_DESC = AutoEnum.auto()
182 KEY_ASC = AutoEnum.auto()
184 def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
185 """Return an expression used to sort task runs"""
186 from prefect.server.database.dependencies import provide_database_interface
188 db = provide_database_interface()
189 sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
190 "CREATED_DESC": [db.ArtifactCollection.created.desc()],
191 "UPDATED_DESC": [db.ArtifactCollection.updated.desc()],
192 "ID_DESC": [db.ArtifactCollection.id.desc()],
193 "KEY_DESC": [db.ArtifactCollection.key.desc()],
194 "KEY_ASC": [db.ArtifactCollection.key.asc()],
195 }
196 return sort_mapping[self.value]
199class VariableSort(AutoEnum):
200 """Defines variables sorting options."""
202 CREATED_DESC = "CREATED_DESC"
203 UPDATED_DESC = "UPDATED_DESC"
204 NAME_DESC = "NAME_DESC"
205 NAME_ASC = "NAME_ASC"
207 def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
208 """Return an expression used to sort task runs"""
209 from prefect.server.database.dependencies import provide_database_interface
211 db = provide_database_interface()
212 sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
213 "CREATED_DESC": [db.Variable.created.desc()],
214 "UPDATED_DESC": [db.Variable.updated.desc()],
215 "NAME_DESC": [db.Variable.name.desc()],
216 "NAME_ASC": [db.Variable.name.asc()],
217 }
218 return sort_mapping[self.value]
221class BlockDocumentSort(AutoEnum):
222 """Defines block document sorting options."""
224 NAME_DESC = "NAME_DESC"
225 NAME_ASC = "NAME_ASC"
226 BLOCK_TYPE_AND_NAME_ASC = "BLOCK_TYPE_AND_NAME_ASC"
228 def as_sql_sort(self) -> Iterable[sa.ColumnElement[Any]]:
229 """Return an expression used to sort task runs"""
230 from prefect.server.database.dependencies import provide_database_interface
232 db = provide_database_interface()
233 sort_mapping: dict[str, Iterable[sa.ColumnElement[Any]]] = {
234 "NAME_DESC": [db.BlockDocument.name.desc()],
235 "NAME_ASC": [db.BlockDocument.name.asc()],
236 "BLOCK_TYPE_AND_NAME_ASC": [
237 db.BlockDocument.block_type_name.asc(),
238 db.BlockDocument.name.asc(),
239 ],
240 }
241 return sort_mapping[self.value]