jet/utils.go

186 lines
3.4 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 (
"errors"
"github.com/serenize/snaker"
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-06-04 12:10:23 +02:00
func serializeOrderByClauseList(statement statementType, orderByClauses []OrderByClause, out *queryData) error {
for i, value := range orderByClauses {
2019-04-14 17:55:10 +02:00
if i > 0 {
out.writeString(", ")
2019-04-14 17:55:10 +02:00
}
2019-06-11 12:47:35 +02:00
err := value.serializeForOrderBy(statement, out)
2019-04-14 17:55:10 +02:00
if err != nil {
return err
}
}
return nil
}
func serializeGroupByClauseList(statement statementType, clauses []groupByClause, out *queryData) (err error) {
for i, c := range clauses {
2019-04-14 17:55:10 +02:00
if i > 0 {
out.writeString(", ")
}
if c == nil {
return errors.New("nil clause.")
2019-04-14 17:55:10 +02:00
}
if err = c.serializeForGroupBy(statement, out); err != nil {
return
}
}
return nil
}
func serializeClauseList(statement statementType, clauses []clause, out *queryData) (err error) {
2019-05-07 19:06:21 +02:00
for i, c := range clauses {
if i > 0 {
out.writeString(", ")
2019-05-07 19:06:21 +02:00
}
if c == nil {
return errors.New("nil clause.")
}
if err = c.serialize(statement, out); err != nil {
2019-05-07 19:06:21 +02:00
return
}
}
return nil
}
2019-06-04 12:10:23 +02:00
func serializeExpressionList(statement statementType, expressions []Expression, separator string, out *queryData) error {
for i, value := range expressions {
if i > 0 {
out.writeString(separator)
}
err := value.serialize(statement, out)
2019-04-14 17:55:10 +02:00
if err != nil {
return err
}
}
return nil
}
2019-04-20 19:49:29 +02:00
func serializeProjectionList(statement statementType, projections []projection, out *queryData) error {
for i, col := range projections {
if i > 0 {
2019-05-12 18:15:23 +02:00
out.writeString(",")
out.newLine()
}
2019-05-12 18:15:23 +02:00
if col == nil {
return errors.New("projection is nil")
}
if err := col.serializeForProjection(statement, out); err != nil {
return err
}
}
return nil
}
func serializeColumnNames(columns []column, out *queryData) error {
for i, col := range columns {
if i > 0 {
out.writeString(", ")
}
if col == nil {
return errors.New("nil column in columns list")
}
out.writeString(col.Name())
}
return nil
}
func columnListToProjectionList(columns []Column) []projection {
var ret []projection
for _, column := range columns {
ret = append(ret, column)
}
return ret
}
2019-06-05 17:15:20 +02:00
func isNil(v interface{}) bool {
return v == nil || (reflect.ValueOf(v).Kind() == reflect.Ptr && reflect.ValueOf(v).IsNil())
}
func valueToClause(value interface{}) clause {
if clause, ok := value.(clause); ok {
return clause
} else {
return literal(value)
}
}
func unwindRowFromModel(columns []column, data interface{}) []clause {
structValue := reflect.Indirect(reflect.ValueOf(data))
row := []clause{}
mustBe(structValue, reflect.Struct)
for _, column := range columns {
columnName := column.Name()
structFieldName := snaker.SnakeToCamel(columnName)
structField := structValue.FieldByName(structFieldName)
if !structField.IsValid() {
panic("missing struct field for column : " + column.Name())
}
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
}
func unwindRowFromValues(value interface{}, values []interface{}) []clause {
row := []clause{}
allValues := append([]interface{}{value}, values...)
for _, val := range allValues {
row = append(row, valueToClause(val))
}
return row
}
func mustBe(v reflect.Value, expected reflect.Kind) {
if k := v.Kind(); k != expected {
panic("argument mismatch: expected " + expected.String() + ", got " + v.Type().String())
2019-06-09 11:06:08 +02:00
}
}