Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 77 additions & 14 deletions backend/apps/terminology/curd/terminology.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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"))

Expand Down Expand Up @@ -277,29 +310,59 @@ 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:
raise Exception(trans("i18n_terminology.cannot_be_repeated"))
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,
Expand Down
3 changes: 2 additions & 1 deletion backend/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
},
Expand Down
1 change: 1 addition & 0 deletions backend/locales/ko-KR.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
},
"i18n_terminology": {
"terminology_not_exists": "용어를 찾을 수 없습니다",
"datasource_cannot_be_none": "데이터 소스를 선택해 주세요",
"cannot_be_repeated": "용어 이름과 동의어는 중복될 수 없습니다",
"exists_in_db": "용어 이름 또는 동의어가 이미 존재합니다"
},
Expand Down
1 change: 1 addition & 0 deletions backend/locales/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
},
"i18n_terminology": {
"terminology_not_exists": "该术语不存在",
"datasource_cannot_be_none": "数据源不能为空",
"cannot_be_repeated": "术语名称,同义词不能重复",
"exists_in_db": "术语名称,同义词已存在"
},
Expand Down