Răsfoiți Sursa

feat(sharding): 实现无时间筛选时返回所有表数据

- 修改 GetQueryTableNames 函数,增加处理 start 和 end 都为 nil 的情况
- 新增 getAllPossibleTableNames 方法,用于获取所有可能的表名
- 更新 waflog 仓库中的 GetWafLogList 方法,移除时间筛选逻辑
fusu 17 ore în urmă
părinte
comite
5bd187c7e4
2 a modificat fișierele cu 27 adăugiri și 7 ștergeri
  1. 5 5
      internal/repository/admin/waflog.go
  2. 22 2
      pkg/sharding/manager.go

+ 5 - 5
internal/repository/admin/waflog.go

@@ -100,13 +100,13 @@ func (r *wafLogRepository) GetWafLog(ctx context.Context, id int64) (*model.WafL
 func (r *wafLogRepository) GetWafLogList(ctx context.Context, req adminApi.SearchWafLogParams) (*v1.PaginatedResponse[model.WafLog], error) {
 
 	
-	// 解析时间范围(如果有的话)
-	var startTime, endTime *time.Time
-	// TODO: 这里可以根据req中的时间字段来确定查询范围
-	// 暂时查询最近3个月的数据
+	//// 解析时间范围(如果有的话)
+	//var startTime, endTime *time.Time
+	//// TODO: 这里可以根据req中的时间字段来确定查询范围
+	//// 暂时查询最近3个月的数据
 	
 	// 获取需要查询的表
-	existingTables := r.Manager.GetTableNamesWithExistenceCheck(r.DBWithName(ctx, "admin"), "waf_log", startTime, endTime)
+	existingTables := r.Manager.GetTableNamesWithExistenceCheck(r.DBWithName(ctx, "admin"), "waf_log", nil, nil)
 	
 	if len(existingTables) == 0 {
 		// 没有分表,返回空结果

+ 22 - 2
pkg/sharding/manager.go

@@ -70,8 +70,11 @@ func (sm *ShardingManager) GetCurrentTableName(baseTableName string) string {
 
 // GetQueryTableNames 获取查询需要的所有表名
 func (sm *ShardingManager) GetQueryTableNames(baseTableName string, start, end *time.Time) []string {
-	if start == nil || end == nil {
-		// 如果没有指定时间范围,默认查询最近3个月的表
+	if start == nil && end == nil {
+		// 如果都为nil,返回所有可能的表名(用于显示所有数据)
+		return sm.getAllPossibleTableNames(baseTableName)
+	} else if start == nil || end == nil {
+		// 如果只有一个为nil,默认查询最近3个月的表
 		now := time.Now()
 		defaultStart := now.AddDate(0, -2, 0) // 前2个月
 		defaultEnd := now
@@ -80,6 +83,23 @@ func (sm *ShardingManager) GetQueryTableNames(baseTableName string, start, end *
 	return sm.strategy.GetTableNamesByRange(baseTableName, *start, *end)
 }
 
+// getAllPossibleTableNames 直接从数据库中查找所有符合模式的表名
+func (sm *ShardingManager) getAllPossibleTableNames(baseTableName string) []string {
+	// 使用数据库查找所有符合模式的表,而不是基于时间推测
+	// 查找基础分表模式: log_202408, log_202407 等
+	basePattern := fmt.Sprintf("%s_\\d{6}", baseTableName) // 例如: log_202408
+	baseTables := sm.findTablesByPattern(nil, basePattern)
+	
+	// 查找序列分表模式: log_202408_01, log_202408_02 等  
+	sequencePattern := fmt.Sprintf("%s_\\d{6}_\\d+", baseTableName) // 例如: log_202408_01
+	sequenceTables := sm.findTablesByPattern(nil, sequencePattern)
+	
+	// 合并结果
+	allTables := append(baseTables, sequenceTables...)
+	
+	return allTables
+}
+
 // EnsureTableExists 确保表存在,不存在则创建
 func (sm *ShardingManager) EnsureTableExists(ctx context.Context, db *gorm.DB, tableName string, model interface{}) error {
 	// 检查表是否存在