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

pierrejeambrun pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 6c7f26052c2 Add run after to task instances endpoints (#46741)
6c7f26052c2 is described below

commit 6c7f26052c2953596709d19382756256d9acc1f6
Author: Brent Bovenzi <[email protected]>
AuthorDate: Mon Feb 17 09:33:36 2025 -0500

    Add run after to task instances endpoints (#46741)
    
    * Add run_after to task_instances endpoints in fastapi
    
    * Fix CI and tests
---
 .../core_api/datamodels/task_instances.py          |  3 ++
 .../api_fastapi/core_api/openapi/v1-generated.yaml | 53 ++++++++++++++++++++++
 .../core_api/routes/public/task_instances.py       | 17 ++++++-
 airflow/models/taskinstance.py                     |  1 +
 airflow/ui/openapi-gen/queries/common.ts           | 12 +++++
 airflow/ui/openapi-gen/queries/prefetch.ts         | 20 ++++++++
 airflow/ui/openapi-gen/queries/queries.ts          | 20 ++++++++
 airflow/ui/openapi-gen/queries/suspense.ts         | 20 ++++++++
 airflow/ui/openapi-gen/requests/schemas.gen.ts     | 30 ++++++++++++
 airflow/ui/openapi-gen/requests/services.gen.ts    |  8 ++++
 airflow/ui/openapi-gen/requests/types.gen.ts       |  7 +++
 airflow/ui/src/components/DurationChart.tsx        |  6 +--
 airflow/ui/src/pages/Dag/Overview/Overview.tsx     |  4 +-
 airflow/ui/src/pages/Dag/Tasks/TaskCard.tsx        |  2 +-
 airflow/ui/src/pages/Task/Overview/Overview.tsx    |  6 +--
 airflow/ui/src/pages/TaskInstances.tsx             |  7 ++-
 .../ci/pre_commit/check_ti_vs_tis_attributes.py    |  1 +
 .../core_api/routes/public/test_task_instances.py  | 14 ++++++
 18 files changed, 215 insertions(+), 16 deletions(-)

diff --git a/airflow/api_fastapi/core_api/datamodels/task_instances.py 
b/airflow/api_fastapi/core_api/datamodels/task_instances.py
index 7c849a9e86a..b7fa74e16ae 100644
--- a/airflow/api_fastapi/core_api/datamodels/task_instances.py
+++ b/airflow/api_fastapi/core_api/datamodels/task_instances.py
@@ -47,6 +47,7 @@ class TaskInstanceResponse(BaseModel):
     run_id: str = Field(alias="dag_run_id")
     map_index: int
     logical_date: datetime | None
+    run_after: datetime
     start_date: datetime | None
     end_date: datetime | None
     duration: float | None
@@ -104,6 +105,8 @@ class TaskInstancesBatchBody(StrictBaseModel):
     dag_run_ids: list[str] | None = None
     task_ids: list[str] | None = None
     state: list[TaskInstanceState | None] | None = None
+    run_after_gte: AwareDatetime | None = None
+    run_after_lte: AwareDatetime | None = None
     logical_date_gte: AwareDatetime | None = None
     logical_date_lte: AwareDatetime | None = None
     start_date_gte: AwareDatetime | None = None
diff --git a/airflow/api_fastapi/core_api/openapi/v1-generated.yaml 
b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
index 57cd7ddf9b3..24ef4746e81 100644
--- a/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
+++ b/airflow/api_fastapi/core_api/openapi/v1-generated.yaml
@@ -4885,6 +4885,24 @@ paths:
         schema:
           type: string
           title: Task Id
+      - name: run_after_gte
+        in: query
+        required: false
+        schema:
+          anyOf:
+          - type: string
+            format: date-time
+          - type: 'null'
+          title: Run After Gte
+      - name: run_after_lte
+        in: query
+        required: false
+        schema:
+          anyOf:
+          - type: string
+            format: date-time
+          - type: 'null'
+          title: Run After Lte
       - name: logical_date_gte
         in: query
         required: false
@@ -5507,6 +5525,24 @@ paths:
           - type: string
           - type: 'null'
           title: Task Id
+      - name: run_after_gte
+        in: query
+        required: false
+        schema:
+          anyOf:
+          - type: string
+            format: date-time
+          - type: 'null'
+          title: Run After Gte
+      - name: run_after_lte
+        in: query
+        required: false
+        schema:
+          anyOf:
+          - type: string
+            format: date-time
+          - type: 'null'
+          title: Run After Lte
       - name: logical_date_gte
         in: query
         required: false
@@ -10190,6 +10226,10 @@ components:
             format: date-time
           - type: 'null'
           title: Logical Date
+        run_after:
+          type: string
+          format: date-time
+          title: Run After
         start_date:
           anyOf:
           - type: string
@@ -10310,6 +10350,7 @@ components:
       - dag_run_id
       - map_index
       - logical_date
+      - run_after
       - start_date
       - end_date
       - duration
@@ -10446,6 +10487,18 @@ components:
             type: array
           - type: 'null'
           title: State
+        run_after_gte:
+          anyOf:
+          - type: string
+            format: date-time
+          - type: 'null'
+          title: Run After Gte
+        run_after_lte:
+          anyOf:
+          - type: string
+            format: date-time
+          - type: 'null'
+          title: Run After Lte
         logical_date_gte:
           anyOf:
           - type: string
diff --git a/airflow/api_fastapi/core_api/routes/public/task_instances.py 
b/airflow/api_fastapi/core_api/routes/public/task_instances.py
index 927f62028a8..4b6dc2d836a 100644
--- a/airflow/api_fastapi/core_api/routes/public/task_instances.py
+++ b/airflow/api_fastapi/core_api/routes/public/task_instances.py
@@ -114,6 +114,7 @@ def get_mapped_task_instances(
     dag_run_id: str,
     task_id: str,
     request: Request,
+    run_after_range: Annotated[RangeFilter, 
Depends(datetime_range_filter_factory("run_after", TI))],
     logical_date_range: Annotated[RangeFilter, 
Depends(datetime_range_filter_factory("logical_date", TI))],
     start_date_range: Annotated[RangeFilter, 
Depends(datetime_range_filter_factory("start_date", TI))],
     end_date_range: Annotated[RangeFilter, 
Depends(datetime_range_filter_factory("end_date", TI))],
@@ -139,12 +140,14 @@ def get_mapped_task_instances(
                     "map_index",
                     "try_number",
                     "logical_date",
+                    "run_after",
                     "data_interval_start",
                     "data_interval_end",
                     "rendered_map_index",
                 ],
                 TI,
                 to_replace={
+                    "run_after": DagRun.run_after,
                     "logical_date": DagRun.logical_date,
                     "data_interval_start": DagRun.data_interval_start,
                     "data_interval_end": DagRun.data_interval_end,
@@ -180,6 +183,7 @@ def get_mapped_task_instances(
     task_instance_select, total_entries = paginated_select(
         statement=query,
         filters=[
+            run_after_range,
             logical_date_range,
             start_date_range,
             end_date_range,
@@ -360,7 +364,8 @@ def get_task_instances(
     dag_run_id: str,
     request: Request,
     task_id: Annotated[FilterParam[str | None], 
Depends(filter_param_factory(TI.task_id, str | None))],
-    logical_date: Annotated[RangeFilter, 
Depends(datetime_range_filter_factory("logical_date", TI))],
+    run_after_range: Annotated[RangeFilter, 
Depends(datetime_range_filter_factory("run_after", TI))],
+    logical_date_range: Annotated[RangeFilter, 
Depends(datetime_range_filter_factory("logical_date", TI))],
     start_date_range: Annotated[RangeFilter, 
Depends(datetime_range_filter_factory("start_date", TI))],
     end_date_range: Annotated[RangeFilter, 
Depends(datetime_range_filter_factory("end_date", TI))],
     update_at_range: Annotated[RangeFilter, 
Depends(datetime_range_filter_factory("updated_at", TI))],
@@ -386,6 +391,7 @@ def get_task_instances(
                     "map_index",
                     "try_number",
                     "logical_date",
+                    "run_after",
                     "data_interval_start",
                     "data_interval_end",
                     "rendered_map_index",
@@ -393,6 +399,7 @@ def get_task_instances(
                 TI,
                 to_replace={
                     "logical_date": DagRun.logical_date,
+                    "run_after": DagRun.run_after,
                     "data_interval_start": DagRun.data_interval_start,
                     "data_interval_end": DagRun.data_interval_end,
                 },
@@ -427,7 +434,8 @@ def get_task_instances(
     task_instance_select, total_entries = paginated_select(
         statement=query,
         filters=[
-            logical_date,
+            run_after_range,
+            logical_date_range,
             start_date_range,
             end_date_range,
             update_at_range,
@@ -467,6 +475,10 @@ def get_task_instances_batch(
     dag_ids = FilterParam(TI.dag_id, body.dag_ids, FilterOptionEnum.IN)
     dag_run_ids = FilterParam(TI.run_id, body.dag_run_ids, FilterOptionEnum.IN)
     task_ids = FilterParam(TI.task_id, body.task_ids, FilterOptionEnum.IN)
+    run_after = RangeFilter(
+        Range(lower_bound=body.run_after_gte, upper_bound=body.run_after_lte),
+        attribute=TI.run_after,
+    )
     logical_date = RangeFilter(
         Range(lower_bound=body.logical_date_gte, 
upper_bound=body.logical_date_lte),
         attribute=TI.logical_date,
@@ -503,6 +515,7 @@ def get_task_instances_batch(
             dag_ids,
             dag_run_ids,
             task_ids,
+            run_after,
             logical_date,
             start_date,
             end_date,
diff --git a/airflow/models/taskinstance.py b/airflow/models/taskinstance.py
index d5eaefaf2d7..f47fae789f8 100644
--- a/airflow/models/taskinstance.py
+++ b/airflow/models/taskinstance.py
@@ -1734,6 +1734,7 @@ class TaskInstance(Base, LoggingMixin):
     triggerer_job = association_proxy("trigger", "triggerer_job")
     dag_run = relationship("DagRun", back_populates="task_instances", 
lazy="joined", innerjoin=True)
     rendered_task_instance_fields = relationship("RenderedTaskInstanceFields", 
lazy="noload", uselist=False)
+    run_after = association_proxy("dag_run", "run_after")
     logical_date = association_proxy("dag_run", "logical_date")
     task_instance_note = relationship(
         "TaskInstanceNote",
diff --git a/airflow/ui/openapi-gen/queries/common.ts 
b/airflow/ui/openapi-gen/queries/common.ts
index 9beff4de51e..7902dfe4628 100644
--- a/airflow/ui/openapi-gen/queries/common.ts
+++ b/airflow/ui/openapi-gen/queries/common.ts
@@ -990,6 +990,8 @@ export const 
UseTaskInstanceServiceGetMappedTaskInstancesKeyFn = (
     orderBy,
     pool,
     queue,
+    runAfterGte,
+    runAfterLte,
     startDateGte,
     startDateLte,
     state,
@@ -1012,6 +1014,8 @@ export const 
UseTaskInstanceServiceGetMappedTaskInstancesKeyFn = (
     orderBy?: string;
     pool?: string[];
     queue?: string[];
+    runAfterGte?: string;
+    runAfterLte?: string;
     startDateGte?: string;
     startDateLte?: string;
     state?: string[];
@@ -1039,6 +1043,8 @@ export const 
UseTaskInstanceServiceGetMappedTaskInstancesKeyFn = (
       orderBy,
       pool,
       queue,
+      runAfterGte,
+      runAfterLte,
       startDateGte,
       startDateLte,
       state,
@@ -1201,6 +1207,8 @@ export const UseTaskInstanceServiceGetTaskInstancesKeyFn 
= (
     orderBy,
     pool,
     queue,
+    runAfterGte,
+    runAfterLte,
     startDateGte,
     startDateLte,
     state,
@@ -1224,6 +1232,8 @@ export const UseTaskInstanceServiceGetTaskInstancesKeyFn 
= (
     orderBy?: string;
     pool?: string[];
     queue?: string[];
+    runAfterGte?: string;
+    runAfterLte?: string;
     startDateGte?: string;
     startDateLte?: string;
     state?: string[];
@@ -1252,6 +1262,8 @@ export const UseTaskInstanceServiceGetTaskInstancesKeyFn 
= (
       orderBy,
       pool,
       queue,
+      runAfterGte,
+      runAfterLte,
       startDateGte,
       startDateLte,
       state,
diff --git a/airflow/ui/openapi-gen/queries/prefetch.ts 
b/airflow/ui/openapi-gen/queries/prefetch.ts
index ee687ae7be6..9e4d361eacf 100644
--- a/airflow/ui/openapi-gen/queries/prefetch.ts
+++ b/airflow/ui/openapi-gen/queries/prefetch.ts
@@ -1336,6 +1336,8 @@ export const 
prefetchUseTaskInstanceServiceGetTaskInstance = (
  * @param data.dagId
  * @param data.dagRunId
  * @param data.taskId
+ * @param data.runAfterGte
+ * @param data.runAfterLte
  * @param data.logicalDateGte
  * @param data.logicalDateLte
  * @param data.startDateGte
@@ -1374,6 +1376,8 @@ export const 
prefetchUseTaskInstanceServiceGetMappedTaskInstances = (
     orderBy,
     pool,
     queue,
+    runAfterGte,
+    runAfterLte,
     startDateGte,
     startDateLte,
     state,
@@ -1396,6 +1400,8 @@ export const 
prefetchUseTaskInstanceServiceGetMappedTaskInstances = (
     orderBy?: string;
     pool?: string[];
     queue?: string[];
+    runAfterGte?: string;
+    runAfterLte?: string;
     startDateGte?: string;
     startDateLte?: string;
     state?: string[];
@@ -1421,6 +1427,8 @@ export const 
prefetchUseTaskInstanceServiceGetMappedTaskInstances = (
       orderBy,
       pool,
       queue,
+      runAfterGte,
+      runAfterLte,
       startDateGte,
       startDateLte,
       state,
@@ -1445,6 +1453,8 @@ export const 
prefetchUseTaskInstanceServiceGetMappedTaskInstances = (
         orderBy,
         pool,
         queue,
+        runAfterGte,
+        runAfterLte,
         startDateGte,
         startDateLte,
         state,
@@ -1623,6 +1633,8 @@ export const 
prefetchUseTaskInstanceServiceGetMappedTaskInstance = (
  * @param data.dagId
  * @param data.dagRunId
  * @param data.taskId
+ * @param data.runAfterGte
+ * @param data.runAfterLte
  * @param data.logicalDateGte
  * @param data.logicalDateLte
  * @param data.startDateGte
@@ -1662,6 +1674,8 @@ export const 
prefetchUseTaskInstanceServiceGetTaskInstances = (
     orderBy,
     pool,
     queue,
+    runAfterGte,
+    runAfterLte,
     startDateGte,
     startDateLte,
     state,
@@ -1685,6 +1699,8 @@ export const 
prefetchUseTaskInstanceServiceGetTaskInstances = (
     orderBy?: string;
     pool?: string[];
     queue?: string[];
+    runAfterGte?: string;
+    runAfterLte?: string;
     startDateGte?: string;
     startDateLte?: string;
     state?: string[];
@@ -1711,6 +1727,8 @@ export const 
prefetchUseTaskInstanceServiceGetTaskInstances = (
       orderBy,
       pool,
       queue,
+      runAfterGte,
+      runAfterLte,
       startDateGte,
       startDateLte,
       state,
@@ -1736,6 +1754,8 @@ export const 
prefetchUseTaskInstanceServiceGetTaskInstances = (
         orderBy,
         pool,
         queue,
+        runAfterGte,
+        runAfterLte,
         startDateGte,
         startDateLte,
         state,
diff --git a/airflow/ui/openapi-gen/queries/queries.ts 
b/airflow/ui/openapi-gen/queries/queries.ts
index acacb68dc07..a3d17d4c6a6 100644
--- a/airflow/ui/openapi-gen/queries/queries.ts
+++ b/airflow/ui/openapi-gen/queries/queries.ts
@@ -1603,6 +1603,8 @@ export const useTaskInstanceServiceGetTaskInstance = <
  * @param data.dagId
  * @param data.dagRunId
  * @param data.taskId
+ * @param data.runAfterGte
+ * @param data.runAfterLte
  * @param data.logicalDateGte
  * @param data.logicalDateLte
  * @param data.startDateGte
@@ -1644,6 +1646,8 @@ export const useTaskInstanceServiceGetMappedTaskInstances 
= <
     orderBy,
     pool,
     queue,
+    runAfterGte,
+    runAfterLte,
     startDateGte,
     startDateLte,
     state,
@@ -1666,6 +1670,8 @@ export const useTaskInstanceServiceGetMappedTaskInstances 
= <
     orderBy?: string;
     pool?: string[];
     queue?: string[];
+    runAfterGte?: string;
+    runAfterLte?: string;
     startDateGte?: string;
     startDateLte?: string;
     state?: string[];
@@ -1694,6 +1700,8 @@ export const useTaskInstanceServiceGetMappedTaskInstances 
= <
         orderBy,
         pool,
         queue,
+        runAfterGte,
+        runAfterLte,
         startDateGte,
         startDateLte,
         state,
@@ -1720,6 +1728,8 @@ export const useTaskInstanceServiceGetMappedTaskInstances 
= <
         orderBy,
         pool,
         queue,
+        runAfterGte,
+        runAfterLte,
         startDateGte,
         startDateLte,
         state,
@@ -1932,6 +1942,8 @@ export const useTaskInstanceServiceGetMappedTaskInstance 
= <
  * @param data.dagId
  * @param data.dagRunId
  * @param data.taskId
+ * @param data.runAfterGte
+ * @param data.runAfterLte
  * @param data.logicalDateGte
  * @param data.logicalDateLte
  * @param data.startDateGte
@@ -1974,6 +1986,8 @@ export const useTaskInstanceServiceGetTaskInstances = <
     orderBy,
     pool,
     queue,
+    runAfterGte,
+    runAfterLte,
     startDateGte,
     startDateLte,
     state,
@@ -1997,6 +2011,8 @@ export const useTaskInstanceServiceGetTaskInstances = <
     orderBy?: string;
     pool?: string[];
     queue?: string[];
+    runAfterGte?: string;
+    runAfterLte?: string;
     startDateGte?: string;
     startDateLte?: string;
     state?: string[];
@@ -2026,6 +2042,8 @@ export const useTaskInstanceServiceGetTaskInstances = <
         orderBy,
         pool,
         queue,
+        runAfterGte,
+        runAfterLte,
         startDateGte,
         startDateLte,
         state,
@@ -2053,6 +2071,8 @@ export const useTaskInstanceServiceGetTaskInstances = <
         orderBy,
         pool,
         queue,
+        runAfterGte,
+        runAfterLte,
         startDateGte,
         startDateLte,
         state,
diff --git a/airflow/ui/openapi-gen/queries/suspense.ts 
b/airflow/ui/openapi-gen/queries/suspense.ts
index 1c156671d5e..4abf14c5479 100644
--- a/airflow/ui/openapi-gen/queries/suspense.ts
+++ b/airflow/ui/openapi-gen/queries/suspense.ts
@@ -1580,6 +1580,8 @@ export const 
useTaskInstanceServiceGetTaskInstanceSuspense = <
  * @param data.dagId
  * @param data.dagRunId
  * @param data.taskId
+ * @param data.runAfterGte
+ * @param data.runAfterLte
  * @param data.logicalDateGte
  * @param data.logicalDateLte
  * @param data.startDateGte
@@ -1621,6 +1623,8 @@ export const 
useTaskInstanceServiceGetMappedTaskInstancesSuspense = <
     orderBy,
     pool,
     queue,
+    runAfterGte,
+    runAfterLte,
     startDateGte,
     startDateLte,
     state,
@@ -1643,6 +1647,8 @@ export const 
useTaskInstanceServiceGetMappedTaskInstancesSuspense = <
     orderBy?: string;
     pool?: string[];
     queue?: string[];
+    runAfterGte?: string;
+    runAfterLte?: string;
     startDateGte?: string;
     startDateLte?: string;
     state?: string[];
@@ -1671,6 +1677,8 @@ export const 
useTaskInstanceServiceGetMappedTaskInstancesSuspense = <
         orderBy,
         pool,
         queue,
+        runAfterGte,
+        runAfterLte,
         startDateGte,
         startDateLte,
         state,
@@ -1697,6 +1705,8 @@ export const 
useTaskInstanceServiceGetMappedTaskInstancesSuspense = <
         orderBy,
         pool,
         queue,
+        runAfterGte,
+        runAfterLte,
         startDateGte,
         startDateLte,
         state,
@@ -1909,6 +1919,8 @@ export const 
useTaskInstanceServiceGetMappedTaskInstanceSuspense = <
  * @param data.dagId
  * @param data.dagRunId
  * @param data.taskId
+ * @param data.runAfterGte
+ * @param data.runAfterLte
  * @param data.logicalDateGte
  * @param data.logicalDateLte
  * @param data.startDateGte
@@ -1951,6 +1963,8 @@ export const 
useTaskInstanceServiceGetTaskInstancesSuspense = <
     orderBy,
     pool,
     queue,
+    runAfterGte,
+    runAfterLte,
     startDateGte,
     startDateLte,
     state,
@@ -1974,6 +1988,8 @@ export const 
useTaskInstanceServiceGetTaskInstancesSuspense = <
     orderBy?: string;
     pool?: string[];
     queue?: string[];
+    runAfterGte?: string;
+    runAfterLte?: string;
     startDateGte?: string;
     startDateLte?: string;
     state?: string[];
@@ -2003,6 +2019,8 @@ export const 
useTaskInstanceServiceGetTaskInstancesSuspense = <
         orderBy,
         pool,
         queue,
+        runAfterGte,
+        runAfterLte,
         startDateGte,
         startDateLte,
         state,
@@ -2030,6 +2048,8 @@ export const 
useTaskInstanceServiceGetTaskInstancesSuspense = <
         orderBy,
         pool,
         queue,
+        runAfterGte,
+        runAfterLte,
         startDateGte,
         startDateLte,
         state,
diff --git a/airflow/ui/openapi-gen/requests/schemas.gen.ts 
b/airflow/ui/openapi-gen/requests/schemas.gen.ts
index 4a9147a5d14..7272117d51f 100644
--- a/airflow/ui/openapi-gen/requests/schemas.gen.ts
+++ b/airflow/ui/openapi-gen/requests/schemas.gen.ts
@@ -4903,6 +4903,11 @@ export const $TaskInstanceResponse = {
       ],
       title: "Logical Date",
     },
+    run_after: {
+      type: "string",
+      format: "date-time",
+      title: "Run After",
+    },
     start_date: {
       anyOf: [
         {
@@ -5139,6 +5144,7 @@ export const $TaskInstanceResponse = {
     "dag_run_id",
     "map_index",
     "logical_date",
+    "run_after",
     "start_date",
     "end_date",
     "duration",
@@ -5330,6 +5336,30 @@ export const $TaskInstancesBatchBody = {
       ],
       title: "State",
     },
+    run_after_gte: {
+      anyOf: [
+        {
+          type: "string",
+          format: "date-time",
+        },
+        {
+          type: "null",
+        },
+      ],
+      title: "Run After Gte",
+    },
+    run_after_lte: {
+      anyOf: [
+        {
+          type: "string",
+          format: "date-time",
+        },
+        {
+          type: "null",
+        },
+      ],
+      title: "Run After Lte",
+    },
     logical_date_gte: {
       anyOf: [
         {
diff --git a/airflow/ui/openapi-gen/requests/services.gen.ts 
b/airflow/ui/openapi-gen/requests/services.gen.ts
index eb1cc49672e..ced6de6dc63 100644
--- a/airflow/ui/openapi-gen/requests/services.gen.ts
+++ b/airflow/ui/openapi-gen/requests/services.gen.ts
@@ -2082,6 +2082,8 @@ export class TaskInstanceService {
    * @param data.dagId
    * @param data.dagRunId
    * @param data.taskId
+   * @param data.runAfterGte
+   * @param data.runAfterLte
    * @param data.logicalDateGte
    * @param data.logicalDateLte
    * @param data.startDateGte
@@ -2115,6 +2117,8 @@ export class TaskInstanceService {
         task_id: data.taskId,
       },
       query: {
+        run_after_gte: data.runAfterGte,
+        run_after_lte: data.runAfterLte,
         logical_date_gte: data.logicalDateGte,
         logical_date_lte: data.logicalDateLte,
         start_date_gte: data.startDateGte,
@@ -2357,6 +2361,8 @@ export class TaskInstanceService {
    * @param data.dagId
    * @param data.dagRunId
    * @param data.taskId
+   * @param data.runAfterGte
+   * @param data.runAfterLte
    * @param data.logicalDateGte
    * @param data.logicalDateLte
    * @param data.startDateGte
@@ -2389,6 +2395,8 @@ export class TaskInstanceService {
       },
       query: {
         task_id: data.taskId,
+        run_after_gte: data.runAfterGte,
+        run_after_lte: data.runAfterLte,
         logical_date_gte: data.logicalDateGte,
         logical_date_lte: data.logicalDateLte,
         start_date_gte: data.startDateGte,
diff --git a/airflow/ui/openapi-gen/requests/types.gen.ts 
b/airflow/ui/openapi-gen/requests/types.gen.ts
index 32858ee802e..fc673756c77 100644
--- a/airflow/ui/openapi-gen/requests/types.gen.ts
+++ b/airflow/ui/openapi-gen/requests/types.gen.ts
@@ -1266,6 +1266,7 @@ export type TaskInstanceResponse = {
   dag_run_id: string;
   map_index: number;
   logical_date: string | null;
+  run_after: string;
   start_date: string | null;
   end_date: string | null;
   duration: number | null;
@@ -1341,6 +1342,8 @@ export type TaskInstancesBatchBody = {
   dag_run_ids?: Array<string> | null;
   task_ids?: Array<string> | null;
   state?: Array<TaskInstanceState | null> | null;
+  run_after_gte?: string | null;
+  run_after_lte?: string | null;
   logical_date_gte?: string | null;
   logical_date_lte?: string | null;
   start_date_gte?: string | null;
@@ -2092,6 +2095,8 @@ export type GetMappedTaskInstancesData = {
   orderBy?: string;
   pool?: Array<string>;
   queue?: Array<string>;
+  runAfterGte?: string | null;
+  runAfterLte?: string | null;
   startDateGte?: string | null;
   startDateLte?: string | null;
   state?: Array<string>;
@@ -2174,6 +2179,8 @@ export type GetTaskInstancesData = {
   orderBy?: string;
   pool?: Array<string>;
   queue?: Array<string>;
+  runAfterGte?: string | null;
+  runAfterLte?: string | null;
   startDateGte?: string | null;
   startDateLte?: string | null;
   state?: Array<string>;
diff --git a/airflow/ui/src/components/DurationChart.tsx 
b/airflow/ui/src/components/DurationChart.tsx
index f07247a3d39..6eefcd48005 100644
--- a/airflow/ui/src/components/DurationChart.tsx
+++ b/airflow/ui/src/components/DurationChart.tsx
@@ -136,9 +136,7 @@ export const DurationChart = ({
               label: "Run duration",
             },
           ],
-          labels: entries.map((entry: RunResponse) =>
-            dayjs(entry.logical_date).format("YYYY-MM-DD, hh:mm:ss"),
-          ),
+          labels: entries.map((entry: RunResponse) => 
dayjs(entry.run_after).format("YYYY-MM-DD, hh:mm:ss")),
         }}
         datasetIdKey="id"
         options={{
@@ -157,7 +155,7 @@ export const DurationChart = ({
               ticks: {
                 maxTicksLimit: 3,
               },
-              title: { align: "end", display: true, text: "Logical Date" },
+              title: { align: "end", display: true, text: "Run After" },
             },
 
             y: {
diff --git a/airflow/ui/src/pages/Dag/Overview/Overview.tsx 
b/airflow/ui/src/pages/Dag/Overview/Overview.tsx
index 3e6e213196b..8cdfae619bd 100644
--- a/airflow/ui/src/pages/Dag/Overview/Overview.tsx
+++ b/airflow/ui/src/pages/Dag/Overview/Overview.tsx
@@ -38,8 +38,8 @@ export const Overview = () => {
   const { data: failedTasks, isLoading } = 
useTaskInstanceServiceGetTaskInstances({
     dagId: dagId ?? "",
     dagRunId: "~",
-    logicalDateGte: startDate,
-    logicalDateLte: endDate,
+    runAfterGte: startDate,
+    runAfterLte: endDate,
     state: ["failed"],
   });
 
diff --git a/airflow/ui/src/pages/Dag/Tasks/TaskCard.tsx 
b/airflow/ui/src/pages/Dag/Tasks/TaskCard.tsx
index e49f563eef5..1efb1513193 100644
--- a/airflow/ui/src/pages/Dag/Tasks/TaskCard.tsx
+++ b/airflow/ui/src/pages/Dag/Tasks/TaskCard.tsx
@@ -42,7 +42,7 @@ export const TaskCard = ({ dagId, task }: Props) => {
       dagId,
       dagRunId: "~",
       limit: 14,
-      orderBy: "-logical_date",
+      orderBy: "-run_after",
       taskId: task.task_id ?? "",
     },
     undefined,
diff --git a/airflow/ui/src/pages/Task/Overview/Overview.tsx 
b/airflow/ui/src/pages/Task/Overview/Overview.tsx
index 09f86f569bc..4e4f36d8816 100644
--- a/airflow/ui/src/pages/Task/Overview/Overview.tsx
+++ b/airflow/ui/src/pages/Task/Overview/Overview.tsx
@@ -40,8 +40,8 @@ export const Overview = () => {
       dagId,
       dagRunId: "~",
       limit: 14,
-      logicalDateGte: startDate,
-      logicalDateLte: endDate,
+      runAfterGte: startDate,
+      runAfterLte: endDate,
       state: ["failed"],
       taskId,
     });
@@ -50,7 +50,7 @@ export const Overview = () => {
     dagId,
     dagRunId: "~",
     limit: 14,
-    orderBy: "-logical_date",
+    orderBy: "-run_after",
     taskId,
   });
 
diff --git a/airflow/ui/src/pages/TaskInstances.tsx 
b/airflow/ui/src/pages/TaskInstances.tsx
index 2e67334f730..76a43dd4e2d 100644
--- a/airflow/ui/src/pages/TaskInstances.tsx
+++ b/airflow/ui/src/pages/TaskInstances.tsx
@@ -62,16 +62,15 @@ const taskInstanceColumns = (
     ? []
     : [
         {
-          accessorKey: "run_id",
+          accessorKey: "run_after",
           cell: ({ row: { original } }: TaskInstanceRow) => (
             <Link asChild color="fg.info" fontWeight="bold">
               <RouterLink 
to={`/dags/${original.dag_id}/runs/${original.dag_run_id}`}>
-                {original.dag_run_id}
+                <Time datetime={original.run_after} />
               </RouterLink>
             </Link>
           ),
-          enableSorting: false,
-          header: "Run ID",
+          header: "Dag Run",
         },
       ]),
   ...(Boolean(taskId)
diff --git a/scripts/ci/pre_commit/check_ti_vs_tis_attributes.py 
b/scripts/ci/pre_commit/check_ti_vs_tis_attributes.py
index c8cb358960f..b7d42b7322e 100755
--- a/scripts/ci/pre_commit/check_ti_vs_tis_attributes.py
+++ b/scripts/ci/pre_commit/check_ti_vs_tis_attributes.py
@@ -43,6 +43,7 @@ def compare_attributes(path1, path2):
         get_class_attributes(path2, "TaskInstanceHistory")
     )
     diff = diff - {
+        "run_after",
         "_logger_name",
         "_task_display_property_value",
         "task_instance_note",
diff --git a/tests/api_fastapi/core_api/routes/public/test_task_instances.py 
b/tests/api_fastapi/core_api/routes/public/test_task_instances.py
index cae77d3dd24..a28565d451d 100644
--- a/tests/api_fastapi/core_api/routes/public/test_task_instances.py
+++ b/tests/api_fastapi/core_api/routes/public/test_task_instances.py
@@ -201,6 +201,7 @@ class TestGetTaskInstance(TestTaskInstanceEndpoint):
             "dag_run_id": "TEST_DAG_RUN_ID",
             "rendered_fields": {},
             "rendered_map_index": None,
+            "run_after": "2020-01-01T00:00:00Z",
             "trigger": None,
             "triggerer_job": None,
         }
@@ -249,6 +250,7 @@ class TestGetTaskInstance(TestTaskInstanceEndpoint):
             "note": None,
             "rendered_map_index": None,
             "rendered_fields": {},
+            "run_after": mock.ANY,
             "trigger": None,
             "triggerer_job": None,
             "dag_version": {
@@ -316,6 +318,7 @@ class TestGetTaskInstance(TestTaskInstanceEndpoint):
             "try_number": 0,
             "unixname": getuser(),
             "dag_run_id": "TEST_DAG_RUN_ID",
+            "run_after": "2020-01-01T00:00:00Z",
             "rendered_fields": {},
             "rendered_map_index": None,
             "trigger": {
@@ -367,6 +370,7 @@ class TestGetTaskInstance(TestTaskInstanceEndpoint):
             "dag_run_id": "TEST_DAG_RUN_ID",
             "rendered_fields": {},
             "rendered_map_index": None,
+            "run_after": "2020-01-01T00:00:00Z",
             "trigger": None,
             "triggerer_job": None,
         }
@@ -412,6 +416,7 @@ class TestGetTaskInstance(TestTaskInstanceEndpoint):
             "dag_run_id": "TEST_DAG_RUN_ID",
             "rendered_fields": {"op_args": "()", "op_kwargs": {}, 
"templates_dict": None},
             "rendered_map_index": None,
+            "run_after": "2020-01-01T00:00:00Z",
             "trigger": None,
             "triggerer_job": None,
         }
@@ -514,6 +519,7 @@ class TestGetMappedTaskInstance(TestTaskInstanceEndpoint):
                 "dag_run_id": "TEST_DAG_RUN_ID",
                 "rendered_fields": {"op_args": "()", "op_kwargs": {}, 
"templates_dict": None},
                 "rendered_map_index": None,
+                "run_after": "2020-01-01T00:00:00Z",
                 "trigger": None,
                 "triggerer_job": None,
             }
@@ -2304,6 +2310,7 @@ class 
TestPostClearTaskInstances(TestTaskInstanceEndpoint):
                 "scheduled_when": None,
                 "rendered_fields": {},
                 "rendered_map_index": None,
+                "run_after": "2020-01-01T00:00:00Z",
                 "start_date": "2020-01-02T00:00:00Z",
                 "state": "restarting",
                 "task_display_name": "print_the_context",
@@ -2943,6 +2950,7 @@ class TestPatchTaskInstance(TestTaskInstanceEndpoint):
             "unixname": getuser(),
             "rendered_fields": {},
             "rendered_map_index": None,
+            "run_after": "2020-01-01T00:00:00Z",
             "trigger": None,
             "triggerer_job": None,
         }
@@ -3139,6 +3147,7 @@ class TestPatchTaskInstance(TestTaskInstanceEndpoint):
                     "unixname": getuser(),
                     "rendered_fields": {},
                     "rendered_map_index": None,
+                    "run_after": "2020-01-01T00:00:00Z",
                     "trigger": None,
                     "triggerer_job": None,
                 },
@@ -3240,6 +3249,7 @@ class TestPatchTaskInstance(TestTaskInstanceEndpoint):
             "dag_run_id": self.RUN_ID,
             "rendered_fields": {},
             "rendered_map_index": None,
+            "run_after": "2020-01-01T00:00:00Z",
             "trigger": None,
             "triggerer_job": None,
         }
@@ -3282,6 +3292,7 @@ class TestPatchTaskInstance(TestTaskInstanceEndpoint):
             "dag_run_id": self.RUN_ID,
             "rendered_fields": {},
             "rendered_map_index": None,
+            "run_after": "2020-01-01T00:00:00Z",
             "trigger": None,
             "triggerer_job": None,
         }
@@ -3338,6 +3349,7 @@ class TestPatchTaskInstance(TestTaskInstanceEndpoint):
                 "dag_run_id": self.RUN_ID,
                 "rendered_fields": {"op_args": "()", "op_kwargs": {}, 
"templates_dict": None},
                 "rendered_map_index": None,
+                "run_after": "2020-01-01T00:00:00Z",
                 "trigger": None,
                 "triggerer_job": None,
             }
@@ -3437,6 +3449,7 @@ class 
TestPatchTaskInstanceDryRun(TestTaskInstanceEndpoint):
                     "unixname": getuser(),
                     "rendered_fields": {},
                     "rendered_map_index": None,
+                    "run_after": "2020-01-01T00:00:00Z",
                     "trigger": None,
                     "triggerer_job": None,
                 }
@@ -3660,6 +3673,7 @@ class 
TestPatchTaskInstanceDryRun(TestTaskInstanceEndpoint):
                             "unixname": getuser(),
                             "rendered_fields": {},
                             "rendered_map_index": None,
+                            "run_after": "2020-01-01T00:00:00Z",
                             "trigger": None,
                             "triggerer_job": None,
                         }

Reply via email to