blob: 64d2e20f04135129981f53e9c62c77b3e580ca94 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package main
import (
"context"
_ "embed"
"errors"
"time"
"cloud.google.com/go/bigquery"
"google.golang.org/api/iterator"
)
const (
cloudProject = "fuchsia-infra"
// Timeout for BigQuery queries.
queryTimeout = 10 * time.Minute
)
//go:embed query.sql
var queryTemplate string
// queryLatestTestDurations runs a BigQuery query to obtain recent test duration
// data.
func queryLatestTestDurations(ctx context.Context, luciProject string, dataWindowDays int) ([]test, error) {
ctx, cancel := context.WithTimeout(ctx, queryTimeout)
defer cancel()
client, err := bigquery.NewClient(ctx, cloudProject)
if err != nil {
return nil, err
}
defer client.Close()
query := client.Query(queryTemplate)
query.Parameters = append(query.Parameters, []bigquery.QueryParameter{
{Name: "data_window_days", Value: dataWindowDays},
{Name: "project", Value: luciProject},
}...)
iter, err := query.Read(ctx)
if err != nil {
return nil, err
}
var rows []test
for {
var row test
err := iter.Next(&row)
if err == iterator.Done {
break
} else if err != nil {
return nil, err
}
rows = append(rows, row)
}
if len(rows) == 0 {
return nil, errors.New("query returned zero rows")
}
return rows, nil
}