jet/internal/jet/utils.go

190 lines
3.9 KiB
Go
Raw Normal View History

2019-06-21 13:56:57 +02:00
package jet
2019-04-14 17:55:10 +02:00
2019-04-20 19:49:29 +02:00
import (
2019-07-04 17:54:15 +02:00
"github.com/go-jet/jet/internal/utils"
2019-06-05 17:15:20 +02:00
"reflect"
2019-04-20 19:49:29 +02:00
)
2019-04-14 17:55:10 +02:00
2019-08-17 18:32:01 +02:00
// SerializeClauseList func
func SerializeClauseList(statement StatementType, clauses []Serializer, out *SQLBuilder) {
2019-05-07 19:06:21 +02:00
for i, c := range clauses {
if i > 0 {
2019-08-03 14:10:47 +02:00
out.WriteString(", ")
2019-05-07 19:06:21 +02:00
}
if c == nil {
panic("jet: nil clause")
2019-05-07 19:06:21 +02:00
}
c.serialize(statement, out)
2019-05-07 19:06:21 +02:00
}
}
2019-08-17 18:32:01 +02:00
func serializeExpressionList(statement StatementType, expressions []Expression, separator string, out *SQLBuilder) {
for i, value := range expressions {
if i > 0 {
2019-08-03 14:10:47 +02:00
out.WriteString(separator)
}
value.serialize(statement, out)
2019-04-14 17:55:10 +02:00
}
}
2019-04-20 19:49:29 +02:00
2019-08-17 18:32:01 +02:00
// SerializeProjectionList func
func SerializeProjectionList(statement StatementType, projections []Projection, out *SQLBuilder) {
for i, col := range projections {
if i > 0 {
2019-08-03 14:10:47 +02:00
out.WriteString(",")
2019-08-11 12:13:59 +02:00
out.NewLine()
}
2019-05-12 18:15:23 +02:00
if col == nil {
panic("jet: Projection is nil")
}
col.serializeForProjection(statement, out)
}
}
2019-08-17 18:32:01 +02:00
// SerializeColumnNames func
func SerializeColumnNames(columns []Column, out *SQLBuilder) {
for i, col := range columns {
if i > 0 {
2019-08-03 14:10:47 +02:00
out.WriteString(", ")
}
if col == nil {
panic("jet: nil column in columns list")
}
2019-08-03 14:10:47 +02:00
out.WriteString(col.Name())
}
}
2019-12-08 11:07:49 +01:00
// ExpressionListToSerializerList converts list of expressions to list of serializers
func ExpressionListToSerializerList(expressions []Expression) []Serializer {
var ret []Serializer
for _, expr := range expressions {
ret = append(ret, expr)
}
return ret
}
2019-08-17 18:32:01 +02:00
// ColumnListToProjectionList func
2019-08-11 14:29:03 +02:00
func ColumnListToProjectionList(columns []ColumnExpression) []Projection {
2019-08-03 14:10:47 +02:00
var ret []Projection
for _, column := range columns {
ret = append(ret, column)
}
return ret
}
2019-08-11 09:52:02 +02:00
func valueToClause(value interface{}) Serializer {
if clause, ok := value.(Serializer); ok {
return clause
}
2019-07-18 17:43:11 +02:00
return literal(value)
}
2019-08-17 18:32:01 +02:00
// UnwindRowFromModel func
2019-08-11 14:29:03 +02:00
func UnwindRowFromModel(columns []Column, data interface{}) []Serializer {
structValue := reflect.Indirect(reflect.ValueOf(data))
2019-08-11 09:52:02 +02:00
row := []Serializer{}
utils.ValueMustBe(structValue, reflect.Struct, "jet: data has to be a struct")
for _, column := range columns {
columnName := column.Name()
2019-07-04 17:54:15 +02:00
structFieldName := utils.ToGoIdentifier(columnName)
structField := structValue.FieldByName(structFieldName)
if !structField.IsValid() {
2019-08-12 11:33:46 +02:00
panic("missing struct field for column : " + columnName)
}
var field interface{}
if structField.Kind() == reflect.Ptr && structField.IsNil() {
field = nil
} else {
field = reflect.Indirect(structField).Interface()
}
row = append(row, literal(field))
}
return row
}
2019-08-17 18:32:01 +02:00
// UnwindRowsFromModels func
2019-08-11 14:29:03 +02:00
func UnwindRowsFromModels(columns []Column, data interface{}) [][]Serializer {
sliceValue := reflect.Indirect(reflect.ValueOf(data))
utils.ValueMustBe(sliceValue, reflect.Slice, "jet: data has to be a slice.")
2019-08-11 09:52:02 +02:00
rows := [][]Serializer{}
for i := 0; i < sliceValue.Len(); i++ {
structValue := sliceValue.Index(i)
2019-08-11 09:52:02 +02:00
rows = append(rows, UnwindRowFromModel(columns, structValue.Interface()))
}
return rows
}
2019-08-17 18:32:01 +02:00
// UnwindRowFromValues func
2019-08-11 09:52:02 +02:00
func UnwindRowFromValues(value interface{}, values []interface{}) []Serializer {
row := []Serializer{}
allValues := append([]interface{}{value}, values...)
for _, val := range allValues {
row = append(row, valueToClause(val))
}
return row
}
2019-08-17 18:32:01 +02:00
// UnwindColumns func
func UnwindColumns(column1 Column, columns ...Column) []Column {
columnList := []Column{}
if val, ok := column1.(ColumnList); ok {
for _, col := range val {
2019-08-17 18:32:01 +02:00
columnList = append(columnList, col)
}
columnList = append(columnList, columns...)
} else {
columnList = append(columnList, column1)
columnList = append(columnList, columns...)
}
return columnList
}
// UnwidColumnList func
func UnwidColumnList(columns []Column) []Column {
ret := []Column{}
for _, col := range columns {
if columnList, ok := col.(ColumnList); ok {
for _, c := range columnList {
2019-08-17 18:32:01 +02:00
ret = append(ret, c)
}
} else {
ret = append(ret, col)
}
}
return ret
}