Skip to content

Conversation

@LordofAvernus
Copy link
Collaborator

@LordofAvernus LordofAvernus commented Dec 4, 2025

User description

关联的 issue

https://github.com/actiontech/dms-ee/issues/705

描述你的变更

  • 优化查询逻辑,支持多个层级的OR/AND逻辑运算符同时存在

确认项(pr提交后操作)

Tip

请在指定复审人之前,确认并完成以下事项,完成后✅


  • 我已完成自测
  • 我已记录完整日志方便进行诊断
  • 我已在关联的issue里补充了实现方案
  • 我已在关联的issue里补充了测试影响面
  • 我已确认了变更的兼容性,如果不兼容则在issue里标记 not_compatible
  • 我已确认了是否要更新文档,如果要更新则在issue里标记 need_update_doc


Description

  • 统一了所有模块的过滤条件构建方式

  • 将原有的 FilterBy 替换为 FilterByOptions

  • 新增辅助构造函数和 gormWheresWithOptions 方法构建组条件

  • 优化各业务层和存储层的查询过滤逻辑


Diagram Walkthrough

flowchart LR
  A["原有 FilterBy"] --> B["新 FilterByOptions"]
  B --> C["构造过滤条件组"]
  C --> D["调用 gormWheresWithOptions"]
Loading

File Walkthrough

Relevant files
Enhancement
37 files
cb_operation_log.go
使用 FilterByOptions 替换操作日志过滤条件                                                       
+4/-4     
data_export_task.go
替换数据导出任务选项中的 FilterBy 为 FilterByOptions                                   
+8/-8     
data_export_workflow.go
更新数据导出工作流逻辑中使用 FilterByOptions 构造过滤条件                                       
+4/-4     
db_service.go
修改数据库服务查询参数,使用 FilterByOptions 替换 FilterBy                             
+4/-4     
gateway.go
网关查询参数中由 FilterBy 迁移到 FilterByOptions                                       
+4/-4     
member.go
更新成员查询中过滤条件由 FilterBy 替换为 FilterByOptions                               
+24/-20 
member_group.go
成员组查询参数中由 FilterBy 改为 FilterByOptions                                       
+4/-4     
op_permission.go
操作权限查询及用户/成员权限过滤使用 FilterByOptions 替换 FilterBy                     
+41/-30 
project.go
项目查询参数更新为使用 FilterByOptions 构造过滤条件                                             
+12/-9   
role.go
角色查询过滤条件从 FilterBy 切换至 FilterByOptions                                     
+12/-9   
user.go
用户查询参数由 FilterBy 变更为 FilterByOptions                                         
+4/-4     
user_group.go
用户组查询过滤条件更新为 FilterByOptions                                                         
+4/-4     
const.go
添加 FilterByOptions、FilterLogic 及辅助构造函数                                     
+43/-0   
business_tag.go
使用 ConditionsToFilterOptions 替换 FilterBy 参数调用                       
+1/-1     
configuration.go
修改通知消息用户过滤条件,采用 FilterByOptions 构造                                             
+10/-8   
data_export_workflow.go
数据导出工作流服务中更新过滤逻辑,构造 FilterByOptions 条件组                                   
+33/-26 
db_service.go
数据库服务接口中使用 FilterByOptions 替换原有过滤条件                                           
+38/-31 
environment_tag.go
环境标签服务中调用 ListDBService 时,采用 FilterByOptions 构造过滤条件           
+1/-1     
member.go
成员服务中过滤条件构造由 FilterBy 迁移到 FilterByOptions                               
+22/-13 
member_group.go
成员组服务中过滤条件更新为 FilterByOptions 构造                                                 
+13/-7   
op_permission.go
操作权限服务中更新过滤逻辑为 FilterByOptions 构造条件组                                         
+19/-8   
project.go
项目服务中过滤条件构造由 FilterBy 变更为 FilterByOptions                               
+29/-21 
role.go
角色服务中过滤条件构造更新为 FilterByOptions                                                     
+20/-12 
user.go
用户服务中过滤条件更新为使用 FilterByOptions 构造                                               
+40/-28 
user_group.go
用户组服务中过滤条件改为使用 FilterByOptions                                                     
cb_operation_log.go
存储层操作日志查询改为通过 gormWheresWithOptions 构造过滤条件                             
+4/-3     
data_export_task.go
数据导出任务存储逻辑中使用 FilterByOptions 替换原有 FilterBy                           
+4/-4     
db_service.go
数据库服务存储层中过滤条件构造更新为 FilterByOptions                                             
+2/-2     
gateway.go
网关存储层中过滤条件由 FilterBy 改为 FilterByOptions 构造                             
+2/-2     
member.go
成员存储层中过滤条件更新为使用 FilterByOptions 构造                                             
+2/-6     
member_group.go
成员组存储层中过滤条件构造改为 FilterByOptions                                                   
+2/-6     
op_permission.go
操作权限存储层中过滤逻辑更新为 FilterByOptions 构造                                             
+2/-6     
project.go
项目存储层中过滤条件由 FilterBy 更新为 FilterByOptions                                 
+2/-6     
role.go
角色存储层中过滤条件构造及查询逻辑更新为使用 FilterByOptions                                     
+27/-16 
user.go
用户存储层中过滤条件更新为通过 FilterByOptions 构造                                             
+2/-6     
user_group.go
用户组存储层中过滤条件构造更新为 FilterByOptions                                                 
+2/-6     
workflow.go
数据导出工作流存储层中过滤条件更新为 FilterByOptions 构造                                       
+4/-4     
Additional files
1 files
storage.go +81/-10 

…consolidated FilterByOptions for improved query handling
…lterByOptions for consistent query handling and improved maintainability
…andardize filtering logic and improve query consistency
@github-actions
Copy link

github-actions bot commented Dec 4, 2025

PR Reviewer Guide 🔍

(Review updated until commit fba1ccd)

⏱️ Estimated effort to review: 4 🔵🔵🔵🔵⚪
🧪 PR contains tests
🔒 No security concerns identified
⚡ Recommended focus areas for review

过滤条件重构

本次PR中统一将旧的FilterBy替换为FilterByOptions,并新增了NewFilterOptions、NewConditionGroup以及ConditionsToFilterOptions等辅助方法。请确认这些新逻辑在所有模块下能和原有逻辑保持一致,满足所有复杂查询需求。

	FilterOperatorIn                 FilterOperator = "in"
)

type FilterLogic string

const (
	FilterLogicAnd FilterLogic = "AND"
	FilterLogicOr  FilterLogic = "OR"
)

type FilterConditionGroup struct {
	Logic      FilterLogic
	Conditions []FilterCondition
	Groups     []FilterConditionGroup
}

type FilterOptions struct {
	Logic  FilterLogic
	Groups []FilterConditionGroup
}

func NewFilterOptions(logic FilterLogic, groups ...FilterConditionGroup) FilterOptions {
	return FilterOptions{
		Logic:  logic,
		Groups: groups,
	}
}

func NewConditionGroup(logic FilterLogic, conditions ...FilterCondition) FilterConditionGroup {
	return FilterConditionGroup{
		Logic:      logic,
		Conditions: conditions,
	}
}

func ConditionsToFilterOptions(conditions []FilterCondition) FilterOptions {
	if len(conditions) == 0 {
		return FilterOptions{}
	}

	return FilterOptions{
		Logic:  FilterLogicAnd,
		Groups: []FilterConditionGroup{NewConditionGroup(FilterLogicAnd, conditions...)},
	}
}

type DBServiceSourceName string
查询条件转换

在配置服务中,通过NewFilterOptions构造查询条件的方式已经替换了原有的FilterBy写法,建议验证该改动是否正确地支持传入数组查询(如IN查询)以及其他多条件组合查询,确保业务逻辑与预期一致。

FilterByOptions: pkgConst.NewFilterOptions(pkgConst.FilterLogicAnd,
	pkgConst.NewConditionGroup(pkgConst.FilterLogicAnd,
		pkgConst.FilterCondition{
			Field:    string(biz.UserFieldUID),
			Operator: pkgConst.FilterOperatorIn,
			Value:    req.Notification.UserUids,
		},
	),
),
OrderBy: biz.UserFieldName,
PageNumber:   1,

@github-actions
Copy link

github-actions bot commented Dec 4, 2025

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
Possible issue
防止切片迭代删除问题

建议避免在遍历切片时直接删除元素,因为这种操作可能导致遗漏某些匹配项或产生未预期的迭代行为。可以先复制过滤条件,或者反向遍历后删除,从而确保所有条件都能被正确处理。

internal/dms/storage/role.go [137-147]

-for _, group := range opt.FilterByOptions.Groups {
-	for i, condition := range group.Conditions {
+copiedOptions := pkgConst.FilterOptions{
+	Logic:  opt.FilterByOptions.Logic,
+	Groups: make([]pkgConst.FilterConditionGroup, len(opt.FilterByOptions.Groups)),
+}
+for i, group := range opt.FilterByOptions.Groups {
+	// 复制当前组的条件切片
+	copiedGroup := pkgConst.NewConditionGroup(group.Logic, group.Conditions...)
+	copiedOptions.Groups[i] = copiedGroup
+}
+for gi, group := range copiedOptions.Groups {
+	for ci := len(group.Conditions) - 1; ci >= 0; ci-- {
+		condition := group.Conditions[ci]
 		if condition.Field == string(biz.RoleFieldOpPermission) {
 			opPermissionValue = condition.Value.(string)
-			// 从组中移除该条件
-			group.Conditions = append(group.Conditions[:i], group.Conditions[i+1:]...)
-			filterByOptionsWithoutOpPermission = opt.FilterByOptions
-			break
+			// 反向删除条件
+			copiedOptions.Groups[gi].Conditions = append(group.Conditions[:ci], group.Conditions[ci+1:]...)
 		}
 	}
 }
+filterByOptionsWithoutOpPermission = copiedOptions
Suggestion importance[1-10]: 8

__

Why: The suggestion correctly highlights the risk of modifying a slice while iterating over it and proposes a robust alternative using a copied slice with reverse iteration for deletion. This change improves the reliability of the filtering logic by avoiding potential skipped elements or mis-iterations.

Medium

@github-actions
Copy link

github-actions bot commented Dec 5, 2025

Persistent review updated to latest commit fba1ccd

@github-actions
Copy link

github-actions bot commented Dec 5, 2025

Failed to generate code suggestions for PR

@BugsGuru BugsGuru merged commit f4b50b3 into main Dec 5, 2025
1 check passed
@BugsGuru BugsGuru deleted the support_filter_condition branch December 5, 2025 05:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants