github.com/eden-framework/sqlx@v0.0.2/generator/model_list.go (about) 1 package generator 2 3 import ( 4 "fmt" 5 6 "github.com/eden-framework/codegen" 7 ) 8 9 func (m *Model) WriteCount(file *codegen.File) { 10 file.WriteBlock( 11 codegen.Func( 12 codegen.Var(codegen.Type(file.Use("github.com/eden-framework/sqlx", "DBExecutor")), "db"), 13 codegen.Var(codegen.Type(file.Use("github.com/eden-framework/sqlx/builder", "SqlCondition")), "condition"), 14 codegen.Var(codegen.Ellipsis(codegen.Type(file.Use("github.com/eden-framework/sqlx/builder", "Addition"))), "additions"), 15 ). 16 Named("Count"). 17 MethodOf(codegen.Var(m.PtrType(), "m")). 18 Return( 19 codegen.Var(codegen.Int), 20 codegen.Var(codegen.Error), 21 ). 22 Do( 23 codegen.Expr(` 24 count := -1 25 26 table := db.T(m) 27 _ = table 28 `), 29 30 func() codegen.Snippet { 31 if m.HasDeletedAt { 32 return codegen.Expr( 33 `condition = ?(condition, table.F("`+m.FieldKeyDeletedAt+`").Eq(0))`, 34 codegen.Id(file.Use("github.com/eden-framework/sqlx/builder", "And")), 35 ) 36 } 37 return nil 38 }(), 39 40 codegen.Expr(` 41 42 finalAdditions := []`+file.Use("github.com/eden-framework/sqlx/builder", "Addition")+`{ 43 `+file.Use("github.com/eden-framework/sqlx/builder", "Where")+`(condition), 44 `+file.Use("github.com/eden-framework/sqlx/builder", "Comment")+`(?), 45 } 46 47 if len(additions) > 0 { 48 finalAdditions = append(finalAdditions, additions...) 49 } 50 51 err := db.QueryExprAndScan( 52 `+file.Use("github.com/eden-framework/sqlx/builder", "Select")+`( 53 `+file.Use("github.com/eden-framework/sqlx/builder", "Count")+`(), 54 ). 55 From(db.T(m), finalAdditions...), 56 &count, 57 ) 58 59 return count, err 60 `, 61 file.Val(m.StructName+".Count"), 62 ), 63 ), 64 ) 65 } 66 67 func (m *Model) WriteList(file *codegen.File) { 68 file.WriteBlock( 69 codegen.Func( 70 codegen.Var(codegen.Type(file.Use("github.com/eden-framework/sqlx", "DBExecutor")), "db"), 71 codegen.Var(codegen.Type(file.Use("github.com/eden-framework/sqlx/builder", "SqlCondition")), "condition"), 72 codegen.Var(codegen.Ellipsis(codegen.Type(file.Use("github.com/eden-framework/sqlx/builder", "Addition"))), "additions"), 73 ). 74 Named("List"). 75 MethodOf(codegen.Var(m.PtrType(), "m")). 76 Return( 77 codegen.Var(codegen.Slice(codegen.Type(m.StructName))), 78 codegen.Var(codegen.Error), 79 ). 80 Do( 81 codegen.Expr(` 82 list := make([]`+m.StructName+`, 0) 83 84 table := db.T(m) 85 _ = table 86 `), 87 88 func() codegen.Snippet { 89 if m.HasDeletedAt { 90 return codegen.Expr( 91 `condition = ?(condition, table.F("`+m.FieldKeyDeletedAt+`").Eq(0))`, 92 codegen.Id(file.Use("github.com/eden-framework/sqlx/builder", "And")), 93 ) 94 } 95 return nil 96 }(), 97 98 codegen.Expr(` 99 100 finalAdditions := []`+file.Use("github.com/eden-framework/sqlx/builder", "Addition")+`{ 101 `+file.Use("github.com/eden-framework/sqlx/builder", "Where")+`(condition), 102 `+file.Use("github.com/eden-framework/sqlx/builder", "Comment")+`(?), 103 } 104 105 if len(additions) > 0 { 106 finalAdditions = append(finalAdditions, additions...) 107 } 108 109 err := db.QueryExprAndScan( 110 `+file.Use("github.com/eden-framework/sqlx/builder", "Select")+`(nil). 111 From(db.T(m), finalAdditions...), 112 &list, 113 ) 114 115 return list, err 116 `, 117 file.Val(m.StructName+".List"), 118 ), 119 ), 120 ) 121 } 122 123 func (m *Model) WriteBatchList(file *codegen.File) { 124 indexedFields := m.IndexFieldNames() 125 126 for _, field := range indexedFields { 127 method := fmt.Sprintf("BatchFetchBy%sList", field) 128 129 typ := m.FieldType(file, field) 130 131 file.WriteBlock( 132 codegen.Func( 133 codegen.Var(codegen.Type(file.Use("github.com/eden-framework/sqlx", "DBExecutor")), "db"), 134 codegen.Var(codegen.Slice(typ), "values"), 135 ). 136 Named(method). 137 MethodOf(codegen.Var(m.PtrType(), "m")). 138 Return( 139 codegen.Var(codegen.Slice(codegen.Type(m.StructName))), 140 codegen.Var(codegen.Error), 141 ). 142 Do( 143 codegen.Expr(` 144 if len(values) == 0 { 145 return nil, nil 146 } 147 148 table := db.T(m) 149 150 condition := table.F("` + field + `").In(values) 151 152 return m.List(db, condition) 153 `), 154 ), 155 ) 156 } 157 }