From 6e9bde79b9d3628e58cc281ffee8a0b60e9025c7 Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Wed, 13 Apr 2016 17:28:12 -0700 Subject: [PATCH 1/2] Supporting Druid'd time origin feature --- caravel/forms.py | 14 ++++++++++++-- caravel/models.py | 5 +++++ caravel/viz.py | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/caravel/forms.py b/caravel/forms.py index ec8d65d1074c6..106c3c72175a7 100644 --- a/caravel/forms.py +++ b/caravel/forms.py @@ -212,6 +212,14 @@ def __init__(self, viz): 'Y', choices=self.choicify(datasource.column_names), description="Columns to display"), + 'druid_time_origin': SelectField( + 'Origin', + choices=( + ('now', 'now'), + ('2016-04-10', 'even'), + ('2016-04-11', 'monday'), + ), + description="Defines the anchor where time buckets start"), 'granularity': FreeFormSelectField( 'Time Granularity', default="one day", choices=self.choicify([ @@ -224,6 +232,7 @@ def __init__(self, viz): '6 hour', '1 day', '7 days', + # you could add a special string here ]), description=( "The time granularity for the visualization. Note that you " @@ -615,9 +624,10 @@ def add_to_form(attrs): time_fields = 'granularity_sqla' add_to_form((time_fields, )) else: - time_fields = 'granularity' - add_to_form(('granularity',)) + time_fields = ('granularity', 'druid_time_origin') + add_to_form(('granularity', 'druid_time_origin')) field_css_classes['granularity'] = ['form-control', 'select2_freeform'] + field_css_classes['druid_time_origin'] = ['form-control', 'select2'] add_to_form(('since', 'until')) QueryForm.fieldsets = ({ diff --git a/caravel/models.py b/caravel/models.py index 0fce58e6e0b7b..12080ad7aa5b5 100644 --- a/caravel/models.py +++ b/caravel/models.py @@ -1008,6 +1008,11 @@ def query( granularity).total_seconds() * 1000 if not isinstance(granularity, string_types): granularity = {"type": "duration", "duration": granularity} + origin = extras.get('druid_time_origin') + if origin == 'now': + granularity['origin'] = datetime.now().isoformat() + elif origin: + granularity['origin'] = origin qry = dict( datasource=self.datasource_name, diff --git a/caravel/viz.py b/caravel/viz.py index 79548446ed5d1..9d5f56fc4fbaf 100644 --- a/caravel/viz.py +++ b/caravel/viz.py @@ -206,6 +206,7 @@ def query_obj(self): 'where': form_data.get("where", ''), 'having': form_data.get("having", ''), 'time_grain_sqla': form_data.get("time_grain_sqla", ''), + 'druid_time_origin': form_data.get("druid_time_origin", ''), } d = { 'granularity': granularity, From bb8923f622824741d86f47492fd4fb3dc7be5d25 Mon Sep 17 00:00:00 2001 From: "maxime.beauchemin@airbnb.com" Date: Fri, 15 Apr 2016 21:43:13 +0000 Subject: [PATCH 2/2] Adding origin to form, making it free form --- caravel/forms.py | 10 +++++----- caravel/models.py | 7 +++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/caravel/forms.py b/caravel/forms.py index 106c3c72175a7..799d4e404de84 100644 --- a/caravel/forms.py +++ b/caravel/forms.py @@ -215,11 +215,12 @@ def __init__(self, viz): 'druid_time_origin': SelectField( 'Origin', choices=( + ('', 'default'), ('now', 'now'), - ('2016-04-10', 'even'), - ('2016-04-11', 'monday'), ), - description="Defines the anchor where time buckets start"), + description=( + "Defines the origin where time buckets start, " + "accepts natural dates as in 'now', 'sunday' or '1970-01-01'")), 'granularity': FreeFormSelectField( 'Time Granularity', default="one day", choices=self.choicify([ @@ -232,7 +233,6 @@ def __init__(self, viz): '6 hour', '1 day', '7 days', - # you could add a special string here ]), description=( "The time granularity for the visualization. Note that you " @@ -627,7 +627,7 @@ def add_to_form(attrs): time_fields = ('granularity', 'druid_time_origin') add_to_form(('granularity', 'druid_time_origin')) field_css_classes['granularity'] = ['form-control', 'select2_freeform'] - field_css_classes['druid_time_origin'] = ['form-control', 'select2'] + field_css_classes['druid_time_origin'] = ['form-control', 'select2_freeform'] add_to_form(('since', 'until')) QueryForm.fieldsets = ({ diff --git a/caravel/models.py b/caravel/models.py index 12080ad7aa5b5..9e80eb86bf0d7 100644 --- a/caravel/models.py +++ b/caravel/models.py @@ -1009,10 +1009,9 @@ def query( if not isinstance(granularity, string_types): granularity = {"type": "duration", "duration": granularity} origin = extras.get('druid_time_origin') - if origin == 'now': - granularity['origin'] = datetime.now().isoformat() - elif origin: - granularity['origin'] = origin + if origin: + dttm = utils.parse_human_datetime(origin) + granularity['origin'] = dttm.isoformat() qry = dict( datasource=self.datasource_name,