perf: 优化命令记录慢的问题

This commit is contained in:
xinwen
2021-02-22 18:35:53 +08:00
parent 7f42e59714
commit 3e7e01418d
9 changed files with 427 additions and 160 deletions

View File

@@ -7,7 +7,7 @@ from common.utils import get_logger
from perms.pagination import NodeGrantedAssetPagination, AllGrantedAssetPagination
from assets.models import Asset, Node
from perms import serializers
from perms.utils.asset.user_permission import UserGrantedAssetsQueryUtils, QuerySetStage
from perms.utils.asset.user_permission import UserGrantedAssetsQueryUtils
logger = get_logger(__name__)

View File

@@ -53,122 +53,6 @@ def get_user_all_asset_perm_ids(user) -> set:
return asset_perm_ids
class QuerySetStage:
def __init__(self):
self._prefetch_related = set()
self._only = ()
self._filters = []
self._querysets_and = []
self._querysets_or = []
self._order_by = None
self._annotate = []
self._before_union_merge_funs = set()
self._after_union_merge_funs = set()
def annotate(self, *args, **kwargs):
self._annotate.append((args, kwargs))
self._before_union_merge_funs.add(self._merge_annotate)
return self
def prefetch_related(self, *lookups):
self._prefetch_related.update(lookups)
self._before_union_merge_funs.add(self._merge_prefetch_related)
return self
def only(self, *fields):
self._only = fields
self._before_union_merge_funs.add(self._merge_only)
return self
def order_by(self, *field_names):
self._order_by = field_names
self._after_union_merge_funs.add(self._merge_order_by)
return self
def filter(self, *args, **kwargs):
self._filters.append((args, kwargs))
self._before_union_merge_funs.add(self._merge_filters)
return self
def and_with_queryset(self, qs: QuerySet):
assert isinstance(qs, QuerySet), f'Must be `QuerySet`'
self._order_by = qs.query.order_by
self._after_union_merge_funs.add(self._merge_order_by)
self._querysets_and.append(qs.order_by())
self._before_union_merge_funs.add(self._merge_querysets_and)
return self
def or_with_queryset(self, qs: QuerySet):
assert isinstance(qs, QuerySet), f'Must be `QuerySet`'
self._order_by = qs.query.order_by
self._after_union_merge_funs.add(self._merge_order_by)
self._querysets_or.append(qs.order_by())
self._before_union_merge_funs.add(self._merge_querysets_or)
return self
def merge_multi_before_union(self, *querysets):
ret = []
for qs in querysets:
qs = self.merge_before_union(qs)
ret.append(qs)
return ret
def _merge_only(self, qs: QuerySet):
if self._only:
qs = qs.only(*self._only)
return qs
def _merge_filters(self, qs: QuerySet):
if self._filters:
for args, kwargs in self._filters:
qs = qs.filter(*args, **kwargs)
return qs
def _merge_querysets_and(self, qs: QuerySet):
if self._querysets_and:
for qs_and in self._querysets_and:
qs &= qs_and
return qs
def _merge_annotate(self, qs: QuerySet):
if self._annotate:
for args, kwargs in self._annotate:
qs = qs.annotate(*args, **kwargs)
return qs
def _merge_querysets_or(self, qs: QuerySet):
if self._querysets_or:
for qs_or in self._querysets_or:
qs |= qs_or
return qs
def _merge_prefetch_related(self, qs: QuerySet):
if self._prefetch_related:
qs = qs.prefetch_related(*self._prefetch_related)
return qs
def _merge_order_by(self, qs: QuerySet):
if self._order_by is not None:
qs = qs.order_by(*self._order_by)
return qs
def merge_before_union(self, qs: QuerySet) -> QuerySet:
assert isinstance(qs, QuerySet), f'Must be `QuerySet`'
for fun in self._before_union_merge_funs:
qs = fun(qs)
return qs
def merge_after_union(self, qs: QuerySet) -> QuerySet:
for fun in self._after_union_merge_funs:
qs = fun(qs)
return qs
def merge(self, qs: QuerySet) -> QuerySet:
qs = self.merge_before_union(qs)
qs = self.merge_after_union(qs)
return qs
class UserGrantedTreeRefreshController:
key_template = 'perms.user.node_tree.builded_orgs.user_id:{user_id}'