github.com/go-generalize/volcago@v1.7.0/generator/testfiles/not_auto/query_builder_gen.go (about) 1 // Code generated by volcago. DO NOT EDIT. 2 // generated version: devel 3 package model 4 5 import ( 6 "fmt" 7 "reflect" 8 9 "cloud.google.com/go/firestore" 10 "golang.org/x/xerrors" 11 ) 12 13 const ( 14 alreadyEqual = "equality operator already used for this field" 15 alreadyRange = "range operator already used for this field" 16 alreadyRangeValid = "already has a valid range field: " 17 alreadyUsingOnce = "already using `in` or `array-contains-any`" 18 alreadyEqualOrIn = "this field already contains an `in` clause or equality operator" 19 alreadySortOrder = "sort order is already specified" 20 allowArrayOrSlice = "value is not a array or slice" 21 cannotCombineAny = "cannot be combined with `array-contains-any`" 22 notLessThan10 = "value is not less than 10" 23 ) 24 25 type errs struct { 26 TryOperator string 27 TryField string 28 TryValue interface{} 29 Message string 30 } 31 32 func newErrs(op, field, message string, value interface{}) errs { 33 return errs{ 34 TryOperator: op, 35 TryField: field, 36 TryValue: value, 37 Message: message, 38 } 39 } 40 41 // QueryBuilder - query builder 42 type QueryBuilder struct { 43 q firestore.Query 44 errs []errs 45 usedIn bool 46 usedAny bool 47 validRangeField string 48 equalCounter map[string]struct{} 49 rangeCounter map[string]struct{} 50 orderCounter map[string]struct{} 51 } 52 53 // NewQueryBuilder - constructor 54 func NewQueryBuilder(collection *firestore.CollectionRef) *QueryBuilder { 55 return &QueryBuilder{ 56 q: collection.Query, 57 equalCounter: make(map[string]struct{}), 58 rangeCounter: make(map[string]struct{}), 59 orderCounter: make(map[string]struct{}), 60 } 61 } 62 63 // Query - return firestore.Query 64 func (qb *QueryBuilder) Query() *firestore.Query { 65 return &qb.q 66 } 67 68 // Check - condition check 69 func (qb *QueryBuilder) Check() error { 70 if len(qb.errs) <= 0 { 71 return nil 72 } 73 var result string 74 for _, err := range qb.errs { 75 result += fmt.Sprintf( 76 "tryOp: %s, tryField: %s, tryValue: %v, message: %s\n", 77 err.TryOperator, err.TryField, err.TryValue, err.Message, 78 ) 79 } 80 return xerrors.New(result) 81 } 82 83 // Equal - equality filter ( `==` ) 84 func (qb *QueryBuilder) Equal(path string, value interface{}) *QueryBuilder { 85 if _, ok := qb.rangeCounter[path]; ok { 86 qb.errs = append(qb.errs, newErrs(OpTypeEqual, path, alreadyRange, value)) 87 return qb 88 } 89 qb.equalCounter[path] = struct{}{} 90 qb.q = qb.q.Where(path, OpTypeEqual, value) 91 return qb 92 } 93 94 // NotEqual - inequality filter ( `!=` ) 95 func (qb *QueryBuilder) NotEqual(path string, value interface{}) *QueryBuilder { 96 if _, ok := qb.rangeCounter[path]; ok { 97 qb.errs = append(qb.errs, newErrs(OpTypeNotEqual, path, alreadyRange, value)) 98 return qb 99 } 100 qb.equalCounter[path] = struct{}{} 101 qb.q = qb.q.Where(path, OpTypeNotEqual, value) 102 return qb 103 } 104 105 // LessThan - range filter ( `<` ) 106 func (qb *QueryBuilder) LessThan(path string, value interface{}) *QueryBuilder { 107 if _, ok := qb.equalCounter[path]; ok { 108 qb.errs = append(qb.errs, newErrs(OpTypeLessThan, path, alreadyEqual, value)) 109 return qb 110 } 111 if qb.validRangeField != "" { 112 qb.errs = append(qb.errs, newErrs(OpTypeLessThan, path, alreadyRangeValid+qb.validRangeField, value)) 113 return qb 114 } 115 qb.rangeCounter[path] = struct{}{} 116 qb.q = qb.q.Where(path, OpTypeLessThan, value) 117 return qb 118 } 119 120 // LessThanOrEqual - range filter ( `<=` ) 121 func (qb *QueryBuilder) LessThanOrEqual(path string, value interface{}) *QueryBuilder { 122 if _, ok := qb.equalCounter[path]; ok { 123 qb.errs = append(qb.errs, newErrs(OpTypeLessThanOrEqual, path, alreadyEqual, value)) 124 return qb 125 } 126 if qb.validRangeField != "" { 127 qb.errs = append(qb.errs, newErrs(OpTypeLessThanOrEqual, path, alreadyRangeValid+qb.validRangeField, value)) 128 return qb 129 } 130 qb.rangeCounter[path] = struct{}{} 131 qb.q = qb.q.Where(path, OpTypeLessThanOrEqual, value) 132 return qb 133 } 134 135 // GreaterThan - range filter ( `>` ) 136 func (qb *QueryBuilder) GreaterThan(path string, value interface{}) *QueryBuilder { 137 if _, ok := qb.equalCounter[path]; ok { 138 qb.errs = append(qb.errs, newErrs(OpTypeGreaterThan, path, alreadyEqual, value)) 139 return qb 140 } 141 if qb.validRangeField != "" { 142 qb.errs = append(qb.errs, newErrs(OpTypeGreaterThan, path, alreadyRangeValid+qb.validRangeField, value)) 143 return qb 144 } 145 qb.rangeCounter[path] = struct{}{} 146 qb.q = qb.q.Where(path, OpTypeGreaterThan, value) 147 return qb 148 } 149 150 // GreaterThanOrEqual - range filter ( `>=` ) 151 func (qb *QueryBuilder) GreaterThanOrEqual(path string, value interface{}) *QueryBuilder { 152 if _, ok := qb.equalCounter[path]; ok { 153 qb.errs = append(qb.errs, newErrs(OpTypeGreaterThanOrEqual, path, alreadyEqual, value)) 154 return qb 155 } 156 if qb.validRangeField != "" { 157 qb.errs = append(qb.errs, newErrs(OpTypeGreaterThanOrEqual, path, alreadyRangeValid+qb.validRangeField, value)) 158 return qb 159 } 160 qb.rangeCounter[path] = struct{}{} 161 qb.q = qb.q.Where(path, OpTypeGreaterThanOrEqual, value) 162 return qb 163 } 164 165 // In - array filter ( `in` ) 166 func (qb *QueryBuilder) In(path string, value interface{}) *QueryBuilder { 167 switch rv := reflect.ValueOf(value); rv.Kind() { 168 case reflect.Slice, reflect.Array: 169 if rv.Len() > 10 { 170 qb.errs = append(qb.errs, newErrs(OpTypeIn, path, notLessThan10, value)) 171 return qb 172 } 173 default: 174 qb.errs = append(qb.errs, newErrs(OpTypeIn, path, allowArrayOrSlice, value)) 175 return qb 176 } 177 if qb.usedIn || qb.usedAny { 178 qb.errs = append(qb.errs, newErrs(OpTypeIn, path, alreadyUsingOnce, value)) 179 return qb 180 } 181 qb.usedIn = true 182 qb.q = qb.q.Where(path, OpTypeIn, value) 183 return qb 184 } 185 186 // NotIn - array filter ( `not-in` ) 187 func (qb *QueryBuilder) NotIn(path string, value interface{}) *QueryBuilder { 188 switch rv := reflect.ValueOf(value); rv.Kind() { 189 case reflect.Slice, reflect.Array: 190 if rv.Len() > 10 { 191 qb.errs = append(qb.errs, newErrs(OpTypeNotIn, path, notLessThan10, value)) 192 return qb 193 } 194 default: 195 qb.errs = append(qb.errs, newErrs(OpTypeNotIn, path, allowArrayOrSlice, value)) 196 return qb 197 } 198 if qb.usedIn || qb.usedAny { 199 qb.errs = append(qb.errs, newErrs(OpTypeNotIn, path, alreadyUsingOnce, value)) 200 return qb 201 } 202 qb.usedIn = true 203 qb.q = qb.q.Where(path, OpTypeNotIn, value) 204 return qb 205 } 206 207 // ArrayContains - array filter ( `array-contains` ) 208 func (qb *QueryBuilder) ArrayContains(path string, value interface{}) *QueryBuilder { 209 if qb.usedAny { 210 qb.errs = append(qb.errs, newErrs(OpTypeArrayContains, path, cannotCombineAny, value)) 211 return qb 212 } 213 qb.q = qb.q.Where(path, OpTypeArrayContains, value) 214 return qb 215 } 216 217 // ArrayContainsAny - array filter ( `array-contains-any` ) 218 func (qb *QueryBuilder) ArrayContainsAny(path string, value interface{}) *QueryBuilder { 219 switch rv := reflect.ValueOf(value); rv.Kind() { 220 case reflect.Slice, reflect.Array: 221 if rv.Len() > 10 { 222 qb.errs = append(qb.errs, newErrs(OpTypeArrayContainsAny, path, notLessThan10, value)) 223 return qb 224 } 225 default: 226 qb.errs = append(qb.errs, newErrs(OpTypeArrayContainsAny, path, allowArrayOrSlice, value)) 227 return qb 228 } 229 if qb.usedIn || qb.usedAny { 230 qb.errs = append(qb.errs, newErrs(OpTypeArrayContainsAny, path, alreadyUsingOnce, value)) 231 return qb 232 } 233 qb.usedAny = true 234 qb.q = qb.q.Where(path, OpTypeArrayContainsAny, value) 235 return qb 236 } 237 238 // Asc - order 239 func (qb *QueryBuilder) Asc(path string) *QueryBuilder { 240 if _, ok := qb.equalCounter[path]; ok || qb.usedIn { 241 qb.errs = append(qb.errs, newErrs("Asc", path, alreadyEqualOrIn, "")) 242 return qb 243 } 244 if _, ok := qb.orderCounter[path]; ok { 245 qb.errs = append(qb.errs, newErrs("Asc", path, alreadySortOrder, "")) 246 return qb 247 } 248 qb.q = qb.q.OrderBy(path, firestore.Asc) 249 return qb 250 } 251 252 // Desc - order 253 func (qb *QueryBuilder) Desc(path string) *QueryBuilder { 254 if _, ok := qb.equalCounter[path]; ok || qb.usedIn { 255 qb.errs = append(qb.errs, newErrs("Desc", path, alreadyEqualOrIn, "")) 256 return qb 257 } 258 if _, ok := qb.orderCounter[path]; ok { 259 qb.errs = append(qb.errs, newErrs("Desc", path, alreadySortOrder, "")) 260 return qb 261 } 262 qb.q = qb.q.OrderBy(path, firestore.Desc) 263 return qb 264 } 265 266 // Limit - limit 267 func (qb *QueryBuilder) Limit(limit int) *QueryBuilder { 268 qb.q = qb.q.Limit(limit) 269 return qb 270 } 271 272 // StartAt - start at 273 func (qb *QueryBuilder) StartAt(docSnapshotOrFieldValues ...interface{}) *QueryBuilder { 274 qb.q = qb.q.StartAt(docSnapshotOrFieldValues...) 275 return qb 276 } 277 278 // StartAfter - start after 279 func (qb *QueryBuilder) StartAfter(docSnapshotOrFieldValues ...interface{}) *QueryBuilder { 280 qb.q = qb.q.StartAfter(docSnapshotOrFieldValues...) 281 return qb 282 } 283 284 // EndAt - end at 285 func (qb *QueryBuilder) EndAt(docSnapshotOrFieldValues ...interface{}) *QueryBuilder { 286 qb.q = qb.q.EndAt(docSnapshotOrFieldValues...) 287 return qb 288 } 289 290 // EndBefore - end before 291 func (qb *QueryBuilder) EndBefore(docSnapshotOrFieldValues ...interface{}) *QueryBuilder { 292 qb.q = qb.q.EndBefore(docSnapshotOrFieldValues...) 293 return qb 294 }