aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/coveragedb
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2024-11-06 17:18:44 +0100
committerTaras Madan <tarasmadan@google.com>2024-11-07 12:29:21 +0000
commitb727b13b371c02598242821ea230ed2e9f53e305 (patch)
treec194eb01fad74dd67aa3968d7d787b68000fee70 /pkg/coveragedb
parent867e44df36d93e8127938eca6f6a5c339a2ba0b8 (diff)
dashboard/app: read lines coverage from spanner
We currently merge bigquery data for every line coverage request. Let's read cached lines coverage data from spanner instead. It allows to get only 1 file version from git and skip the data merge step.
Diffstat (limited to 'pkg/coveragedb')
-rw-r--r--pkg/coveragedb/spanner.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/pkg/coveragedb/spanner.go b/pkg/coveragedb/spanner.go
index 0ff3a3197..54fa2e192 100644
--- a/pkg/coveragedb/spanner.go
+++ b/pkg/coveragedb/spanner.go
@@ -6,6 +6,7 @@ package coveragedb
import (
"context"
"fmt"
+ "os"
"time"
"cloud.google.com/go/civil"
@@ -89,6 +90,64 @@ func SaveMergeResult(ctx context.Context, projectID string, covMap map[string]*C
return nil
}
+type linesCoverage struct {
+ LinesInstrumented []int64
+ HitCounts []int64
+}
+
+func linesCoverageStmt(ns, filepath, commit string, timePeriod TimePeriod) spanner.Statement {
+ return spanner.Statement{
+ SQL: `
+select
+ linesinstrumented,
+ hitcounts
+from merge_history
+ join files
+ on merge_history.session = files.session
+where
+ namespace=$1 and dateto=$2 and duration=$3 and filepath=$4 and commit=$5`,
+ Params: map[string]interface{}{
+ "p1": ns,
+ "p2": timePeriod.DateTo,
+ "p3": timePeriod.Days,
+ "p4": filepath,
+ "p5": commit,
+ },
+ }
+}
+
+func ReadLinesHitCount(ctx context.Context, ns, commit, file string, tp TimePeriod,
+) (map[int]int, error) {
+ projectID := os.Getenv("GOOGLE_CLOUD_PROJECT")
+ client, err := NewClient(ctx, projectID)
+ if err != nil {
+ return nil, fmt.Errorf("spanner.NewClient: %w", err)
+ }
+ defer client.Close()
+
+ stmt := linesCoverageStmt(ns, file, commit, tp)
+ iter := client.Single().Query(ctx, stmt)
+ defer iter.Stop()
+
+ row, err := iter.Next()
+ if err == iterator.Done {
+ return nil, nil
+ }
+ if err != nil {
+ return nil, fmt.Errorf("iter.Next: %w", err)
+ }
+ var r linesCoverage
+ if err = row.ToStruct(&r); err != nil {
+ return nil, fmt.Errorf("failed to row.ToStruct() spanner DB: %w", err)
+ }
+
+ res := map[int]int{}
+ for i, instrLine := range r.LinesInstrumented {
+ res[int(instrLine)] = int(r.HitCounts[i])
+ }
+ return res, nil
+}
+
func historyMutation(session string, template *HistoryRecord, totalRows int64) *spanner.Mutation {
historyInsert, err := spanner.InsertOrUpdateStruct("merge_history", &HistoryRecord{
Session: session,