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  }