Pre-allocate row slices.

This commit is contained in:
go-jet 2025-10-18 14:54:18 +02:00
parent 02bae5a2cb
commit 4f81f5af63
2 changed files with 13 additions and 29 deletions

View file

@ -214,7 +214,7 @@ stmt := SELECT(
> Package(dot) import is used, so the statements look as close as possible to the native SQL. > Package(dot) import is used, so the statements look as close as possible to the native SQL.
Note that every column has a type. String columns, such as `Language.Name` and `Category.Name` can only be compared with Note that every column has a type. String columns, such as `Language.Name` and `Category.Name` can only be compared with
string columns and expressions. Similarity, `Actor.ActorID`, `FilmActor.ActorID`, `Film.Length` are integer columns string columns and expressions. Similarly, `Actor.ActorID`, `FilmActor.ActorID`, `Film.Length` are integer columns
and can only be compared with integer columns and expressions. The same type safety rules apply to arrays and their and can only be compared with integer columns and expressions. The same type safety rules apply to arrays and their
element types. element types.

View file

@ -167,11 +167,11 @@ func ToSerializerValue(value interface{}) Serializer {
func UnwindRowFromModel(columns []Column, data interface{}) []Serializer { func UnwindRowFromModel(columns []Column, data interface{}) []Serializer {
structValue := reflect.Indirect(reflect.ValueOf(data)) structValue := reflect.Indirect(reflect.ValueOf(data))
row := []Serializer{} row := make([]Serializer, len(columns))
must.ValueBeOfTypeKind(structValue, reflect.Struct, "jet: data has to be a struct") must.ValueBeOfTypeKind(structValue, reflect.Struct, "jet: data has to be a struct")
for _, column := range columns { for i, column := range columns {
columnName := column.Name() columnName := column.Name()
structFieldName := dbidentifier.ToGoIdentifier(columnName) structFieldName := dbidentifier.ToGoIdentifier(columnName)
@ -189,7 +189,7 @@ func UnwindRowFromModel(columns []Column, data interface{}) []Serializer {
field = reflect.Indirect(structField).Interface() field = reflect.Indirect(structField).Interface()
} }
row = append(row, literal(field)) row[i] = literal(field)
} }
return row return row
@ -200,12 +200,13 @@ func UnwindRowsFromModels(columns []Column, data interface{}) [][]Serializer {
sliceValue := reflect.Indirect(reflect.ValueOf(data)) sliceValue := reflect.Indirect(reflect.ValueOf(data))
must.ValueBeOfTypeKind(sliceValue, reflect.Slice, "jet: data has to be a slice.") must.ValueBeOfTypeKind(sliceValue, reflect.Slice, "jet: data has to be a slice.")
rows := [][]Serializer{} sliceLen := sliceValue.Len()
rows := make([][]Serializer, sliceLen)
for i := 0; i < sliceValue.Len(); i++ { for i := 0; i < sliceLen; i++ {
structValue := sliceValue.Index(i) structValue := sliceValue.Index(i)
rows = append(rows, UnwindRowFromModel(columns, structValue.Interface())) rows[i] = UnwindRowFromModel(columns, structValue.Interface())
} }
return rows return rows
@ -213,37 +214,20 @@ func UnwindRowsFromModels(columns []Column, data interface{}) [][]Serializer {
// UnwindRowFromValues func // UnwindRowFromValues func
func UnwindRowFromValues(value interface{}, values []interface{}) []Serializer { func UnwindRowFromValues(value interface{}, values []interface{}) []Serializer {
row := []Serializer{}
allValues := append([]interface{}{value}, values...) allValues := append([]interface{}{value}, values...)
for _, val := range allValues { row := make([]Serializer, len(allValues))
row = append(row, ToSerializerValue(val))
for i, val := range allValues {
row[i] = ToSerializerValue(val)
} }
return row return row
} }
// UnwindColumns func
func UnwindColumns(column1 Column, columns ...Column) []Column {
columnList := []Column{}
if val, ok := column1.(ColumnList); ok {
for _, col := range val {
columnList = append(columnList, col)
}
columnList = append(columnList, columns...)
} else {
columnList = append(columnList, column1)
columnList = append(columnList, columns...)
}
return columnList
}
// UnwidColumnList func // UnwidColumnList func
func UnwidColumnList(columns []Column) []Column { func UnwidColumnList(columns []Column) []Column {
ret := []Column{} var ret []Column
for _, col := range columns { for _, col := range columns {
if columnList, ok := col.(ColumnList); ok { if columnList, ok := col.(ColumnList); ok {