From d11e04b4d93b2063161e63c1ceef5d299557dabc Mon Sep 17 00:00:00 2001 From: suraj-mandal Date: Thu, 24 Apr 2025 21:33:08 +0530 Subject: [PATCH 1/7] Fixes ##33206 --- superset/connectors/sqla/models.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index d74b2ef5c0a3..b8edf2e47ea3 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -528,6 +528,13 @@ def filter_values_handler( # pylint: disable=too-many-arguments # noqa: C901 def handle_single_value(value: FilterValue | None) -> FilterValue | None: if operator == utils.FilterOperator.TEMPORAL_RANGE: return value + + if ( + isinstance(value, (float, int)) + and target_generic_type == utils.GenericDataType.NUMERIC + ): + value = float(value) + if ( isinstance(value, (float, int)) and target_generic_type == utils.GenericDataType.TEMPORAL @@ -553,7 +560,11 @@ def handle_single_value(value: FilterValue | None) -> FilterValue | None: ): # For backwards compatibility and edge cases # where a column data type might have changed - return utils.cast_to_num(value) + try: + return utils.cast_to_num(float(value)) + except ValueError: + logger.error(f"Unable to cast value {value} to num") + return utils.cast_to_num(value) if value == NULL_STRING: return None if value == EMPTY_STRING: From 7ec5eaedb9fae6ccbbf7cf4a846a86f9af51ad1c Mon Sep 17 00:00:00 2001 From: suraj-mandal Date: Thu, 24 Apr 2025 21:46:41 +0530 Subject: [PATCH 2/7] Improved code quality. --- superset/connectors/sqla/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index b8edf2e47ea3..dc6649aade88 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -561,10 +561,11 @@ def handle_single_value(value: FilterValue | None) -> FilterValue | None: # For backwards compatibility and edge cases # where a column data type might have changed try: - return utils.cast_to_num(float(value)) + value = float(value) except ValueError: logger.error(f"Unable to cast value {value} to num") - return utils.cast_to_num(value) + + return utils.cast_to_num(value) if value == NULL_STRING: return None if value == EMPTY_STRING: From 3e65daa8712f99c19a379ca3a2ae6b230384e2c0 Mon Sep 17 00:00:00 2001 From: suraj-mandal Date: Thu, 24 Apr 2025 22:17:16 +0530 Subject: [PATCH 3/7] Added fix for `ExplorerMixin` class present in superset/models. --- superset/models/helpers.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/superset/models/helpers.py b/superset/models/helpers.py index 5dc97b602af2..302bf0f2bb64 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -1162,6 +1162,12 @@ def filter_values_handler( # pylint: disable=too-many-arguments # noqa: C901 def handle_single_value(value: Optional[FilterValue]) -> Optional[FilterValue]: if operator == utils.FilterOperator.TEMPORAL_RANGE: return value + + if ( + isinstance(value, (float, int)) + and target_generic_type == utils.GenericDataType.NUMERIC + ): + value = float(value) if ( isinstance(value, (float, int)) and target_generic_type == utils.GenericDataType.TEMPORAL @@ -1185,6 +1191,11 @@ def handle_single_value(value: Optional[FilterValue]) -> Optional[FilterValue]: utils.FilterOperator.LIKE, } ): + try: + value = float(value) + except ValueError: + logger.error(f"Unable to cast value {value} to num") + # For backwards compatibility and edge cases # where a column data type might have changed return utils.cast_to_num(value) From fe732b4422d9a8d4809a5a153608c38bce77164a Mon Sep 17 00:00:00 2001 From: suraj-mandal Date: Thu, 24 Apr 2025 22:46:02 +0530 Subject: [PATCH 4/7] Made changes as per AI Bot --- superset/connectors/sqla/models.py | 7 +------ superset/models/helpers.py | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index dc6649aade88..5d5e9c43422b 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -560,12 +560,7 @@ def handle_single_value(value: FilterValue | None) -> FilterValue | None: ): # For backwards compatibility and edge cases # where a column data type might have changed - try: - value = float(value) - except ValueError: - logger.error(f"Unable to cast value {value} to num") - - return utils.cast_to_num(value) + return utils.cast_to_num(float(value)) if value == NULL_STRING: return None if value == EMPTY_STRING: diff --git a/superset/models/helpers.py b/superset/models/helpers.py index 302bf0f2bb64..3d0a9bf81ca6 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -1191,14 +1191,9 @@ def handle_single_value(value: Optional[FilterValue]) -> Optional[FilterValue]: utils.FilterOperator.LIKE, } ): - try: - value = float(value) - except ValueError: - logger.error(f"Unable to cast value {value} to num") - # For backwards compatibility and edge cases # where a column data type might have changed - return utils.cast_to_num(value) + return utils.cast_to_num(float(value)) if value == NULL_STRING: return None if value == EMPTY_STRING: From 2300340cb8b98d5fc76ea34c1cd8c8ab864731bd Mon Sep 17 00:00:00 2001 From: suraj-mandal Date: Thu, 24 Apr 2025 23:21:01 +0530 Subject: [PATCH 5/7] Fixed test for sqla_models integration tests --- tests/integration_tests/sqla_models_tests.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/integration_tests/sqla_models_tests.py b/tests/integration_tests/sqla_models_tests.py index 80ada22e0aac..27b213b207bd 100644 --- a/tests/integration_tests/sqla_models_tests.py +++ b/tests/integration_tests/sqla_models_tests.py @@ -295,8 +295,10 @@ def test_where_operators(self): FilterTestCase("num", FilterOperator.LESS_THAN_OR_EQUALS, 0, "<= 0"), FilterTestCase("num", FilterOperator.EQUALS, 0, "= 0"), FilterTestCase("num", FilterOperator.NOT_EQUALS, 0, "!= 0"), - FilterTestCase("num", FilterOperator.IN, ["1", "2"], "IN (1, 2)"), - FilterTestCase("num", FilterOperator.NOT_IN, ["1", "2"], "NOT IN (1, 2)"), + FilterTestCase("num", FilterOperator.IN, ["1", "2"], "IN (1.0, 2.0)"), + FilterTestCase( + "num", FilterOperator.NOT_IN, ["1", "2"], "NOT IN (1.0, 2.0)" + ), FilterTestCase( "ds", FilterOperator.TEMPORAL_RANGE, "2020 : 2021", "2020-01-01" ), From 77f965a4dc91090e80fdb808dd14a1d23f8287c9 Mon Sep 17 00:00:00 2001 From: suraj-mandal Date: Tue, 29 Apr 2025 21:23:37 +0530 Subject: [PATCH 6/7] Fixed test for sqlite, postgres and mysql databases. --- superset/connectors/sqla/models.py | 6 +++++- superset/models/helpers.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 5d5e9c43422b..52ead2b110e1 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -560,7 +560,11 @@ def handle_single_value(value: FilterValue | None) -> FilterValue | None: ): # For backwards compatibility and edge cases # where a column data type might have changed - return utils.cast_to_num(float(value)) + try: + value = float(value) + except ValueError: + logger.info(f"Unable to convert {value} to float") + return utils.cast_to_num(value) if value == NULL_STRING: return None if value == EMPTY_STRING: diff --git a/superset/models/helpers.py b/superset/models/helpers.py index 3d0a9bf81ca6..d3d67712c56d 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -1193,7 +1193,11 @@ def handle_single_value(value: Optional[FilterValue]) -> Optional[FilterValue]: ): # For backwards compatibility and edge cases # where a column data type might have changed - return utils.cast_to_num(float(value)) + try: + value = float(value) + except ValueError: + logger.warning(f"Unable to convert {value} to number") + return utils.cast_to_num(value) if value == NULL_STRING: return None if value == EMPTY_STRING: From 7627303c00c95bf132ea6766249045724a73ef1e Mon Sep 17 00:00:00 2001 From: suraj-mandal Date: Tue, 29 Apr 2025 21:25:18 +0530 Subject: [PATCH 7/7] Changed logging status. --- superset/connectors/sqla/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 52ead2b110e1..b2646bf5decc 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -563,7 +563,7 @@ def handle_single_value(value: FilterValue | None) -> FilterValue | None: try: value = float(value) except ValueError: - logger.info(f"Unable to convert {value} to float") + logger.warning(f"Unable to convert {value} to float") return utils.cast_to_num(value) if value == NULL_STRING: return None