writeSelectFields writes the field list for a Select, recursing into children.
(buf *bytes.Buffer, sel *qcode.Select, selects []qcode.Select)
| 365 | |
| 366 | // writeSelectFields writes the field list for a Select, recursing into children. |
| 367 | func writeSelectFields(buf *bytes.Buffer, sel *qcode.Select, selects []qcode.Select) { |
| 368 | first := true |
| 369 | for _, f := range sel.Fields { |
| 370 | if !first { |
| 371 | buf.WriteString(" ") |
| 372 | } |
| 373 | first = false |
| 374 | buf.WriteString(f.FieldName) |
| 375 | } |
| 376 | |
| 377 | // Recurse into child selects (nested relationships within the same target DB) |
| 378 | for _, cid := range sel.Children { |
| 379 | csel := &selects[cid] |
| 380 | // Skip independent cross-database join children. When the parent is |
| 381 | // already a database-join select, its children are passthrough fields for |
| 382 | // the target database subquery and must be preserved. |
| 383 | if sel.SkipRender != qcode.SkipTypeDatabaseJoin && |
| 384 | (csel.SkipRender == qcode.SkipTypeDatabaseJoin || csel.SkipRender == qcode.SkipTypeRemote) { |
| 385 | continue |
| 386 | } |
| 387 | if !first { |
| 388 | buf.WriteString(" ") |
| 389 | } |
| 390 | first = false |
| 391 | buf.WriteString(csel.FieldName) |
| 392 | buf.WriteString(" { ") |
| 393 | writeSelectFields(buf, csel, selects) |
| 394 | buf.WriteString(" }") |
| 395 | } |
| 396 | } |
| 397 | |
| 398 | // databaseJoinFieldIds finds fields that require cross-database joins. |
| 399 | func (s *gstate) databaseJoinFieldIds() ([][]byte, map[string]*qcode.Select, error) { |