Skip to content

Commit 8e97a6b

Browse files
committed
feat: support filter search in SQL sample and terminology list
#1281
1 parent fe65f3e commit 8e97a6b

10 files changed

Lines changed: 190 additions & 42 deletions

File tree

‎backend/apps/data_training/api/data_training.py‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@
2929
@router.get("/page/{current_page}/{page_size}", summary=f"{PLACEHOLDER_PREFIX}get_dt_page")
3030
@require_permissions(permission=SqlbotPermission(role=['ws_admin']))
3131
async def pager(session: SessionDep, current_user: CurrentUser, current_page: int, page_size: int,
32-
question: Optional[str] = Query(None, description="搜索问题(可选)")):
32+
question: Optional[str] = Query(None, description="搜索问题(可选)"),
33+
ds_list: Optional[list[int]] = Query(None, description="数据集ID集合(可选)"),
34+
adv_list: Optional[list[int]] = Query(None, description="高级应用ID集合(可选)")):
3335
current_page, page_size, total_count, total_pages, _list = page_data_training(session, current_page, page_size,
3436
question,
35-
current_user.oid)
37+
current_user.oid, ds_list, adv_list)
3638

3739
return {
3840
"current_page": current_page,

‎backend/apps/data_training/curd/data_training.py‎

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,32 @@ def get_data_training_base_query(oid: int, name: Optional[str] = None):
3737

3838

3939
def build_data_training_query(session: SessionDep, oid: int, name: Optional[str] = None,
40-
paginate: bool = True, current_page: int = 1, page_size: int = 10):
40+
paginate: bool = True, current_page: int = 1, page_size: int = 10,
41+
ds_list: Optional[list[int]] = None, adv_list: Optional[list[int]] = None):
4142
"""
4243
构建数据训练查询的通用方法
4344
"""
4445
parent_ids_subquery = get_data_training_base_query(oid, name)
4546

47+
# 添加数据源/高级应用筛选条件(ds_list 与 adv_list 为或的关系)
48+
ds_filter_condition = None
49+
adv_filter_condition = None
50+
51+
if ds_list is not None and len(ds_list) > 0:
52+
ds_filter_condition = DataTraining.datasource.in_(ds_list)
53+
54+
if adv_list is not None and len(adv_list) > 0:
55+
adv_filter_condition = DataTraining.advanced_application.in_(adv_list)
56+
57+
if ds_filter_condition is not None and adv_filter_condition is not None:
58+
parent_ids_subquery = parent_ids_subquery.where(
59+
or_(ds_filter_condition, adv_filter_condition)
60+
)
61+
elif ds_filter_condition is not None:
62+
parent_ids_subquery = parent_ids_subquery.where(ds_filter_condition)
63+
elif adv_filter_condition is not None:
64+
parent_ids_subquery = parent_ids_subquery.where(adv_filter_condition)
65+
4666
# 计算总数
4767
count_stmt = select(func.count()).select_from(parent_ids_subquery.subquery())
4868
total_count = session.execute(count_stmt).scalar()
@@ -121,12 +141,13 @@ def execute_data_training_query(session: SessionDep, stmt) -> List[DataTrainingI
121141

122142

123143
def page_data_training(session: SessionDep, current_page: int = 1, page_size: int = 10,
124-
name: Optional[str] = None, oid: Optional[int] = 1):
144+
name: Optional[str] = None, oid: Optional[int] = 1, ds_list: Optional[list[int]] = None,
145+
adv_list: Optional[list[int]] = None):
125146
"""
126147
分页查询数据训练(原方法保持不变)
127148
"""
128149
stmt, total_count, total_pages, current_page, page_size = build_data_training_query(
129-
session, oid, name, True, current_page, page_size
150+
session, oid, name, True, current_page, page_size, ds_list, adv_list
130151
)
131152
_list = execute_data_training_query(session, stmt)
132153

@@ -305,7 +326,8 @@ def batch_create_training(session: SessionDep, info_list: List[DataTrainingInfo]
305326

306327
assistant_name_to_id = {}
307328

308-
assistant_stmt = select(AssistantModel.id, AssistantModel.name).where(and_(AssistantModel.type == 1, AssistantModel.oid == oid))
329+
assistant_stmt = select(AssistantModel.id, AssistantModel.name).where(
330+
and_(AssistantModel.type == 1, AssistantModel.oid == oid))
309331
assistant_result = session.execute(assistant_stmt).all()
310332
for assistant in assistant_result:
311333
assistant_name_to_id[assistant.name.strip()] = assistant.id

‎backend/apps/terminology/api/terminology.py‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@
2929
@require_permissions(permission=SqlbotPermission(role=['ws_admin']))
3030
async def pager(session: SessionDep, current_user: CurrentUser, current_page: int, page_size: int,
3131
word: Optional[str] = Query(None, description="搜索术语(可选)"),
32-
dslist: Optional[list[int]] = Query(None, description="数据集ID集合(可选)")):
32+
ds_list: Optional[list[int]] = Query(None, description="数据集ID集合(可选)"),
33+
adv_list: Optional[list[int]] = Query(None, description="高级应用ID集合(可选)")):
3334
current_page, page_size, total_count, total_pages, _list = page_terminology(session, current_page, page_size, word,
34-
current_user.oid, dslist)
35+
current_user.oid, ds_list, adv_list)
3536

3637
return {
3738
"current_page": current_page,

‎backend/apps/terminology/curd/terminology.py‎

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -57,30 +57,42 @@ def get_terminology_base_query(oid: int, name: Optional[str] = None):
5757

5858
def build_terminology_query(session: SessionDep, oid: int, name: Optional[str] = None,
5959
paginate: bool = True, current_page: int = 1, page_size: int = 10,
60-
dslist: Optional[list[int]] = None):
60+
ds_list: Optional[list[int]] = None, adv_list: Optional[list[int]] = None):
6161
"""
6262
构建术语查询的通用方法
6363
"""
6464
parent_ids_subquery, child = get_terminology_base_query(oid, name)
6565

66-
# 添加数据源筛选条件
67-
if dslist is not None and len(dslist) > 0:
66+
# 添加数据源/高级应用筛选条件(ds_list 与 adv_list 为或的关系)
67+
ds_filter_condition = None
68+
adv_filter_condition = None
69+
70+
if ds_list is not None and len(ds_list) > 0:
6871
datasource_conditions = []
69-
# datasource_ids 与 dslist 中的任一元素有交集
70-
for ds_id in dslist:
71-
# 使用 JSONB 包含操作符,但需要确保类型正确
72+
for ds_id in ds_list:
7273
datasource_conditions.append(
7374
Terminology.datasource_ids.contains([ds_id])
7475
)
7576

76-
# datasource_ids 为空数组
77-
empty_array_condition = Terminology.datasource_ids == []
78-
7977
ds_filter_condition = or_(
80-
*datasource_conditions,
81-
empty_array_condition
78+
Terminology.specific_ds == False,
79+
and_(
80+
Terminology.specific_ds == True,
81+
*datasource_conditions
82+
)
83+
)
84+
85+
if adv_list is not None and len(adv_list) > 0:
86+
adv_filter_condition = Terminology.advanced_application.in_(adv_list)
87+
88+
if ds_filter_condition is not None and adv_filter_condition is not None:
89+
parent_ids_subquery = parent_ids_subquery.where(
90+
or_(ds_filter_condition, adv_filter_condition)
8291
)
92+
elif ds_filter_condition is not None:
8393
parent_ids_subquery = parent_ids_subquery.where(ds_filter_condition)
94+
elif adv_filter_condition is not None:
95+
parent_ids_subquery = parent_ids_subquery.where(adv_filter_condition)
8496

8597
# 计算总数
8698
count_stmt = select(func.count()).select_from(parent_ids_subquery.subquery())
@@ -205,12 +217,13 @@ def execute_terminology_query(session: SessionDep, stmt) -> List[TerminologyInfo
205217

206218

207219
def page_terminology(session: SessionDep, current_page: int = 1, page_size: int = 10,
208-
name: Optional[str] = None, oid: Optional[int] = 1, dslist: Optional[list[int]] = None):
220+
name: Optional[str] = None, oid: Optional[int] = 1, ds_list: Optional[list[int]] = None,
221+
adv_list: Optional[list[int]] = None):
209222
"""
210223
分页查询术语(原方法保持不变)
211224
"""
212225
stmt, total_count, total_pages, current_page, page_size = build_terminology_query(
213-
session, oid, name, True, current_page, page_size, dslist
226+
session, oid, name, True, current_page, page_size, ds_list, adv_list
214227
)
215228
_list = execute_terminology_query(session, stmt)
216229

‎backend/pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ dependencies = [
3939
"pyyaml (>=6.0.2,<7.0.0)",
4040
"fastapi-mcp (>=0.3.4,<0.4.0)",
4141
"tabulate>=0.9.0",
42-
"sqlbot-xpack>=0.0.5.32,<0.0.6.0",
42+
"sqlbot-xpack>=0.0.5.33,<0.0.6.0",
4343
"fastapi-cache2>=0.2.2",
4444
"sqlparse>=0.5.3",
4545
"redis>=6.2.0",

‎frontend/src/api/prompt.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { request } from '@/utils/request'
22

33
export const promptApi = {
44
getList: (pageNum: any, pageSize: any, type: any, params: any) =>
5-
request.get(`/system/custom_prompt/${type}/page/${pageNum}/${pageSize}${params}`),
5+
request.post(`/system/custom_prompt/${type}/page/${pageNum}/${pageSize}`, params),
66
updateEmbedded: (data: any) => request.put(`/system/custom_prompt`, data),
77
deleteEmbedded: (params: any) => request.delete('/system/custom_prompt', { data: params }),
88
getOne: (id: any) => request.get(`/system/custom_prompt/${id}`),

‎frontend/src/api/training.ts‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ import { request } from '@/utils/request'
22

33
export const trainingApi = {
44
getList: (pageNum: any, pageSize: any, params: any) =>
5-
request.get(`/system/data-training/page/${pageNum}/${pageSize}`, {
6-
params,
7-
}),
5+
request.get(`/system/data-training/page/${pageNum}/${pageSize}${params}`),
86
updateEmbedded: (data: any) => request.put('/system/data-training', data),
97
deleteEmbedded: (params: any) => request.delete('/system/data-training', { data: params }),
108
getOne: (id: any) => request.get(`/system/data-training/${id}`),

‎frontend/src/views/system/professional/index.vue‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ onMounted(() => {
4646
})
4747
getAdvancedApplicationList().then((res: any) => {
4848
adv_options.value = res || []
49+
filterOption.value[1].option = [...adv_options.value]
4950
})
5051
search()
5152
})
@@ -381,11 +382,19 @@ const filterOption = ref<any[]>([
381382
{
382383
type: 'select',
383384
option: [],
384-
field: 'dslist',
385+
field: 'ds_list',
385386
title: t('ds.title'),
386387
operate: 'in',
387388
property: { placeholder: t('common.empty') + t('ds.title') },
388389
},
390+
{
391+
type: 'select',
392+
option: [],
393+
field: 'adv_list',
394+
title: t('embedded.advanced_application'),
395+
operate: 'in',
396+
property: { placeholder: t('common.empty') + t('embedded.advanced_application') },
397+
},
389398
])
390399
391400
const fillFilterText = () => {

‎frontend/src/views/system/prompt/index.vue‎

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ onMounted(() => {
5555
})
5656
getAdvancedApplicationList().then((res: any) => {
5757
adv_options.value = res || []
58+
filterOption.value[1].option = [...adv_options.value]
5859
})
5960
search()
6061
})
@@ -389,31 +390,36 @@ const typeChange = (val: any) => {
389390
}
390391
391392
const configParams = () => {
392-
let str = ''
393+
let _data: any = {}
393394
if (keywords.value) {
394-
str += `name=${keywords.value}`
395+
_data['name'] = keywords.value
395396
}
396397
398+
console.log(state.conditions)
399+
397400
state.conditions.forEach((ele: any) => {
398-
ele.value.forEach((itx: any) => {
399-
str += str ? `_${itx}` : `${ele.field}=${itx}`
400-
})
401+
_data[ele.field] = ele.value
401402
})
402403
403-
if (str.length) {
404-
str = `?${str}`
405-
}
406-
return str
404+
return _data
407405
}
408406
const filterOption = ref<any[]>([
409407
{
410408
type: 'select',
411409
option: [],
412-
field: 'dslist',
410+
field: 'ds_list',
413411
title: t('ds.title'),
414412
operate: 'in',
415413
property: { placeholder: t('common.empty') + t('ds.title') },
416414
},
415+
{
416+
type: 'select',
417+
option: [],
418+
field: 'adv_list',
419+
title: t('embedded.advanced_application'),
420+
operate: 'in',
421+
property: { placeholder: t('common.empty') + t('embedded.advanced_application') },
422+
},
417423
])
418424
419425
const fillFilterText = () => {

0 commit comments

Comments
 (0)