github.com/kunlun-qilian/sqlx/v3@v3.0.0/builder/assignment.go (about) 1 package builder 2 3 import ( 4 "context" 5 "math" 6 ) 7 8 type SqlAssignment interface { 9 SqlExpr 10 SqlAssignmentMarker 11 } 12 13 type SqlAssignmentMarker interface { 14 asCondition() 15 } 16 17 func WriteAssignments(e *Ex, assignments ...*Assignment) { 18 count := 0 19 20 for i := range assignments { 21 a := assignments[i] 22 23 if IsNilExpr(a) { 24 continue 25 } 26 27 if count > 0 { 28 e.WriteQuery(", ") 29 } 30 31 e.WriteExpr(a) 32 count++ 33 } 34 } 35 36 func ColumnsAndValues(columnOrColumns SqlExpr, values ...interface{}) *Assignment { 37 lenOfColumn := 1 38 if canLen, ok := columnOrColumns.(interface{ Len() int }); ok { 39 lenOfColumn = canLen.Len() 40 } 41 return &Assignment{columnOrColumns: columnOrColumns, lenOfColumn: lenOfColumn, values: values} 42 } 43 44 type Assignments []*Assignment 45 46 type Assignment struct { 47 SqlAssignmentMarker 48 49 columnOrColumns SqlExpr 50 lenOfColumn int 51 52 values []interface{} 53 } 54 55 func (a *Assignment) IsNil() bool { 56 return a == nil || IsNilExpr(a.columnOrColumns) || len(a.values) == 0 57 } 58 59 func (a *Assignment) Ex(ctx context.Context) *Ex { 60 e := Expr("") 61 e.Grow(len(a.values)) 62 63 useValues := TogglesFromContext(ctx).Is(ToggleUseValues) 64 65 if useValues { 66 e.WriteGroup(func(e *Ex) { 67 e.WriteExpr(ExprBy(func(ctx context.Context) *Ex { 68 return a.columnOrColumns.Ex(ContextWithToggles(ctx, Toggles{ 69 ToggleMultiTable: false, 70 })) 71 })) 72 }) 73 74 if len(a.values) == 1 { 75 if s, ok := a.values[0].(SelectStatement); ok { 76 e.WriteQueryByte(' ') 77 e.WriteExpr(s) 78 return e.Ex(ctx) 79 } 80 } 81 82 e.WriteQuery(" VALUES ") 83 84 groupCount := int(math.Round(float64(len(a.values)) / float64(a.lenOfColumn))) 85 86 for i := 0; i < groupCount; i++ { 87 if i > 0 { 88 e.WriteQueryByte(',') 89 } 90 91 e.WriteGroup(func(e *Ex) { 92 for j := 0; j < a.lenOfColumn; j++ { 93 e.WriteHolder(j) 94 } 95 }) 96 } 97 98 e.AppendArgs(a.values...) 99 100 return e.Ex(ctx) 101 } 102 103 e.WriteExpr(ExprBy(func(ctx context.Context) *Ex { 104 return a.columnOrColumns.Ex(ContextWithToggles(ctx, Toggles{ 105 ToggleMultiTable: false, 106 })) 107 })) 108 109 e.WriteQuery(" = ?") 110 e.AppendArgs(a.values[0]) 111 112 return e.Ex(ctx) 113 }