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

bbovenzi 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 eba12409a7 Add support to search by dag_display_name. (#39008)
eba12409a7 is described below

commit eba12409a7148a0a4a432a3cddc29c0e15be4a22
Author: Karthikeyan Singaravelan <[email protected]>
AuthorDate: Wed Apr 24 00:09:29 2024 +0530

    Add support to search by dag_display_name. (#39008)
    
    * Add support to search by dag_display_name.
    
    * Return None as dag_display_name for owners and add test.
---
 airflow/www/static/js/dags.js     |  3 +++
 airflow/www/views.py              | 16 ++++++++++++++--
 tests/www/views/test_views_acl.py | 24 ++++++++++++++++++------
 3 files changed, 35 insertions(+), 8 deletions(-)

diff --git a/airflow/www/static/js/dags.js b/airflow/www/static/js/dags.js
index 6c20a1681b..acd5159226 100644
--- a/airflow/www/static/js/dags.js
+++ b/airflow/www/static/js/dags.js
@@ -126,6 +126,9 @@ $(".typeahead").typeahead({
       success: callback,
     });
   },
+  displayText(value) {
+    return value.dag_display_name || value.name;
+  },
   autoSelect: false,
   afterSelect(value) {
     const query = new URLSearchParams(window.location.search);
diff --git a/airflow/www/views.py b/airflow/www/views.py
index 328312658b..486b404f57 100644
--- a/airflow/www/views.py
+++ b/airflow/www/views.py
@@ -71,7 +71,7 @@ from jinja2.utils import htmlsafe_json_dumps, pformat  # 
type: ignore
 from markupsafe import Markup, escape
 from pendulum.datetime import DateTime
 from pendulum.parsing.exceptions import ParserError
-from sqlalchemy import and_, case, desc, func, inspect, select, union_all
+from sqlalchemy import and_, case, desc, func, inspect, or_, select, union_all
 from sqlalchemy.exc import IntegrityError
 from sqlalchemy.orm import joinedload
 from wtforms import BooleanField, validators
@@ -791,6 +791,9 @@ class Airflow(AirflowBaseView):
                 escaped_arg_search_query = arg_search_query.replace("_", r"\_")
                 dags_query = dags_query.where(
                     DagModel.dag_id.ilike("%" + escaped_arg_search_query + 
"%", escape="\\")
+                    | DagModel._dag_display_property_value.ilike(
+                        "%" + escaped_arg_search_query + "%", escape="\\"
+                    )
                     | DagModel.owners.ilike("%" + escaped_arg_search_query + 
"%", escape="\\")
                 )
 
@@ -5422,12 +5425,21 @@ class AutocompleteView(AirflowBaseView):
         dag_ids_query = select(
             sqla.literal("dag").label("type"),
             DagModel.dag_id.label("name"),
-        ).where(~DagModel.is_subdag, DagModel.is_active, 
DagModel.dag_id.ilike(f"%{query}%"))
+            DagModel._dag_display_property_value.label("dag_display_name"),
+        ).where(
+            ~DagModel.is_subdag,
+            DagModel.is_active,
+            or_(
+                DagModel.dag_id.ilike(f"%{query}%"),
+                DagModel._dag_display_property_value.ilike(f"%{query}%"),
+            ),
+        )
 
         owners_query = (
             select(
                 sqla.literal("owner").label("type"),
                 DagModel.owners.label("name"),
+                sqla.literal(None).label("dag_display_name"),
             )
             .distinct()
             .where(~DagModel.is_subdag, DagModel.is_active, 
DagModel.owners.ilike(f"%{query}%"))
diff --git a/tests/www/views/test_views_acl.py 
b/tests/www/views/test_views_acl.py
index ead809e081..51bf56adac 100644
--- a/tests/www/views/test_views_acl.py
+++ b/tests/www/views/test_views_acl.py
@@ -253,12 +253,16 @@ def test_dag_autocomplete_success(client_all_dags):
         follow_redirects=False,
     )
     expected = [
-        {"name": "airflow", "type": "owner"},
-        {"name": "example_dynamic_task_mapping_with_no_taskflow_operators", 
"type": "dag"},
-        {"name": "example_setup_teardown_taskflow", "type": "dag"},
-        {"name": "test_mapped_taskflow", "type": "dag"},
-        {"name": "tutorial_taskflow_api", "type": "dag"},
-        {"name": "tutorial_taskflow_api_virtualenv", "type": "dag"},
+        {"name": "airflow", "type": "owner", "dag_display_name": None},
+        {
+            "name": "example_dynamic_task_mapping_with_no_taskflow_operators",
+            "type": "dag",
+            "dag_display_name": None,
+        },
+        {"name": "example_setup_teardown_taskflow", "type": "dag", 
"dag_display_name": None},
+        {"name": "test_mapped_taskflow", "type": "dag", "dag_display_name": 
None},
+        {"name": "tutorial_taskflow_api", "type": "dag", "dag_display_name": 
None},
+        {"name": "tutorial_taskflow_api_virtualenv", "type": "dag", 
"dag_display_name": None},
     ]
 
     assert resp.json == expected
@@ -281,6 +285,14 @@ def test_dag_autocomplete_empty(client_all_dags, query, 
expected):
     assert resp.json == expected
 
 
+def test_dag_autocomplete_dag_display_name(client_all_dags):
+    url = "dagmodel/autocomplete?query=Sample"
+    resp = client_all_dags.get(url, follow_redirects=False)
+    assert resp.json == [
+        {"name": "example_display_name", "type": "dag", "dag_display_name": 
"Sample DAG with Display Name"}
+    ]
+
+
 @pytest.fixture
 def setup_paused_dag():
     """Pause a DAG so we can test filtering."""

Reply via email to