Skip to content

Commit 787e7cd

Browse files
committed
dashboard/app: prepare for spanner migrations
If the code uses "select *", it's not possible to update spanner schema. Adding a field to spanner first leads to "missing field in Go struct" errors, adding a field to Go struct first leads to "missing field in spanner" errors. Replace "select *" with concrete set of fields the code knowns about. This should allow adding fields to spanner first.
1 parent e31fcc9 commit 787e7cd

File tree

1 file changed

+27
-6
lines changed

1 file changed

+27
-6
lines changed

dashboard/app/aidb/crud.go

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"fmt"
99
"reflect"
10+
"strings"
1011
"time"
1112

1213
"cloud.google.com/go/spanner"
@@ -28,7 +29,7 @@ func init() {
2829

2930
func LoadWorkflows(ctx context.Context) ([]*Workflow, error) {
3031
return selectAll[Workflow](ctx, spanner.Statement{
31-
SQL: `SELECT * FROM Workflows`,
32+
SQL: selectWorkflows(),
3233
})
3334
}
3435

@@ -113,7 +114,7 @@ func StartJob(ctx context.Context, req *dashapi.AIJobPollReq) (*Job, error) {
113114
_, err = client.ReadWriteTransaction(ctx, func(ctx context.Context, txn *spanner.ReadWriteTransaction) error {
114115
{
115116
iter := txn.Query(ctx, spanner.Statement{
116-
SQL: `SELECT * FROM Jobs WHERE Workflow IN UNNEST(@workflows)
117+
SQL: selectJobs() + `WHERE Workflow IN UNNEST(@workflows)
117118
AND Started IS NULL
118119
ORDER BY Created ASC LIMIT 1`,
119120
Params: map[string]any{
@@ -144,7 +145,7 @@ func StartJob(ctx context.Context, req *dashapi.AIJobPollReq) (*Job, error) {
144145

145146
func LoadNamespaceJobs(ctx context.Context, ns string) ([]*Job, error) {
146147
return selectAll[Job](ctx, spanner.Statement{
147-
SQL: `SELECT * FROM Jobs WHERE Namespace = @ns ORDER BY Created DESC`,
148+
SQL: selectJobs() + `WHERE Namespace = @ns ORDER BY Created DESC`,
148149
Params: map[string]any{
149150
"ns": ns,
150151
},
@@ -153,7 +154,7 @@ func LoadNamespaceJobs(ctx context.Context, ns string) ([]*Job, error) {
153154

154155
func LoadBugJobs(ctx context.Context, bugID string) ([]*Job, error) {
155156
return selectAll[Job](ctx, spanner.Statement{
156-
SQL: `SELECT * FROM Jobs WHERE BugID = @bugID ORDER BY Created DESC`,
157+
SQL: selectJobs() + `WHERE BugID = @bugID ORDER BY Created DESC`,
157158
Params: map[string]any{
158159
"bugID": bugID,
159160
},
@@ -162,7 +163,7 @@ func LoadBugJobs(ctx context.Context, bugID string) ([]*Job, error) {
162163

163164
func LoadJob(ctx context.Context, id string) (*Job, error) {
164165
return selectOne[Job](ctx, spanner.Statement{
165-
SQL: `SELECT * FROM Jobs WHERE ID = @id`,
166+
SQL: selectJobs() + `WHERE ID = @id`,
166167
Params: map[string]any{
167168
"id": id,
168169
},
@@ -201,7 +202,7 @@ func StoreTrajectorySpan(ctx context.Context, jobID string, span *trajectory.Spa
201202

202203
func LoadTrajectory(ctx context.Context, jobID string) ([]*TrajectorySpan, error) {
203204
return selectAll[TrajectorySpan](ctx, spanner.Statement{
204-
SQL: `SELECT * FROM TrajectorySpans WHERE JobID = @job_id ORDER BY Seq ASC`,
205+
SQL: selectTrajectorySpans() + `WHERE JobID = @job_id ORDER BY Seq ASC`,
205206
Params: map[string]any{
206207
"job_id": jobID,
207208
},
@@ -252,6 +253,26 @@ var TimeNow = func(ctx context.Context) time.Time {
252253
return time.Now()
253254
}
254255

256+
func selectWorkflows() string {
257+
return selectAllFrom[Workflow]("Workflows")
258+
}
259+
260+
func selectJobs() string {
261+
return selectAllFrom[Job]("Jobs")
262+
}
263+
264+
func selectTrajectorySpans() string {
265+
return selectAllFrom[TrajectorySpan]("TrajectorySpans")
266+
}
267+
268+
func selectAllFrom[T any](table string) string {
269+
var fields []string
270+
for _, field := range reflect.VisibleFields(reflect.TypeFor[T]()) {
271+
fields = append(fields, field.Name)
272+
}
273+
return fmt.Sprintf("SELECT %v FROM %v ", strings.Join(fields, ", "), table)
274+
}
275+
255276
func toNullJSON(v map[string]any) spanner.NullJSON {
256277
if v == nil {
257278
return spanner.NullJSON{}

0 commit comments

Comments
 (0)