Pre-allocate row slices.
This commit is contained in:
parent
02bae5a2cb
commit
4f81f5af63
2 changed files with 13 additions and 29 deletions
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue