From 41ad610c0094309cee524094658481b7bf593b18 Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 22 Dec 2023 15:35:02 +0800 Subject: [PATCH] fix(api): ci relation search fix(api): ci relation search --- .../api/lib/cmdb/search/ci_relation/search.py | 26 ++++++++++--------- cmdb-api/api/views/cmdb/ci_relation.py | 7 +++-- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/cmdb-api/api/lib/cmdb/search/ci_relation/search.py b/cmdb-api/api/lib/cmdb/search/ci_relation/search.py index 627276e..b7513c4 100644 --- a/cmdb-api/api/lib/cmdb/search/ci_relation/search.py +++ b/cmdb-api/api/lib/cmdb/search/ci_relation/search.py @@ -28,7 +28,8 @@ class Search(object): count=None, sort=None, reverse=False, - ancestor_ids=None): + ancestor_ids=None, + has_m2m=None): self.orig_query = query self.fl = fl self.facet_field = facet_field @@ -45,14 +46,15 @@ class Search(object): level[0] if isinstance(level, list) and level else level) self.ancestor_ids = ancestor_ids - self.has_m2m = False - if self.ancestor_ids: - self.has_m2m = True - else: - level = level[0] if isinstance(level, list) and level else level - for _l, c in self.level2constraint.items(): - if _l < int(level) and c == ConstraintEnum.Many2Many: - self.has_m2m = True + self.has_m2m = has_m2m or False + if not self.has_m2m: + if self.ancestor_ids: + self.has_m2m = True + else: + level = level[0] if isinstance(level, list) and level else level + for _l, c in self.level2constraint.items(): + if _l < int(level) and c == ConstraintEnum.Many2Many: + self.has_m2m = True def _get_ids(self, ids): if self.level[-1] == 1 and len(ids) == 1: @@ -90,12 +92,12 @@ class Search(object): key = list(set(["{},{}".format(i, j) for idx, i in enumerate(key) for j in _tmp[idx]])) prefix = REDIS_PREFIX_CI_RELATION2 + _tmp = list(map(lambda x: json.loads(x).keys() if x else [], rd.get(key, prefix) or [])) + ids = [j for i in _tmp for j in i] + if not key: return [] - _tmp = list(map(lambda x: json.loads(x).keys() if x else [], rd.get(key, prefix) or [])) - ids = [j for i in _tmp for j in i] - if level in self.level: merge_ids.extend(ids) diff --git a/cmdb-api/api/views/cmdb/ci_relation.py b/cmdb-api/api/views/cmdb/ci_relation.py index bfa56ec..4368960 100644 --- a/cmdb-api/api/views/cmdb/ci_relation.py +++ b/cmdb-api/api/views/cmdb/ci_relation.py @@ -43,9 +43,11 @@ class CIRelationSearchView(APIView): facet = handle_arg_list(request.values.get("facet", "")) sort = request.values.get("sort") reverse = request.values.get("reverse") in current_app.config.get('BOOL_TRUE') + has_m2m = request.values.get("has_m2m") in current_app.config.get('BOOL_TRUE') start = time.time() - s = Search(root_id, level, query, fl, facet, page, count, sort, reverse, ancestor_ids=ancestor_ids) + s = Search(root_id, level, query, fl, facet, page, count, sort, reverse, + ancestor_ids=ancestor_ids, has_m2m=has_m2m) try: response, counter, total, page, numfound, facet = s.search() except SearchError as e: @@ -69,9 +71,10 @@ class CIRelationStatisticsView(APIView): level = request.values.get('level', 1) type_ids = set(map(int, handle_arg_list(request.values.get('type_ids', [])))) ancestor_ids = request.values.get('ancestor_ids') or None # only for many to many + has_m2m = request.values.get("has_m2m") in current_app.config.get('BOOL_TRUE') start = time.time() - s = Search(root_ids, level, ancestor_ids=ancestor_ids) + s = Search(root_ids, level, ancestor_ids=ancestor_ids, has_m2m=has_m2m) try: result = s.statistics(type_ids) except SearchError as e: