cnki:同一个筛选类型可以加入多个筛选项

main
zhaoxiangpeng 4 weeks ago
parent cf20521b1c
commit 7a5b8f787c

@ -335,7 +335,11 @@ def add_limit_2query_body(limit_query: Union[List[dict], dict], body_key: str, q
}) })
# 遍历所有的组满足条件则把limit添加进去 # 遍历所有的组满足条件则把limit添加进去
for group in query_body["QNode"]["QGroup"]: for group in query_body["QNode"]["QGroup"]:
# 相同的Key类型只能有一个如果同类型有多个条件需要追加到Items[]内,还不能重复
child_items = group["ChildItems"]
if group["Key"] == body_key: if group["Key"] == body_key:
if not child_items:
# 直接添加进去
if isinstance(limit_query, dict): if isinstance(limit_query, dict):
group["ChildItems"].append(limit_query) group["ChildItems"].append(limit_query)
elif isinstance(limit_query, list): elif isinstance(limit_query, list):
@ -343,6 +347,25 @@ def add_limit_2query_body(limit_query: Union[List[dict], dict], body_key: str, q
else: else:
raise ValueError("不支持的limit类型 \n%s" % limit_query) raise ValueError("不支持的limit类型 \n%s" % limit_query)
break break
for child_item in child_items:
# 对child_item['Items']的值进行过滤,只添加不重复的
child_item_map = {}
[
child_item_map.setdefault(
i['Field'], {}
).update({
i['Key']: i['Value'] # 代表存在
})
for i in child_item['Items']
]
if child_item["Key"] == limit_query['Key']:
for limit_query_item in limit_query['Items']:
# 如果新的条件已存在,跳过
if child_item_map.get(limit_query_item['Field'], {}).get(limit_query_item["Key"]):
continue
else:
child_item['Items'].append(limit_query_item)
break
def parse_retrieval(query: str): def parse_retrieval(query: str):
@ -406,8 +429,8 @@ def add_search_word(search_content: str, base_query: dict = None):
def add_muti_group( def add_muti_group(
project: Union[SingleResultEnum, str], project: Union[SingleResultEnum, str],
value: str, value: Union[str, List[str]],
text_or_title: str, text_or_title: Union[str, List[str]],
base_query: dict = None, base_query: dict = None,
**kwargs) -> dict: **kwargs) -> dict:
""" """
@ -424,22 +447,31 @@ def add_muti_group(
project = project.value project = project.value
elif isinstance(project, str): elif isinstance(project, str):
project = SingleResultEnum[project].value project = SingleResultEnum[project].value
# 判断value和text_or_title的类型是否一致不一致抛出错误
if (isinstance(value, list) and not isinstance(text_or_title, list)) or (not isinstance(value, list) and isinstance(text_or_title, list)):
raise TypeError("参数类型不一致必须都为list或str")
# 同一个分组多个条件统统转成List
if isinstance(value, (str, int)):
value = [value]
if isinstance(text_or_title, (str, int)):
text_or_title = [text_or_title]
child_item = { child_item = {
"Key": project, "Key": project,
"Title": "", "Title": "",
"Logic": 0, "Logic": 0,
"Items": [ "Items": [
{ {
"Key": value, "Key": val,
"Title": text_or_title, "Title": t1t,
"Logic": 1, "Logic": 1,
"Field": project, "Field": project,
"Operator": "DEFAULT", "Operator": "DEFAULT",
"Value": value, "Value": val,
"Value2": "", "Value2": "",
"Name": project, "Name": project,
"ExtendType": 0 "ExtendType": 0
}], } for val, t1t in zip(value, text_or_title)
],
"ChildItems": [ "ChildItems": [
] ]
} }

Loading…
Cancel
Save