用户分析 报表筛选

This commit is contained in:
wuaho 2021-09-16 17:26:00 +08:00
parent e1ab6c5b6d
commit ec7e579d42
3 changed files with 104 additions and 35 deletions

View File

@ -783,6 +783,9 @@ async def user_property_model(
quota = res['quota']
groupby = res['groupby']
df = await ckdb.query_dataframe(sql)
if len(df) == 0:
return schemas.Msg(code=0, msg='查无数据', data=None)
# 没有分组
data = {'groupby': groupby}
title = []

View File

@ -33,6 +33,8 @@ class UserAnalysis:
self.time_particle = None
self.date_range = None
self.unit_num = None
self.global_relation = 'and'
self.ext_filters = (self.data_in.ext_filter.get('filts', []), self.data_in.ext_filter.get('relation', 'and'))
async def init(self, *args, **kwargs):
if self.data_in.report_id:
@ -50,11 +52,11 @@ class UserAnalysis:
self.time_particle = self._get_time_particle_size()
self.groupby = self._get_group_by()
self.unit_num = self._get_unit_num()
self.global_relation = self.event_view.get('relation', 'and')
# 用户自带过滤
if 'data_where' in kwargs:
self.global_filters.extend(kwargs['data_where'].get(self.game, []))
self.global_filters.extend(self.data_in.ext_filter)
async def _init_table(self):
"""
从redis中取出表字段构建表结构
@ -77,11 +79,66 @@ class UserAnalysis:
def _get_zone_time(self):
return int(self.event_view.get('zone_time', 8))
def _get_filters(self, filters):
tbl = self.user_tbl
where = []
for item in filters:
col = getattr(tbl.c, item['columnName'])
# def _get_filters(self, filters):
# tbl = self.user_tbl
# where = []
# for item in filters:
# col = getattr(tbl.c, item['columnName'])
#
# comparator = item['comparator']
# ftv = item['ftv']
# if comparator == '==':
# if len(ftv) > 1:
# where.append(or_(*[col == v for v in ftv]))
# else:
# where.append(col == ftv[0])
# elif comparator == '>=':
# where.append(col >= ftv[0])
# elif comparator == '<=':
# where.append(col <= ftv[0])
# elif comparator == '>':
# where.append(col > ftv[0])
# elif comparator == '<':
# where.append(col < ftv[0])
#
# elif comparator == 'is not null':
# where.append(col.isnot(None))
# elif comparator == 'is null':
# where.append(col.is_(None))
#
# elif comparator == '!=':
# where.append(col != ftv[0])
#
# elif comparator == 'like':
# where.append(col.like(f'%{ftv[0]}%'))
#
# elif comparator == 'not like':
# where.append(col.notlike(f'%{ftv[0]}%'))
#
# elif comparator == 'in':
# where.append(col.in_(ftv))
#
#
# return where
def handler_filts(self, *filters):
"""
:param filters: (filts:list,relation:str)
:param g_f:
:param relation:
:return:
"""
user_filters = []
for filter in filters:
filts = filter[0]
relation = filter[1]
user_filter = []
for item in filts:
where = user_filter
col = sa.Column(item['columnName'])
comparator = item['comparator']
ftv = item['ftv']
@ -104,9 +161,6 @@ class UserAnalysis:
elif comparator == 'is null':
where.append(col.is_(None))
elif comparator == '!=':
where.append(col != ftv[0])
elif comparator == 'like':
where.append(col.like(f'%{ftv[0]}%'))
@ -116,8 +170,16 @@ class UserAnalysis:
elif comparator == 'in':
where.append(col.in_(ftv))
elif comparator == '!=':
where.append(col != ftv[0])
if relation == 'and':
if user_filter:
user_filters.append(and_(*user_filter))
else:
if user_filter:
user_filters.append(or_(*user_filter))
return where
return user_filters
def property_model(self):
event = self.events
@ -140,7 +202,10 @@ class UserAnalysis:
func.round(getattr(func, analysis)(getattr(self.user_tbl.c, event['quota'])), 2).label(
'values')]
where = self._get_filters(event['filts']+self.global_filters)
where = self.handler_filts((event['filts'], event.get('relation')),
(self.global_filters, self.global_relation),
self.ext_filters
)
qry = sa.select((*self.groupby, *selectd)).where(*where)
qry = qry.group_by(*self.groupby)

View File

@ -32,6 +32,7 @@ class Report(BaseModel):
name: str
report_id: str
graph_type: str
ascending: bool
model: str
graph_size: str
sort: int = 1