【架构优化】从 businessExecutionDuration 中拆出区间并集求和 unionDuration

Ouverte
#436 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

@fx-kurumi y travaille déjà.

Depuis le 13/11/2026.

  • #437 par @fx-kurumi — ouverte

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
25/100
Type d'issue
Refactorisation
Clarté
Clairement spécifiée
Activité
À l'abandon
Stack technique
go
Domaine
backend

Piste de recherche

The logic lives in businessExecutionDuration in internal/repo/analytics_business_delivery.go, at the end of the function where intervals are sorted, merged and summed. Read that function, then extract the merge-and-sum loop into a package-private unionDuration helper. Done means the helper has table-driven tests for empty, disjoint, overlapping, nested, touching and unsorted input, and go test ./internal/repo/ passes. Linked PR #437 already covers this work, so check with maintainers before starting.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

现状问题

internal/repo/analytics_business_delivery.go 中 businessExecutionDuration 约 85 行,同时承担三件事:筛选可计入的 run、逐 run 收集并裁剪执行区间、最后对区间排序 → 合并重叠 → 求总时长。末尾的「区间并集求和」是一段与业务无关的纯算法(约 15 行双层循环),内联在长函数里,既不便阅读,也无法单独测试。

重构方案

在同文件内抽出包级纯函数:

// unionDuration 返回区间并集的总时长(重叠/相接的区间只计一次)。
func unionDuration(intervals []domain.RunExecutionInterval) time.Duration

businessExecutionDuration 末尾改为 value := unionDuration(intervals).Milliseconds()。排序、合并条件(!StartedAt.After(FinishedAt),相接也合并)逐字保留。

影响范围

  • 仅 internal/repo/analytics_business_delivery.go,包内私有函数,无对外接口变化,无行为变化。
  • 不改 domain/run_timing.go 中同类逻辑(跨包,不在本次范围)。

验证方式

  • 新增 unionDuration 表驱动单测:空输入、单区间、不相交、重叠、包含、首尾相接、乱序输入。
  • 既有 TestBusinessExecutionDuration* 等用例保持通过;go vet ./internal/repo/、go test ./internal/repo/。
Langage dominant
Go
Étoiles
141
Forks
28
Merge moyen
1 j 15 h
PR mergées (30 j)
113

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de Tencent/LoopForge

Toutes les issues de Tencent/LoopForge

Issues similaires

Plus d'issues Go

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.