Skip to content

Conversation

@BugsGuru
Copy link
Collaborator

@BugsGuru BugsGuru commented Jan 4, 2026

User description

关联的 issue

https://github.com/actiontech/sqle-ee/issues/2612

描述你的变更

zip包内文件名排序规则实现自然排序

确认项(pr提交后操作)

Tip

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


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

link #3194


Description

  • 实现自然排序比较函数,支持文件名中的数字比较

  • 修改SQL审核API中文件排序逻辑为自然排序

  • 新增单元测试验证CompareNatural函数稳定性


Diagram Walkthrough

flowchart LR
  A["sqle/api/controller/v1/sql_audit_record.go"] -- "调用自然排序函数" --> B["sqle/utils/util.go (CompareNatural)"]
  B -- "测试验证" --> C["sqle/utils/util_test.go (TestCompareNatural)"]
Loading

File Walkthrough

Relevant files
Enhancement
sql_audit_record.go
API层调用自然排序函数修改                                                                                     

sqle/api/controller/v1/sql_audit_record.go

  • 修改文件排序逻辑,使用自然排序比较函数
  • 更新注释说明排序规则变化
+3/-3     
util.go
新增自然排序比较函数                                                                                             

sqle/utils/util.go

  • 新增CompareNatural函数实现自然排序
  • 实现数字与字母内容的混合比较逻辑
+95/-0   
Tests
util_test.go
新增自然排序测试用例                                                                                             

sqle/utils/util_test.go

  • 添加TestCompareNatural单元测试
  • 包含多种排序场景和边界测试用例
+94/-0   

@actiontech-bot actiontech-bot requested review from LordofAvernus and removed request for LordofAvernus January 4, 2026 06:29
@github-actions
Copy link

github-actions bot commented Jan 4, 2026

PR Reviewer Guide 🔍

🎫 Ticket compliance analysis 🔶

2612 - Partially compliant

Compliant requirements:

  • 实现zip包内文件名自然排序
  • 新增单元测试验证排序函数

Non-compliant requirements:

Requires further human verification:

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

排序逻辑调整

在接口中采用自然排序替代原有字符串排序方式,建议验证特殊情况(如空文件名和边界字符)的处理是否符合预期。

// 按文件名自然排序,确保SQL按文件顺序执行(数字按数值大小比较,如 "file2.sql" 会排在 "file11.sql" 前面)
sort.Slice(sqlsFromSQLFile, func(i, j int) bool {
	return utils.CompareNatural(sqlsFromSQLFile[i].FilePath, sqlsFromSQLFile[j].FilePath)
})
sort.Slice(sqlsFromXML, func(i, j int) bool {
	return utils.CompareNatural(sqlsFromXML[i].FilePath, sqlsFromXML[j].FilePath)
})
CompareNatural函数优化

CompareNatural函数在数字转换失败时选择字符串比较,该处理方式需确认在所有异常情况下都能保持稳定排序逻辑。

// CompareNatural 实现自然排序比较,数字按数值大小比较,非数字按字典序比较
// 例如:"file2.sql" 会排在 "file11.sql" 前面
// 返回值:如果 a < b 返回 true,否则返回 false
func CompareNatural(a, b string) bool {
	aRunes := []rune(a)
	bRunes := []rune(b)

	aLen := len(aRunes)
	bLen := len(bRunes)

	i, j := 0, 0

	for i < aLen && j < bLen {
		// 跳过前导空格
		for i < aLen && unicode.IsSpace(aRunes[i]) {
			i++
		}
		for j < bLen && unicode.IsSpace(bRunes[j]) {
			j++
		}

		if i >= aLen || j >= bLen {
			break
		}

		// 检查当前位置是否为数字
		aIsDigit := unicode.IsDigit(aRunes[i])
		bIsDigit := unicode.IsDigit(bRunes[j])

		if aIsDigit && bIsDigit {
			// 两者都是数字,提取完整的数字进行比较
			aNumStart := i
			bNumStart := j

			// 提取 a 的数字部分
			for i < aLen && unicode.IsDigit(aRunes[i]) {
				i++
			}
			// 提取 b 的数字部分
			for j < bLen && unicode.IsDigit(bRunes[j]) {
				j++
			}

			// 将数字字符串转换为整数进行比较
			aNumStr := string(aRunes[aNumStart:i])
			bNumStr := string(bRunes[bNumStart:j])

			aNum, err1 := strconv.Atoi(aNumStr)
			bNum, err2 := strconv.Atoi(bNumStr)

			// 如果转换失败,按字符串比较
			if err1 != nil || err2 != nil {
				if aNumStr < bNumStr {
					return true
				}
				if aNumStr > bNumStr {
					return false
				}
				continue
			}

			// 按数值比较
			if aNum < bNum {
				return true
			}
			if aNum > bNum {
				return false
			}
			// 数值相等,但字符串可能不同(如 "02" vs "2"),按字符串比较以保持稳定性
			if aNumStr < bNumStr {
				return true
			}
			if aNumStr > bNumStr {
				return false
			}
			// 数值和字符串都相等,继续比较下一部分
			continue
		}

		// 至少有一个不是数字,按字符比较
		if aRunes[i] < bRunes[j] {
			return true
		}
		if aRunes[i] > bRunes[j] {
			return false
		}

		i++
		j++
	}

	// 一个字符串已经比较完,较短的排在前面
	return aLen < bLen
}

@github-actions
Copy link

github-actions bot commented Jan 4, 2026

PR Code Suggestions ✨

No code suggestions found for the PR.

@LordofAvernus LordofAvernus merged commit 33844d2 into main Jan 4, 2026
4 checks passed
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