From c74bb6cb9b240b43198165709ee8043c527aae97 Mon Sep 17 00:00:00 2001 From: John Bodley <4567245+john-bodley@users.noreply.github.com> Date: Tue, 3 Dec 2019 17:44:04 -0800 Subject: [PATCH] [fix] Updating bound filters for PyDruid 0.5.7 (#8742) --- requirements-dev.txt | 2 +- superset/connectors/druid/models.py | 26 +++++++++++++------------- tests/druid_func_tests.py | 5 ++++- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 9a53de6111..6478ae8936 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -26,7 +26,7 @@ pip-tools==3.7.0 pre-commit==1.17.0 psycopg2-binary==2.7.5 pycodestyle==2.5.0 -pydruid==0.5.6 +pydruid==0.5.7 pyhive==0.6.1 pylint==1.9.2 redis==3.2.1 diff --git a/superset/connectors/druid/models.py b/superset/connectors/druid/models.py index ea617c8cb4..b42d66e3ea 100644 --- a/superset/connectors/druid/models.py +++ b/superset/connectors/druid/models.py @@ -64,7 +64,7 @@ try: RegexExtraction, RegisteredLookupExtraction, ) - from pydruid.utils.filters import Dimension, Filter + from pydruid.utils.filters import Bound, Dimension, Filter from pydruid.utils.having import Aggregation, Having from pydruid.utils.postaggregator import ( Const, @@ -1519,48 +1519,44 @@ class DruidDatasource(Model, BaseDatasource): # For the ops below, could have used pydruid's Bound, # but it doesn't support extraction functions elif op == ">=": - cond = Filter( - type="bound", + cond = Bound( extraction_function=extraction_fn, dimension=col, lowerStrict=False, upperStrict=False, lower=eq, upper=None, - alphaNumeric=is_numeric_col, + ordering=cls._get_ordering(is_numeric_col), ) elif op == "<=": - cond = Filter( - type="bound", + cond = Bound( extraction_function=extraction_fn, dimension=col, lowerStrict=False, upperStrict=False, lower=None, upper=eq, - alphaNumeric=is_numeric_col, + ordering=cls._get_ordering(is_numeric_col), ) elif op == ">": - cond = Filter( - type="bound", + cond = Bound( extraction_function=extraction_fn, lowerStrict=True, upperStrict=False, dimension=col, lower=eq, upper=None, - alphaNumeric=is_numeric_col, + ordering=cls._get_ordering(is_numeric_col), ) elif op == "<": - cond = Filter( - type="bound", + cond = Bound( extraction_function=extraction_fn, upperStrict=True, lowerStrict=False, dimension=col, lower=None, upper=eq, - alphaNumeric=is_numeric_col, + ordering=cls._get_ordering(is_numeric_col), ) elif op == "IS NULL": cond = Filter(dimension=col, value="") @@ -1574,6 +1570,10 @@ class DruidDatasource(Model, BaseDatasource): return filters + @staticmethod + def _get_ordering(is_numeric_col: bool) -> str: + return "numeric" if is_numeric_col else "lexicographic" + def _get_having_obj(self, col: str, op: str, eq: str) -> "Having": cond = None if op == "==": diff --git a/tests/druid_func_tests.py b/tests/druid_func_tests.py index f70b13e922..c13a652975 100644 --- a/tests/druid_func_tests.py +++ b/tests/druid_func_tests.py @@ -209,7 +209,7 @@ class DruidFuncTestCase(SupersetTestCase): self.assertFalse(res.filter["filter"]["lowerStrict"]) self.assertEqual("A", res.filter["filter"]["dimension"]) self.assertEqual("h", res.filter["filter"]["lower"]) - self.assertFalse(res.filter["filter"]["alphaNumeric"]) + self.assertEqual("lexicographic", res.filter["filter"]["ordering"]) filtr["op"] = ">" res = DruidDatasource.get_filters([filtr], [], column_dict) self.assertTrue(res.filter["filter"]["lowerStrict"]) @@ -220,6 +220,9 @@ class DruidFuncTestCase(SupersetTestCase): filtr["op"] = "<" res = DruidDatasource.get_filters([filtr], [], column_dict) self.assertTrue(res.filter["filter"]["upperStrict"]) + filtr["val"] = 1 + res = DruidDatasource.get_filters([filtr], ["A"], column_dict) + self.assertEqual("numeric", res.filter["filter"]["ordering"]) @unittest.skipUnless( SupersetTestCase.is_module_installed("pydruid"), "pydruid not installed"