From eb69029a510ee35ffc07a808e506367f36cc726b Mon Sep 17 00:00:00 2001 From: pycook Date: Mon, 23 Sep 2024 19:46:43 +0800 Subject: [PATCH] fix(api): ci relations search --- cmdb-api/api/lib/cmdb/ci.py | 18 ++++++++---- cmdb-api/api/lib/cmdb/search/ci/db/search.py | 30 +++++++++++++------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/cmdb-api/api/lib/cmdb/ci.py b/cmdb-api/api/lib/cmdb/ci.py index b5e7084..a6831ae 100644 --- a/cmdb-api/api/lib/cmdb/ci.py +++ b/cmdb-api/api/lib/cmdb/ci.py @@ -709,13 +709,18 @@ class CIManager(object): elif fields: _res = [] for d in res: + if isinstance(fields, dict) and d.get("_type") not in fields: + _res.append(d) + continue + _d = dict() _d["_id"], _d["_type"] = d.get("_id"), d.get("_type") _d["ci_type"] = d.get("ci_type") if unique_required: _d[d.get('unique')] = d.get(d.get('unique')) - for field in fields + ['ci_type_alias', 'unique', 'unique_alias']: + _fields = list(fields.get(_d['_type']) or []) if isinstance(fields, dict) else fields + for field in _fields + ['ci_type_alias', 'unique', 'unique_alias']: _d[field] = d.get(field) _res.append(_d) return _res @@ -732,9 +737,8 @@ class CIManager(object): from api.lib.cmdb.search.ci.db.query_sql import QUERY_CIS_BY_IDS from api.lib.cmdb.search.ci.db.query_sql import QUERY_CIS_BY_VALUE_TABLE - if not fields: - filter_fields_sql = "" - else: + filter_fields_sql = "" + if fields and isinstance(fields, list): _fields = list() for field in fields: attr = AttributeCache.get(field) @@ -776,6 +780,10 @@ class CIManager(object): ci_set.add(ci_id) res[ci2pos[ci_id]] = ci_dict + if isinstance(fields, dict) and fields.get(type_id): + if attr_name not in fields[type_id]: + continue + if ret_key == RetKey.NAME: attr_key = attr_name elif ret_key == RetKey.ALIAS: @@ -813,7 +821,7 @@ class CIManager(object): if not ci_ids: return [] - fields = [] if fields is None or not isinstance(fields, list) else fields + fields = [] if not fields else fields ci_id_tuple = tuple(map(int, ci_ids)) res = cls._get_cis_from_cache(ci_id_tuple, ret_key, fields, unique_required, excludes=excludes) diff --git a/cmdb-api/api/lib/cmdb/search/ci/db/search.py b/cmdb-api/api/lib/cmdb/search/ci/db/search.py index 2aaa690..a0f9721 100644 --- a/cmdb-api/api/lib/cmdb/search/ci/db/search.py +++ b/cmdb-api/api/lib/cmdb/search/ci/db/search.py @@ -106,10 +106,11 @@ class Search(object): def _type_query_handler(self, v, queries): new_v = v[1:-1].split(";") if v.startswith("(") and v.endswith(")") else [v] + type_num = len(new_v) for _v in new_v: ci_type = CITypeCache.get(_v) - if len(new_v) == 1 and not self.sort and ci_type and ci_type.default_order_attr: + if type_num == 1 and not self.sort and ci_type and ci_type.default_order_attr: self.sort = ci_type.default_order_attr if ci_type is not None: @@ -129,10 +130,15 @@ class Search(object): queries.append(dict(operator="&", queries=sub)) if self.type2filter_perms[ci_type.id].get('attr_filter'): - if not self.fl: - self.fl = set(self.type2filter_perms[ci_type.id]['attr_filter']) + if type_num == 1: + if not self.fl: + self.fl = set(self.type2filter_perms[ci_type.id]['attr_filter']) + else: + self.fl = set(self.fl) & set(self.type2filter_perms[ci_type.id]['attr_filter']) else: - self.fl = set(self.fl) & set(self.type2filter_perms[ci_type.id]['attr_filter']) + self.fl = self.fl or {} + if not self.fl or isinstance(self.fl, dict): + self.fl[ci_type.id] = set(self.type2filter_perms[ci_type.id]['attr_filter']) if self.type2filter_perms[ci_type.id].get('id_filter') and self.use_id_filter: @@ -585,13 +591,15 @@ class Search(object): return facet_result def _fl_build(self): - _fl = list() - for f in self.fl: - k, _, _, _ = self._attr_name_proc(f) - if k: - _fl.append(k) - - return _fl + if isinstance(self.fl, list): + _fl = list() + for f in self.fl: + k, _, _, _ = self._attr_name_proc(f) + if k: + _fl.append(k) + return _fl + else: + return self.fl def search(self): numfound, ci_ids = self._query_build_raw()