diff --git a/requirements-dev.txt b/requirements-dev.txt index 9a53de611..6478ae893 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 ea617c8cb..b42d66e3e 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 f70b13e92..c13a65297 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"