aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/coveragedb
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2025-06-05 12:33:57 +0200
committerAlexander Potapenko <glider@google.com>2025-06-06 07:48:46 +0000
commit3d899f2c5e1c5ec45e9d84a30170aa09360c1045 (patch)
tree806e31e306e92f0a47babc7eccaaf2ee24c4a2b3 /pkg/coveragedb
parent6b6b5f21aadcc3fc3ccd91da0b782a4307229d70 (diff)
dashboard/app: ns/cover?jsonl=1 supports manager and subsystem selection
1. Refactor handleHeatmap. 2. Introduce function options. Build them from http.Request.
Diffstat (limited to 'pkg/coveragedb')
-rw-r--r--pkg/coveragedb/coveragedb.go32
-rw-r--r--pkg/coveragedb/time_period.go2
2 files changed, 23 insertions, 11 deletions
diff --git a/pkg/coveragedb/coveragedb.go b/pkg/coveragedb/coveragedb.go
index 50fbd0633..6741e72d1 100644
--- a/pkg/coveragedb/coveragedb.go
+++ b/pkg/coveragedb/coveragedb.go
@@ -409,10 +409,10 @@ type SelectScope struct {
// FilesCoverageStream streams information about all the line coverage.
// It is expensive and better to be used for time insensitive operations.
-func FilesCoverageStream(ctx context.Context, client spannerclient.SpannerClient, ns string, timePeriod TimePeriod,
+func FilesCoverageStream(ctx context.Context, client spannerclient.SpannerClient, scope *SelectScope,
) (<-chan *FileCoverageWithLineInfo, <-chan error) {
iter := client.Single().Query(ctx,
- filesCoverageWithDetailsStmt(ns, "", "", timePeriod, true))
+ filesCoverageWithDetailsStmt(scope, true))
resCh := make(chan *FileCoverageWithLineInfo)
errCh := make(chan error)
go func() {
@@ -435,14 +435,24 @@ func FilesCoverageWithDetails(
for _, timePeriod := range scope.Periods {
needLinesDetails := onlyUnique
iterManager := client.Single().Query(ctx,
- filesCoverageWithDetailsStmt(scope.Ns, scope.Subsystem, scope.Manager, timePeriod, needLinesDetails))
+ filesCoverageWithDetailsStmt(&SelectScope{
+ Ns: scope.Ns,
+ Subsystem: scope.Subsystem,
+ Manager: scope.Manager,
+ Periods: []TimePeriod{timePeriod},
+ }, needLinesDetails))
defer iterManager.Stop()
var err error
var periodRes []*FileCoverageWithDetails
if onlyUnique {
iterAll := client.Single().Query(ctx,
- filesCoverageWithDetailsStmt(scope.Ns, scope.Subsystem, "", timePeriod, needLinesDetails))
+ filesCoverageWithDetailsStmt(&SelectScope{
+ Ns: scope.Ns,
+ Subsystem: scope.Subsystem,
+ Manager: "",
+ Periods: []TimePeriod{timePeriod},
+ }, needLinesDetails))
defer iterAll.Stop()
periodRes, err = readCoverageUniq(iterAll, iterManager)
if err != nil {
@@ -462,8 +472,8 @@ func FilesCoverageWithDetails(
return res, nil
}
-func filesCoverageWithDetailsStmt(ns, subsystem, manager string, timePeriod TimePeriod, withLines bool,
-) spanner.Statement {
+func filesCoverageWithDetailsStmt(scope *SelectScope, withLines bool) spanner.Statement {
+ manager := scope.Manager
if manager == "" {
manager = "*"
}
@@ -481,15 +491,15 @@ from merge_history
where
merge_history.namespace=$1 and dateto=$2 and duration=$3 and manager=$4`,
Params: map[string]interface{}{
- "p1": ns,
- "p2": timePeriod.DateTo,
- "p3": timePeriod.Days,
+ "p1": scope.Ns,
+ "p2": scope.Periods[0].DateTo,
+ "p3": scope.Periods[0].Days,
"p4": manager,
},
}
- if subsystem != "" {
+ if scope.Subsystem != "" {
stmt.SQL += " and $5=ANY(subsystems)"
- stmt.Params["p5"] = subsystem
+ stmt.Params["p5"] = scope.Subsystem
}
stmt.SQL += "\norder by files.filepath"
return stmt
diff --git a/pkg/coveragedb/time_period.go b/pkg/coveragedb/time_period.go
index 9af61d1a8..37ec6aa27 100644
--- a/pkg/coveragedb/time_period.go
+++ b/pkg/coveragedb/time_period.go
@@ -41,6 +41,8 @@ const (
QuarterPeriod = "quarter"
)
+var AllPeriods = []string{DayPeriod, MonthPeriod, QuarterPeriod}
+
var errUnknownTimePeriodType = errors.New("unknown time period type")
func MinMaxDays(periodType string) (int, int, error) {