diff --git a/api/api_v1/endpoints/query.py b/api/api_v1/endpoints/query.py index 04e1a3f..8e72a2a 100644 --- a/api/api_v1/endpoints/query.py +++ b/api/api_v1/endpoints/query.py @@ -64,7 +64,8 @@ async def event_model( 'groups': [], 'values': [], 'sum': [], - 'event_name': item['event_name'] + 'event_name': item['event_name'], + 'format': item['format'] } sql = item['sql'] groupby = item['groupby'] diff --git a/models/behavior_analysis.py b/models/behavior_analysis.py index 5081879..32601fd 100644 --- a/models/behavior_analysis.py +++ b/models/behavior_analysis.py @@ -198,7 +198,7 @@ class BehaviorAnalysis: 'unit_num': self.unit_num } - def custom_event(self, s): + def custom_event(self, s, format='float'): def f(m): if len(m) == 3: event_name, attr, comp = m @@ -211,24 +211,30 @@ class BehaviorAnalysis: return func.sum(getattr(func, 'if')(getattr(self.event_tbl.c, '#event_name') == event_name, 1, 0)) elif comp == 'touch_user_count': return func.uniqCombined(getattr(func, 'if')(getattr(self.event_tbl.c, '#event_name') == event_name, - getattr(self.event_tbl.c, 'binduid'), '')) + getattr(self.event_tbl.c, '#account_id'), '')) elif comp == 'touch_user_avg': return func.divide( func.sum(getattr(func, 'if')(getattr(self.event_tbl.c, '#event_name') == event_name, 1, 0)), func.uniqCombined(getattr(func, 'if')(getattr(self.event_tbl.c, '#event_name') == event_name, - getattr(self.event_tbl.c, 'binduid'), ''))) + getattr(self.event_tbl.c, '#account_id'), ''))) opt = ({'+', '-', '*', '/'} & set(s)).pop() a, b = s.split(opt) r1 = a.split('.') + n = 1 + decimal = 2 + if format == 'percent': + n = 100 + elif format == 'integer': + decimal = 0 if '.' in b: r2 = b.split('.') return {'event_name': [r1[0], r2[0]], - 'select': func.round(settings.ARITHMETIC[opt](f(r1), f(r2)), 2).label('values') + 'select': func.round(settings.ARITHMETIC[opt](f(r1) * n, f(r2)), decimal).label('values') } elif b.isdigit(): return {'event_name': [r1[0]], - 'select': func.round(settings.ARITHMETIC[opt](f(r1), int(b)), 2).label('values') + 'select': func.round(settings.ARITHMETIC[opt](f(r1) * n, int(b)), decimal).label('values') } def event_model_sql(self): @@ -245,9 +251,11 @@ class BehaviorAnalysis: func.addHours(event_time_col, self.zone_time) <= self.end_date, ] event_name_col = getattr(self.event_tbl.c, '#event_name') + format = event.get('format') or 'float' + if event.get('customEvent'): formula = event.get('customEvent') - custom = self.custom_event(formula) + custom = self.custom_event(formula, format) event_name = custom['event_name'] where = [event_name_col.in_(event_name)] event_filter, _ = self.handler_filts(*event['filts']) @@ -301,6 +309,7 @@ class BehaviorAnalysis: 'groupby': [i.key for i in self.groupby], 'date_range': self.date_range, 'event_name': event_name_display or event_name, + 'format': format }) return sqls