diff --git a/superset-frontend/packages/superset-ui-core/src/query/types/Operator.ts b/superset-frontend/packages/superset-ui-core/src/query/types/Operator.ts index 5b598312c0bce..0d2cb5b59ba7f 100644 --- a/superset-frontend/packages/superset-ui-core/src/query/types/Operator.ts +++ b/superset-frontend/packages/superset-ui-core/src/query/types/Operator.ts @@ -30,6 +30,7 @@ const BINARY_OPERATORS = [ '<=', 'ILIKE', 'LIKE', + 'NOT LIKE', 'REGEX', 'TEMPORAL_RANGE', ] as const; diff --git a/superset/models/helpers.py b/superset/models/helpers.py index b841426ff7172..1c6ad2f5d3bb0 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -1909,6 +1909,11 @@ def get_sqla_query( # pylint: disable=too-many-arguments,too-many-locals,too-ma where_clause_and.append(sqla_col.like(eq)) else: where_clause_and.append(sqla_col.ilike(eq)) + elif op in {utils.FilterOperator.NOT_LIKE.value}: + if target_generic_type != GenericDataType.STRING: + sqla_col = sa.cast(sqla_col, sa.String) + + where_clause_and.append(sqla_col.not_like(eq)) elif ( op == utils.FilterOperator.TEMPORAL_RANGE.value and isinstance(eq, str) diff --git a/superset/utils/core.py b/superset/utils/core.py index ee5e451f3eb76..d01dd517efbac 100644 --- a/superset/utils/core.py +++ b/superset/utils/core.py @@ -217,6 +217,7 @@ class FilterOperator(StrEnum): GREATER_THAN_OR_EQUALS = ">=" LESS_THAN_OR_EQUALS = "<=" LIKE = "LIKE" + NOT_LIKE = "NOT LIKE" ILIKE = "ILIKE" IS_NULL = "IS NULL" IS_NOT_NULL = "IS NOT NULL"