(ctx context.Context, drv dialect.Driver)
| 1505 | } |
| 1506 | |
| 1507 | func (c *batchCreator) nodes(ctx context.Context, drv dialect.Driver) error { |
| 1508 | if len(c.Nodes) == 0 { |
| 1509 | return nil |
| 1510 | } |
| 1511 | columns := make(map[string]struct{}) |
| 1512 | values := make([]map[string]driver.Value, len(c.Nodes)) |
| 1513 | for i, node := range c.Nodes { |
| 1514 | if i > 0 && node.Table != c.Nodes[i-1].Table { |
| 1515 | return fmt.Errorf("more than 1 table for batch insert: %q != %q", node.Table, c.Nodes[i-1].Table) |
| 1516 | } |
| 1517 | values[i] = make(map[string]driver.Value) |
| 1518 | if node.ID != nil && node.ID.Value != nil { |
| 1519 | columns[node.ID.Column] = struct{}{} |
| 1520 | values[i][node.ID.Column] = node.ID.Value |
| 1521 | } |
| 1522 | edges := EdgeSpecs(node.Edges).GroupRel() |
| 1523 | err := setTableColumns(node.Fields, edges, func(column string, value driver.Value) { |
| 1524 | columns[column] = struct{}{} |
| 1525 | values[i][column] = value |
| 1526 | }) |
| 1527 | if err != nil { |
| 1528 | return err |
| 1529 | } |
| 1530 | } |
| 1531 | for column := range columns { |
| 1532 | for i := range values { |
| 1533 | if _, exists := values[i][column]; !exists { |
| 1534 | if c.Nodes[i].ID != nil && column == c.Nodes[i].ID.Column { |
| 1535 | // If the ID value was provided to one of the nodes, it should be |
| 1536 | // provided to all others because this affects the way we calculate |
| 1537 | // their values in MySQL and SQLite dialects. |
| 1538 | return fmt.Errorf("inconsistent id values for batch insert") |
| 1539 | } |
| 1540 | // Assign NULL values for empty placeholders. |
| 1541 | values[i][column] = nil |
| 1542 | } |
| 1543 | } |
| 1544 | } |
| 1545 | sorted := keys(columns) |
| 1546 | insert := c.builder.Insert(c.Nodes[0].Table).Schema(c.Nodes[0].Schema).Default().Columns(sorted...) |
| 1547 | for i := range values { |
| 1548 | vs := make([]any, len(sorted)) |
| 1549 | for j, c := range sorted { |
| 1550 | vs[j] = values[i][c] |
| 1551 | } |
| 1552 | insert.Values(vs...) |
| 1553 | } |
| 1554 | tx, err := c.mayTx(ctx, drv) |
| 1555 | if err != nil { |
| 1556 | return err |
| 1557 | } |
| 1558 | c.tx = tx |
| 1559 | if err := func() error { |
| 1560 | // In case the spec does not contain an ID field, we assume |
| 1561 | // we interact with an edge-schema with composite primary key. |
| 1562 | if c.Nodes[0].ID == nil { |
| 1563 | c.ensureConflict(insert) |
| 1564 | query, args := insert.Query() |
no test coverage detected