fix: check exists terminology

This commit is contained in:
ulleo
2025-09-29 21:59:29 +08:00
committed by ulleo
parent d213de3eda
commit 61f06e35a0
4 changed files with 81 additions and 15 deletions
+77 -14
View File
@@ -226,6 +226,10 @@ def create_terminology(session: SessionDep, info: TerminologyInfo, oid: int, tra
specific_ds = info.specific_ds if info.specific_ds is not None else False
datasource_ids = info.datasource_ids if info.datasource_ids is not None else []
if specific_ds:
if not datasource_ids:
raise Exception(trans("i18n_terminology.datasource_cannot_be_none"))
parent = Terminology(word=info.word, create_time=create_time, description=info.description, oid=oid,
specific_ds=specific_ds,
datasource_ids=datasource_ids)
@@ -237,8 +241,37 @@ def create_terminology(session: SessionDep, info: TerminologyInfo, oid: int, tra
else:
words.append(child)
exists = session.query(
session.query(Terminology).filter(and_(Terminology.word.in_(words), Terminology.oid == oid)).exists()).scalar()
# 基础查询条件(word 和 oid 必须满足)
base_query = and_(
Terminology.word.in_(words),
Terminology.oid == oid
)
# 构建查询
query = session.query(Terminology).filter(base_query)
if specific_ds:
# 仅当 specific_ds=False 时,检查数据源条件
query = query.where(
or_(
or_(Terminology.specific_ds == False, Terminology.specific_ds.is_(None)),
and_(
Terminology.specific_ds == True,
Terminology.datasource_ids.isnot(None),
text("""
EXISTS (
SELECT 1 FROM jsonb_array_elements(datasource_ids) AS elem
WHERE elem::text::int = ANY(:datasource_ids)
)
""") # 检查是否包含任意目标值
)
)
)
query = query.params(datasource_ids=datasource_ids)
# 转换为 EXISTS 查询并获取结果
exists = session.query(query.exists()).scalar()
if exists:
raise Exception(trans("i18n_terminology.exists_in_db"))
@@ -277,6 +310,13 @@ def update_terminology(session: SessionDep, info: TerminologyInfo, oid: int, tra
if count == 0:
raise Exception(trans('i18n_terminology.terminology_not_exists'))
specific_ds = info.specific_ds if info.specific_ds is not None else False
datasource_ids = info.datasource_ids if info.datasource_ids is not None else []
if specific_ds:
if not datasource_ids:
raise Exception(trans("i18n_terminology.datasource_cannot_be_none"))
words = [info.word]
for child in info.other_words:
if child in words:
@@ -284,22 +324,45 @@ def update_terminology(session: SessionDep, info: TerminologyInfo, oid: int, tra
else:
words.append(child)
exists = session.query(
session.query(Terminology).filter(
Terminology.word.in_(words),
Terminology.oid == oid,
# 基础查询条件(word 和 oid 必须满足)
base_query = and_(
Terminology.word.in_(words),
Terminology.oid == oid,
or_(
Terminology.pid != info.id,
and_(Terminology.pid.is_(None), Terminology.id != info.id)
),
Terminology.id != info.id
)
# 构建查询
query = session.query(Terminology).filter(base_query)
if specific_ds:
# 仅当 specific_ds=False 时,检查数据源条件
query = query.where(
or_(
Terminology.pid != info.id,
and_(Terminology.pid.is_(None), Terminology.id != info.id)
),
Terminology.id != info.id
).exists()).scalar()
or_(Terminology.specific_ds == False, Terminology.specific_ds.is_(None)),
and_(
Terminology.specific_ds == True,
Terminology.datasource_ids.isnot(None),
text("""
EXISTS (
SELECT 1 FROM jsonb_array_elements(datasource_ids) AS elem
WHERE elem::text::int = ANY(:datasource_ids)
)
""") # 检查是否包含任意目标值
)
)
)
query = query.params(datasource_ids=datasource_ids)
# 转换为 EXISTS 查询并获取结果
exists = session.query(query.exists()).scalar()
if exists:
raise Exception(trans("i18n_terminology.exists_in_db"))
specific_ds = info.specific_ds if info.specific_ds is not None else False
datasource_ids = info.datasource_ids if info.datasource_ids is not None else []
stmt = update(Terminology).where(and_(Terminology.id == info.id)).values(
word=info.word,
description=info.description,
+2 -1
View File
@@ -40,11 +40,12 @@
},
"i18n_terminology": {
"terminology_not_exists": "Terminology does not exists",
"datasource_cannot_be_none": "Datasource cannot be none or empty",
"cannot_be_repeated": "Term name, synonyms cannot be repeated",
"exists_in_db": "Term name, synonyms exists"
},
"i18n_data_training": {
"datasource_cannot_be_none": "Datasource cannot be none",
"datasource_cannot_be_none": "Datasource cannot be none or empty",
"data_training_not_exists": "Example does not exists",
"exists_in_db": "Question exists"
},
+1
View File
@@ -40,6 +40,7 @@
},
"i18n_terminology": {
"terminology_not_exists": "용어를 찾을 수 없습니다",
"datasource_cannot_be_none": "데이터 소스를 선택해 주세요",
"cannot_be_repeated": "용어 이름과 동의어는 중복될 수 없습니다",
"exists_in_db": "용어 이름 또는 동의어가 이미 존재합니다"
},
+1
View File
@@ -40,6 +40,7 @@
},
"i18n_terminology": {
"terminology_not_exists": "该术语不存在",
"datasource_cannot_be_none": "数据源不能为空",
"cannot_be_repeated": "术语名称,同义词不能重复",
"exists_in_db": "术语名称,同义词已存在"
},