diff --git a/models/x_analysis.py b/models/x_analysis.py index d785f49..14e0509 100644 --- a/models/x_analysis.py +++ b/models/x_analysis.py @@ -25,11 +25,12 @@ class XAnalysis: self.events = [] self.global_filters = [] + self.account_filters = [] def _get_global_filters(self): return self.event_view.get('filts') or [] - async def init(self,*args, **kwargs): + async def init(self, *args, **kwargs): if self.data_in.report_id: db = get_database() report = await crud.report.get(db, id=self.data_in.report_id) @@ -54,11 +55,11 @@ class XAnalysis: self.global_filters = self._get_global_filters() # 用户自带过滤 if 'data_where' in kwargs: - self.global_filters.extend(kwargs['data_where'].get(self.game, [])) + self.account_filters = kwargs['data_where'].get(self.game, []) - def handler_filts(self): + def handler_filts(self, filters): where = [] - for item in self.global_filters: + for item in filters: col = sa.Column(item['columnName']) @@ -121,20 +122,27 @@ class XAnalysis: sql = str(qry.compile(compile_kwargs={"literal_binds": True})) where_str = sql.split('WHERE ')[1] - where_order = self.handler_filts() + where_order = self.handler_filts(self.global_filters) where_order_str = 1 if where_order: qry = sa.select().where(*where_order) sql = str(qry.compile(compile_kwargs={"literal_binds": True})) where_order_str = sql.split('WHERE ')[1] + where_account = self.handler_filts(self.account_filters) + where_account_str = 1 + if where_account: + qry = sa.select().where(*where_account) + sql = str(qry.compile(compile_kwargs={"literal_binds": True})) + where_account_str = sql.split('WHERE ')[1] + sql = f"""SELECT toString(reg.date) as date, cnt1, {select_ltv_str} FROM (SELECT toDate(addHours(`#event_time`, `#zone_offset`)) as date, uniqExact(`{quota}`) cnt1 FROM {self.game}.event where `#event_name` = 'create_account' - AND {where_str} + AND {where_str} AND {where_account_str} GROUP BY toDate(addHours(`#event_time`, `#zone_offset`))) as reg left join (select a.date, @@ -142,16 +150,16 @@ class XAnalysis: from (SELECT toDate(addHours(`#event_time`, `#zone_offset`)) as date, `{quota}` FROM {self.game}.event where `#event_name` = 'create_account' - and {where_str}) as a + AND {where_str} AND {where_account_str} ) as a left join (select `{quota}`, unitPrice/100 as money, toDate(addHours(`#event_time`, `#zone_offset`)) as date from {self.game}.event - where `#event_name` = 'pay' and {where_order_str}) b + where `#event_name` = 'pay' and {where_order_str} AND {where_account_str}) b on a.`{quota}` = b.`{quota}` group by a.date) log on reg.date = log.date order by date """ print(sql) - return {'sql': sql,'quota':quota, + return {'sql': sql, 'quota': quota, 'start_date': self.event_view['startTime'][:10], 'end_date': self.event_view['endTime'][:10], }