[fix] Updating bound filters for PyDruid 0.5.7 (#8742)

This commit is contained in:
John Bodley 2019-12-03 17:44:04 -08:00 committed by GitHub
parent 38782e260a
commit c74bb6cb9b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 15 deletions

View File

@ -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

View File

@ -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 == "==":

View File

@ -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"