Skip to content

Commit 4f81f5a

Browse files
committed
Pre-allocate row slices.
1 parent 02bae5a commit 4f81f5a

File tree

2 files changed

+13
-29
lines changed

2 files changed

+13
-29
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ stmt := SELECT(
214214
> Package(dot) import is used, so the statements look as close as possible to the native SQL.
215215
216216
Note that every column has a type. String columns, such as `Language.Name` and `Category.Name` can only be compared with
217-
string columns and expressions. Similarity, `Actor.ActorID`, `FilmActor.ActorID`, `Film.Length` are integer columns
217+
string columns and expressions. Similarly, `Actor.ActorID`, `FilmActor.ActorID`, `Film.Length` are integer columns
218218
and can only be compared with integer columns and expressions. The same type safety rules apply to arrays and their
219219
element types.
220220

internal/jet/utils.go

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,11 @@ func ToSerializerValue(value interface{}) Serializer {
167167
func UnwindRowFromModel(columns []Column, data interface{}) []Serializer {
168168
structValue := reflect.Indirect(reflect.ValueOf(data))
169169

170-
row := []Serializer{}
170+
row := make([]Serializer, len(columns))
171171

172172
must.ValueBeOfTypeKind(structValue, reflect.Struct, "jet: data has to be a struct")
173173

174-
for _, column := range columns {
174+
for i, column := range columns {
175175
columnName := column.Name()
176176
structFieldName := dbidentifier.ToGoIdentifier(columnName)
177177

@@ -189,7 +189,7 @@ func UnwindRowFromModel(columns []Column, data interface{}) []Serializer {
189189
field = reflect.Indirect(structField).Interface()
190190
}
191191

192-
row = append(row, literal(field))
192+
row[i] = literal(field)
193193
}
194194

195195
return row
@@ -200,50 +200,34 @@ func UnwindRowsFromModels(columns []Column, data interface{}) [][]Serializer {
200200
sliceValue := reflect.Indirect(reflect.ValueOf(data))
201201
must.ValueBeOfTypeKind(sliceValue, reflect.Slice, "jet: data has to be a slice.")
202202

203-
rows := [][]Serializer{}
203+
sliceLen := sliceValue.Len()
204+
rows := make([][]Serializer, sliceLen)
204205

205-
for i := 0; i < sliceValue.Len(); i++ {
206+
for i := 0; i < sliceLen; i++ {
206207
structValue := sliceValue.Index(i)
207208

208-
rows = append(rows, UnwindRowFromModel(columns, structValue.Interface()))
209+
rows[i] = UnwindRowFromModel(columns, structValue.Interface())
209210
}
210211

211212
return rows
212213
}
213214

214215
// UnwindRowFromValues func
215216
func UnwindRowFromValues(value interface{}, values []interface{}) []Serializer {
216-
row := []Serializer{}
217-
218217
allValues := append([]interface{}{value}, values...)
219218

220-
for _, val := range allValues {
221-
row = append(row, ToSerializerValue(val))
222-
}
223-
224-
return row
225-
}
226-
227-
// UnwindColumns func
228-
func UnwindColumns(column1 Column, columns ...Column) []Column {
229-
columnList := []Column{}
219+
row := make([]Serializer, len(allValues))
230220

231-
if val, ok := column1.(ColumnList); ok {
232-
for _, col := range val {
233-
columnList = append(columnList, col)
234-
}
235-
columnList = append(columnList, columns...)
236-
} else {
237-
columnList = append(columnList, column1)
238-
columnList = append(columnList, columns...)
221+
for i, val := range allValues {
222+
row[i] = ToSerializerValue(val)
239223
}
240224

241-
return columnList
225+
return row
242226
}
243227

244228
// UnwidColumnList func
245229
func UnwidColumnList(columns []Column) []Column {
246-
ret := []Column{}
230+
var ret []Column
247231

248232
for _, col := range columns {
249233
if columnList, ok := col.(ColumnList); ok {

0 commit comments

Comments
 (0)