You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: database_bigquery.go
    path of file: ./repos/datastation/runner
    
    the code of the file until where you have to start completion: package runner

import (
	"context"

	"cloud.google.com/go/bigquery"
	"google.golang.org/api/iterator"
	"google.golang.org/api/option"
)

func (ec EvalContext) evalBigQuery(panel *PanelInfo, dbInfo DatabaseConnectorInfoDatabase, w *ResultWriter) error {
	ctx := context.Background()

	token, err := ec.decrypt(&dbInfo.ApiKey)
	if err != nil {
		return err
	}

	client, err := bigquery.NewCl
    
func (ec EvalContext) evalBigQuery(panel *PanelInfo, dbInfo DatabaseConnectorInfoDatabase, w *ResultWriter) error {
	ctx := context.Background()

	token, err := ec.decrypt(&dbInfo.ApiKey)
	if err != nil {
		return err
	}

	client, err := bigquery.NewClient(ctx, dbInfo.Database, option.WithCredentialsJSON([]byte(token)))
	if err != nil {
		return err
	}

	q := client.Query(panel.Content)
	it, err := q.Read(ctx)
	if err != nil {
		return err
	}

	var fields []string
	var values []bigquery.Value

	for {
		err := it.Next(&values)
		if err == iterator.Done {
			return nil
		}
		if err != nil {
			return err
		}

		if len(fields) == 0 {
			// it.Schema is only populated after the first call to it.Next()
			for _, field := range it.Schema {
				fields = append(fields, field.Name)
			}
			w.SetFields(fields)
		}

		// bigquery seems to return more values than fields
		values = values[:len(fields)]

		err = w.WriteBigQueryRecord(values, false)
		if err != nil {
			return err
		}

		// Zeroes out "values" while preserving its capacity
		values = values[:0]
	}
}