Lee-W commented on code in PR #46053:
URL: https://github.com/apache/airflow/pull/46053#discussion_r1940443941


##########
airflow/www/utils.py:
##########
@@ -779,6 +787,72 @@ class 
UtcAwareFilterConverter(fab_sqlafilters.SQLAFilterConverter):
     """Retrieve conversion tables for UTC-Aware filters."""
 
 
+class XComFilterStartsWith(fab_sqlafilters.FilterStartsWith):
+    """Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike(value + "%"))
+
+
+class XComFilterEndsWith(fab_sqlafilters.FilterEndsWith):
+    """Ends With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike("%" + value))
+
+
+class XComFilterEqual(fab_sqlafilters.FilterEqual):
+    """Equality filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        value = set_value_to_type(self.datamodel, self.column_name, value)
+        return query.filter(trimmed_value == value)
+
+
+class XComFilterContains(fab_sqlafilters.FilterContains):
+    """Not Equal To filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike("%" + value + "%"))

Review Comment:
   ```suggestion
           return query.filter(trimmed_value.ilike(f"%{value}%"))
   ```



##########
airflow/www/utils.py:
##########
@@ -779,6 +787,72 @@ class 
UtcAwareFilterConverter(fab_sqlafilters.SQLAFilterConverter):
     """Retrieve conversion tables for UTC-Aware filters."""
 
 
+class XComFilterStartsWith(fab_sqlafilters.FilterStartsWith):
+    """Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike(value + "%"))
+
+
+class XComFilterEndsWith(fab_sqlafilters.FilterEndsWith):
+    """Ends With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike("%" + value))
+
+
+class XComFilterEqual(fab_sqlafilters.FilterEqual):
+    """Equality filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        value = set_value_to_type(self.datamodel, self.column_name, value)
+        return query.filter(trimmed_value == value)
+
+
+class XComFilterContains(fab_sqlafilters.FilterContains):
+    """Not Equal To filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike("%" + value + "%"))
+
+
+class XComFilterNotStartsWith(fab_sqlafilters.FilterNotStartsWith):
+    """Not Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(~trimmed_value.ilike(value + "%"))

Review Comment:
   ```suggestion
           return query.filter(~trimmed_value.ilike(f"{value}%"))
   ```



##########
airflow/www/utils.py:
##########
@@ -779,6 +787,72 @@ class 
UtcAwareFilterConverter(fab_sqlafilters.SQLAFilterConverter):
     """Retrieve conversion tables for UTC-Aware filters."""
 
 
+class XComFilterStartsWith(fab_sqlafilters.FilterStartsWith):
+    """Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike(value + "%"))
+
+
+class XComFilterEndsWith(fab_sqlafilters.FilterEndsWith):
+    """Ends With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike("%" + value))

Review Comment:
   ```suggestion
           return query.filter(trimmed_value.ilike(f"%{value}"))
   ```



##########
airflow/www/utils.py:
##########
@@ -682,6 +684,12 @@ def get_attr_renderer():
     }
 
 
+def get_trimmed_field(query: Query, model: Model, column_name: str) -> 
tuple[Query, ColumnElement]:
+    query, field = get_field_setup_query(query, model, column_name)
+    trimmed_value = func.btrim(func.convert_from(field, "UTF8"), '"')
+    return query, trimmed_value

Review Comment:
   another idea I have is doing something like this
   
   ```suggestion
   def generate_filter_value_query(
       *,
       query: Query,
       model: Model,
       column_name: str,
       filter_cond: Callable[str, Query]
   ) -> Query
       query, field = get_field_setup_query(query, model, column_name)
       trimmed_value = func.btrim(func.convert_from(field, "UTF8"), '"')
       return query.filter(filter_cond(trimmed_value))
   ```
   
   



##########
airflow/www/utils.py:
##########
@@ -779,6 +787,72 @@ class 
UtcAwareFilterConverter(fab_sqlafilters.SQLAFilterConverter):
     """Retrieve conversion tables for UTC-Aware filters."""
 
 
+class XComFilterStartsWith(fab_sqlafilters.FilterStartsWith):
+    """Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike(value + "%"))

Review Comment:
   ```suggestion
           return query.filter(trimmed_value.ilike(f"{value}%"))
   ```



##########
airflow/www/utils.py:
##########
@@ -682,6 +684,12 @@ def get_attr_renderer():
     }
 
 
+def get_trimmed_field(query: Query, model: Model, column_name: str) -> 
tuple[Query, ColumnElement]:

Review Comment:
   `get_trimmed_field_setup_query` seems to be a more accurate name 🤔 
   ```suggestion
   def get_trimmed_field_setup_query(query: Query, model: Model, column_name: 
str) -> tuple[Query, ColumnElement]:
   ```



##########
airflow/www/utils.py:
##########
@@ -779,6 +787,72 @@ class 
UtcAwareFilterConverter(fab_sqlafilters.SQLAFilterConverter):
     """Retrieve conversion tables for UTC-Aware filters."""
 
 
+class XComFilterStartsWith(fab_sqlafilters.FilterStartsWith):
+    """Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike(value + "%"))
+
+
+class XComFilterEndsWith(fab_sqlafilters.FilterEndsWith):
+    """Ends With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike("%" + value))
+
+
+class XComFilterEqual(fab_sqlafilters.FilterEqual):
+    """Equality filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        value = set_value_to_type(self.datamodel, self.column_name, value)
+        return query.filter(trimmed_value == value)
+
+
+class XComFilterContains(fab_sqlafilters.FilterContains):
+    """Not Equal To filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike("%" + value + "%"))
+
+
+class XComFilterNotStartsWith(fab_sqlafilters.FilterNotStartsWith):
+    """Not Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(~trimmed_value.ilike(value + "%"))
+
+
+class XComFilterNotEndsWith(fab_sqlafilters.FilterNotEndsWith):
+    """Not Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(~trimmed_value.ilike("%" + value))

Review Comment:
   ```suggestion
           return query.filter(~trimmed_value.ilike(f"%{value}"))
   ```



##########
airflow/www/utils.py:
##########
@@ -864,6 +951,10 @@ def is_extendedjson(self, col_name):
             )
         return False
 
+    def is_xcom_value(self, col_name):

Review Comment:
   ```suggestion
       def is_xcom_value(self, col_name: str) -> bool:
   ```



##########
airflow/www/utils.py:
##########
@@ -779,6 +787,72 @@ class 
UtcAwareFilterConverter(fab_sqlafilters.SQLAFilterConverter):
     """Retrieve conversion tables for UTC-Aware filters."""
 
 
+class XComFilterStartsWith(fab_sqlafilters.FilterStartsWith):
+    """Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike(value + "%"))
+
+
+class XComFilterEndsWith(fab_sqlafilters.FilterEndsWith):
+    """Ends With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike("%" + value))
+
+
+class XComFilterEqual(fab_sqlafilters.FilterEqual):
+    """Equality filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        value = set_value_to_type(self.datamodel, self.column_name, value)
+        return query.filter(trimmed_value == value)
+
+
+class XComFilterContains(fab_sqlafilters.FilterContains):
+    """Not Equal To filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike("%" + value + "%"))
+
+
+class XComFilterNotStartsWith(fab_sqlafilters.FilterNotStartsWith):
+    """Not Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(~trimmed_value.ilike(value + "%"))
+
+
+class XComFilterNotEndsWith(fab_sqlafilters.FilterNotEndsWith):
+    """Not Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(~trimmed_value.ilike("%" + value))
+
+
+class XComFilterNotContains(fab_sqlafilters.FilterNotContains):
+    """Not Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(~trimmed_value.ilike("%" + value + "%"))

Review Comment:
   ```suggestion
           return query.filter(~trimmed_value.ilike(f"%{value}%"))
   ```



##########
airflow/www/utils.py:
##########
@@ -779,6 +787,72 @@ class 
UtcAwareFilterConverter(fab_sqlafilters.SQLAFilterConverter):
     """Retrieve conversion tables for UTC-Aware filters."""
 
 
+class XComFilterStartsWith(fab_sqlafilters.FilterStartsWith):
+    """Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike(value + "%"))
+
+
+class XComFilterEndsWith(fab_sqlafilters.FilterEndsWith):
+    """Ends With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike("%" + value))
+
+
+class XComFilterEqual(fab_sqlafilters.FilterEqual):
+    """Equality filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        value = set_value_to_type(self.datamodel, self.column_name, value)
+        return query.filter(trimmed_value == value)
+
+
+class XComFilterContains(fab_sqlafilters.FilterContains):
+    """Not Equal To filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike("%" + value + "%"))
+
+
+class XComFilterNotStartsWith(fab_sqlafilters.FilterNotStartsWith):
+    """Not Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(~trimmed_value.ilike(value + "%"))
+
+
+class XComFilterNotEndsWith(fab_sqlafilters.FilterNotEndsWith):
+    """Not Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(~trimmed_value.ilike("%" + value))
+
+
+class XComFilterNotContains(fab_sqlafilters.FilterNotContains):
+    """Not Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(~trimmed_value.ilike("%" + value + "%"))
+
+
+class XComFilterNotEqual(fab_sqlafilters.FilterNotEqual):
+    """Not Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        value = set_value_to_type(self.datamodel, self.column_name, value)
+        return query.filter(trimmed_value != value)

Review Comment:
   follow up of the "another idea" above
   
   ```suggestion
      def apply(self, query: Query, value: str) -> Query:
           value = set_value_to_type(self.datamodel, self.column_name, value)
           return generate_filter_value_query(
               query=query,
               model=self.model,
               column_name=self.column_name, 
               filter_cond=lambda trimmed_value: trimmed_value != value
           )
   ```



##########
airflow/www/utils.py:
##########
@@ -779,6 +787,72 @@ class 
UtcAwareFilterConverter(fab_sqlafilters.SQLAFilterConverter):
     """Retrieve conversion tables for UTC-Aware filters."""
 
 
+class XComFilterStartsWith(fab_sqlafilters.FilterStartsWith):
+    """Starts With filter for XCom values."""
+
+    def apply(self, query: Query, value: str) -> Query:
+        query, trimmed_value = get_trimmed_field(query, self.model, 
self.column_name)
+        return query.filter(trimmed_value.ilike(value + "%"))

Review Comment:
   follow up of the "another idea" above
   
   ```suggestion
       def apply(self, query: Query, value: str) -> Query:
           return generate_filter_value_query(
               query=query,
               model=self.model,
               column_name=self.column_name, 
               filter_cond=lambda trimmed_value: 
trimmed_value.ilike(f"%{value}")
           )
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to