jet/postgres/insert_statement.go

78 lines
2.4 KiB
Go
Raw Permalink Normal View History

2019-08-11 09:52:02 +02:00
package postgres
import "source.gleipnir.technology/Gleipnir/jet/v2/internal/jet"
2019-08-11 09:52:02 +02:00
// InsertStatement is interface for SQL INSERT statements
type InsertStatement interface {
jet.SerializerStatement
2019-08-11 09:52:02 +02:00
// Insert row of values
VALUES(value interface{}, values ...interface{}) InsertStatement
// Insert row of values, where value for each column is extracted from filed of structure data.
// If data is not struct or there is no field for every column selected, this method will panic.
MODEL(data interface{}) InsertStatement
MODELS(data interface{}) InsertStatement
QUERY(selectStatement SelectStatement) InsertStatement
ON_CONFLICT(indexExpressions ...jet.ColumnExpression) onConflict
RETURNING(projections ...Projection) InsertStatement
2019-08-11 09:52:02 +02:00
}
2019-08-11 14:29:03 +02:00
func newInsertStatement(table WritableTable, columns []jet.Column) InsertStatement {
2019-08-11 09:52:02 +02:00
newInsert := &insertStatementImpl{}
2019-08-17 18:32:01 +02:00
newInsert.SerializerStatement = jet.NewStatementImpl(Dialect, jet.InsertStatementType, newInsert,
&newInsert.Insert,
&newInsert.ValuesQuery,
&newInsert.OnConflict,
&newInsert.Returning,
)
2019-08-11 09:52:02 +02:00
newInsert.Insert.Table = table
newInsert.Insert.Columns = columns
return newInsert
}
type insertStatementImpl struct {
2019-08-17 18:32:01 +02:00
jet.SerializerStatement
2019-08-11 09:52:02 +02:00
2019-08-12 12:27:33 +02:00
Insert jet.ClauseInsert
ValuesQuery jet.ClauseValuesQuery
Returning jet.ClauseReturning
OnConflict onConflictClause
2019-08-11 09:52:02 +02:00
}
func (i *insertStatementImpl) VALUES(value interface{}, values ...interface{}) InsertStatement {
2019-08-12 12:27:33 +02:00
i.ValuesQuery.Rows = append(i.ValuesQuery.Rows, jet.UnwindRowFromValues(value, values))
2019-08-11 09:52:02 +02:00
return i
}
func (i *insertStatementImpl) MODEL(data interface{}) InsertStatement {
2019-08-12 12:27:33 +02:00
i.ValuesQuery.Rows = append(i.ValuesQuery.Rows, jet.UnwindRowFromModel(i.Insert.GetColumns(), data))
2019-08-11 09:52:02 +02:00
return i
}
func (i *insertStatementImpl) MODELS(data interface{}) InsertStatement {
2019-08-12 12:27:33 +02:00
i.ValuesQuery.Rows = append(i.ValuesQuery.Rows, jet.UnwindRowsFromModels(i.Insert.GetColumns(), data)...)
2019-08-11 09:52:02 +02:00
return i
}
func (i *insertStatementImpl) RETURNING(projections ...jet.Projection) InsertStatement {
i.Returning.ProjectionList = projections
2019-08-11 09:52:02 +02:00
return i
}
func (i *insertStatementImpl) QUERY(selectStatement SelectStatement) InsertStatement {
2019-08-12 12:27:33 +02:00
i.ValuesQuery.Query = selectStatement
2019-08-11 09:52:02 +02:00
return i
}
func (i *insertStatementImpl) ON_CONFLICT(indexExpressions ...jet.ColumnExpression) onConflict {
i.OnConflict = onConflictClause{
insertStatement: i,
indexExpressions: indexExpressions,
}
return &i.OnConflict
}