Skip to content

Commit 61f06e3

Browse files
committed
fix: check exists terminology
1 parent d213de3 commit 61f06e3

File tree

4 files changed

+81
-15
lines changed

4 files changed

+81
-15
lines changed

backend/apps/terminology/curd/terminology.py

Lines changed: 77 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,10 @@ def create_terminology(session: SessionDep, info: TerminologyInfo, oid: int, tra
226226
specific_ds = info.specific_ds if info.specific_ds is not None else False
227227
datasource_ids = info.datasource_ids if info.datasource_ids is not None else []
228228

229+
if specific_ds:
230+
if not datasource_ids:
231+
raise Exception(trans("i18n_terminology.datasource_cannot_be_none"))
232+
229233
parent = Terminology(word=info.word, create_time=create_time, description=info.description, oid=oid,
230234
specific_ds=specific_ds,
231235
datasource_ids=datasource_ids)
@@ -237,8 +241,37 @@ def create_terminology(session: SessionDep, info: TerminologyInfo, oid: int, tra
237241
else:
238242
words.append(child)
239243

240-
exists = session.query(
241-
session.query(Terminology).filter(and_(Terminology.word.in_(words), Terminology.oid == oid)).exists()).scalar()
244+
# 基础查询条件(word 和 oid 必须满足)
245+
base_query = and_(
246+
Terminology.word.in_(words),
247+
Terminology.oid == oid
248+
)
249+
250+
# 构建查询
251+
query = session.query(Terminology).filter(base_query)
252+
253+
if specific_ds:
254+
# 仅当 specific_ds=False 时,检查数据源条件
255+
query = query.where(
256+
or_(
257+
or_(Terminology.specific_ds == False, Terminology.specific_ds.is_(None)),
258+
and_(
259+
Terminology.specific_ds == True,
260+
Terminology.datasource_ids.isnot(None),
261+
text("""
262+
EXISTS (
263+
SELECT 1 FROM jsonb_array_elements(datasource_ids) AS elem
264+
WHERE elem::text::int = ANY(:datasource_ids)
265+
)
266+
""") # 检查是否包含任意目标值
267+
)
268+
)
269+
)
270+
query = query.params(datasource_ids=datasource_ids)
271+
272+
# 转换为 EXISTS 查询并获取结果
273+
exists = session.query(query.exists()).scalar()
274+
242275
if exists:
243276
raise Exception(trans("i18n_terminology.exists_in_db"))
244277

@@ -277,29 +310,59 @@ def update_terminology(session: SessionDep, info: TerminologyInfo, oid: int, tra
277310
if count == 0:
278311
raise Exception(trans('i18n_terminology.terminology_not_exists'))
279312

313+
specific_ds = info.specific_ds if info.specific_ds is not None else False
314+
datasource_ids = info.datasource_ids if info.datasource_ids is not None else []
315+
316+
if specific_ds:
317+
if not datasource_ids:
318+
raise Exception(trans("i18n_terminology.datasource_cannot_be_none"))
319+
280320
words = [info.word]
281321
for child in info.other_words:
282322
if child in words:
283323
raise Exception(trans("i18n_terminology.cannot_be_repeated"))
284324
else:
285325
words.append(child)
286326

287-
exists = session.query(
288-
session.query(Terminology).filter(
289-
Terminology.word.in_(words),
290-
Terminology.oid == oid,
327+
# 基础查询条件(word 和 oid 必须满足)
328+
base_query = and_(
329+
Terminology.word.in_(words),
330+
Terminology.oid == oid,
331+
or_(
332+
Terminology.pid != info.id,
333+
and_(Terminology.pid.is_(None), Terminology.id != info.id)
334+
),
335+
Terminology.id != info.id
336+
)
337+
338+
# 构建查询
339+
query = session.query(Terminology).filter(base_query)
340+
341+
if specific_ds:
342+
# 仅当 specific_ds=False 时,检查数据源条件
343+
query = query.where(
291344
or_(
292-
Terminology.pid != info.id,
293-
and_(Terminology.pid.is_(None), Terminology.id != info.id)
294-
),
295-
Terminology.id != info.id
296-
).exists()).scalar()
345+
or_(Terminology.specific_ds == False, Terminology.specific_ds.is_(None)),
346+
and_(
347+
Terminology.specific_ds == True,
348+
Terminology.datasource_ids.isnot(None),
349+
text("""
350+
EXISTS (
351+
SELECT 1 FROM jsonb_array_elements(datasource_ids) AS elem
352+
WHERE elem::text::int = ANY(:datasource_ids)
353+
)
354+
""") # 检查是否包含任意目标值
355+
)
356+
)
357+
)
358+
query = query.params(datasource_ids=datasource_ids)
359+
360+
# 转换为 EXISTS 查询并获取结果
361+
exists = session.query(query.exists()).scalar()
362+
297363
if exists:
298364
raise Exception(trans("i18n_terminology.exists_in_db"))
299365

300-
specific_ds = info.specific_ds if info.specific_ds is not None else False
301-
datasource_ids = info.datasource_ids if info.datasource_ids is not None else []
302-
303366
stmt = update(Terminology).where(and_(Terminology.id == info.id)).values(
304367
word=info.word,
305368
description=info.description,

backend/locales/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,12 @@
4040
},
4141
"i18n_terminology": {
4242
"terminology_not_exists": "Terminology does not exists",
43+
"datasource_cannot_be_none": "Datasource cannot be none or empty",
4344
"cannot_be_repeated": "Term name, synonyms cannot be repeated",
4445
"exists_in_db": "Term name, synonyms exists"
4546
},
4647
"i18n_data_training": {
47-
"datasource_cannot_be_none": "Datasource cannot be none",
48+
"datasource_cannot_be_none": "Datasource cannot be none or empty",
4849
"data_training_not_exists": "Example does not exists",
4950
"exists_in_db": "Question exists"
5051
},

backend/locales/ko-KR.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
},
4141
"i18n_terminology": {
4242
"terminology_not_exists": "용어를 찾을 수 없습니다",
43+
"datasource_cannot_be_none": "데이터 소스를 선택해 주세요",
4344
"cannot_be_repeated": "용어 이름과 동의어는 중복될 수 없습니다",
4445
"exists_in_db": "용어 이름 또는 동의어가 이미 존재합니다"
4546
},

backend/locales/zh-CN.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
},
4141
"i18n_terminology": {
4242
"terminology_not_exists": "该术语不存在",
43+
"datasource_cannot_be_none": "数据源不能为空",
4344
"cannot_be_repeated": "术语名称,同义词不能重复",
4445
"exists_in_db": "术语名称,同义词已存在"
4546
},

0 commit comments

Comments
 (0)