Skip to content

Commit 0e09a0b

Browse files
committed
perf: Optimize the speed of data querying
1 parent 04179c7 commit 0e09a0b

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

backend/apps/datasource/crud/datasource.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from fastapi import HTTPException
66
from sqlalchemy import and_, text
7+
from sqlbot_xpack.permissions.models.ds_rules import DsRules
78
from sqlmodel import select
89

910
from apps.datasource.crud.permission import get_column_permission_fields, get_row_permission_filters, is_normal_user
@@ -250,8 +251,9 @@ def preview(session: SessionDep, current_user: CurrentUser, id: int, data: Table
250251
f_list = [f for f in data.fields if f.checked]
251252
if is_normal_user(current_user):
252253
# column is checked, and, column permission for data.fields
254+
contain_rules = session.query(DsRules).all()
253255
f_list = get_column_permission_fields(session=session, current_user=current_user, table=data.table,
254-
fields=f_list)
256+
fields=f_list, contain_rules=contain_rules)
255257

256258
# row permission tree
257259
where_str = ''
@@ -336,11 +338,27 @@ def get_table_obj_by_ds(session: SessionDep, current_user: CurrentUser, ds: Core
336338
tables = session.query(CoreTable).filter(CoreTable.ds_id == ds.id).all()
337339
conf = DatasourceConf(**json.loads(aes_decrypt(ds.configuration))) if ds.type != "excel" else get_engine_config()
338340
schema = conf.dbSchema if conf.dbSchema is not None and conf.dbSchema != "" else conf.database
341+
342+
# get all field
343+
table_ids = [table.id for table in tables]
344+
all_fields = session.query(CoreField).filter(
345+
and_(CoreField.table_id.in_(table_ids), CoreField.checked == True)).all()
346+
# build dict
347+
fields_dict = {}
348+
for field in all_fields:
349+
if fields_dict.get(field.table_id):
350+
fields_dict.get(field.table_id).append(field)
351+
else:
352+
fields_dict[field.table_id] = [field]
353+
354+
contain_rules = session.query(DsRules).all()
339355
for table in tables:
340-
fields = session.query(CoreField).filter(and_(CoreField.table_id == table.id, CoreField.checked == True)).all()
356+
# fields = session.query(CoreField).filter(and_(CoreField.table_id == table.id, CoreField.checked == True)).all()
357+
fields = fields_dict.get(table.id)
341358

342359
# do column permissions, filter fields
343-
fields = get_column_permission_fields(session=session, current_user=current_user, table=table, fields=fields)
360+
fields = get_column_permission_fields(session=session, current_user=current_user, table=table, fields=fields,
361+
contain_rules=contain_rules)
344362
_list.append(TableAndFields(schema=schema, table=table, fields=fields))
345363
return _list
346364

backend/apps/datasource/crud/permission.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
from typing import List, Optional
33

44
from sqlalchemy import and_
5-
from apps.datasource.crud.row_permission import transFilterTree
6-
from apps.datasource.models.datasource import CoreDatasource, CoreField, CoreTable
7-
from common.core.deps import CurrentUser, SessionDep
85
from sqlbot_xpack.permissions.api.permission import transRecord2DTO
96
from sqlbot_xpack.permissions.models.ds_permission import DsPermission, PermissionDTO
107
from sqlbot_xpack.permissions.models.ds_rules import DsRules
118

9+
from apps.datasource.crud.row_permission import transFilterTree
10+
from apps.datasource.models.datasource import CoreDatasource, CoreField, CoreTable
11+
from common.core.deps import CurrentUser, SessionDep
12+
13+
1214
def get_row_permission_filters(session: SessionDep, current_user: CurrentUser, ds: CoreDatasource,
1315
tables: Optional[list] = None, single_table: Optional[CoreTable] = None):
1416
if single_table:
@@ -20,10 +22,10 @@ def get_row_permission_filters(session: SessionDep, current_user: CurrentUser, d
2022

2123
filters = []
2224
if is_normal_user(current_user):
25+
contain_rules = session.query(DsRules).all()
2326
for table in table_list:
2427
row_permissions = session.query(DsPermission).filter(
2528
and_(DsPermission.table_id == table.id, DsPermission.type == 'row')).all()
26-
contain_rules = session.query(DsRules).all()
2729
res: List[PermissionDTO] = []
2830
if row_permissions is not None:
2931
for permission in row_permissions:
@@ -43,11 +45,10 @@ def get_row_permission_filters(session: SessionDep, current_user: CurrentUser, d
4345

4446

4547
def get_column_permission_fields(session: SessionDep, current_user: CurrentUser, table: CoreTable,
46-
fields: list[CoreField]):
48+
fields: list[CoreField], contain_rules: list[DsRules]):
4749
if is_normal_user(current_user):
4850
column_permissions = session.query(DsPermission).filter(
4951
and_(DsPermission.table_id == table.id, DsPermission.type == 'column')).all()
50-
contain_rules = session.query(DsRules).all()
5152
if column_permissions is not None:
5253
for permission in column_permissions:
5354
# check permission and user in same rules

0 commit comments

Comments
 (0)