github.com/altipla-consulting/ravendb-go-client@v0.1.3/range_builder.go (about)

     1  package ravendb
     2  
     3  // RangeBuilder helps build a string query for range requests
     4  type RangeBuilder struct {
     5  	path string
     6  
     7  	lessBound        interface{}
     8  	greaterBound     interface{}
     9  	lessInclusive    bool
    10  	greaterInclusive bool
    11  
    12  	lessSet    bool
    13  	greaterSet bool
    14  
    15  	err error
    16  }
    17  
    18  func NewRangeBuilder(path string) *RangeBuilder {
    19  	return &RangeBuilder{
    20  		path: path,
    21  	}
    22  }
    23  
    24  func (b *RangeBuilder) createClone() *RangeBuilder {
    25  	builder := *b
    26  	return &builder
    27  }
    28  
    29  func (b *RangeBuilder) IsLessThan(value interface{}) *RangeBuilder {
    30  	if b.err != nil {
    31  		return b
    32  	}
    33  	if b.lessSet {
    34  		b.err = newIllegalStateError("Less bound was already set")
    35  		return b
    36  	}
    37  
    38  	clone := b.createClone()
    39  	clone.lessBound = value
    40  	clone.lessInclusive = false
    41  	clone.lessSet = true
    42  	return clone
    43  }
    44  
    45  func (b *RangeBuilder) IsLessThanOrEqualTo(value interface{}) *RangeBuilder {
    46  	if b.err != nil {
    47  		return b
    48  	}
    49  	if b.lessSet {
    50  		b.err = newIllegalStateError("Less bound was already set")
    51  		return b
    52  	}
    53  
    54  	clone := b.createClone()
    55  	clone.lessBound = value
    56  	clone.lessInclusive = true
    57  	clone.lessSet = true
    58  	return clone
    59  }
    60  
    61  func (b *RangeBuilder) IsGreaterThan(value interface{}) *RangeBuilder {
    62  	if b.err != nil {
    63  		return b
    64  	}
    65  	if b.greaterSet {
    66  		b.err = newIllegalStateError("Greater bound was already set")
    67  		return b
    68  	}
    69  
    70  	clone := b.createClone()
    71  	clone.greaterBound = value
    72  	clone.greaterInclusive = false
    73  	clone.greaterSet = true
    74  	return clone
    75  }
    76  
    77  func (b *RangeBuilder) IsGreaterThanOrEqualTo(value interface{}) *RangeBuilder {
    78  	if b.err != nil {
    79  		return b
    80  	}
    81  	if b.greaterSet {
    82  		b.err = newIllegalStateError("Greater bound was already set")
    83  		return b
    84  	}
    85  
    86  	clone := b.createClone()
    87  	clone.greaterBound = value
    88  	clone.greaterInclusive = true
    89  	clone.greaterSet = true
    90  	return clone
    91  }
    92  
    93  func (b *RangeBuilder) GetStringRepresentation(addQueryParameter func(interface{}) string) (string, error) {
    94  	var less string
    95  	var greater string
    96  
    97  	if b.err != nil {
    98  		return "", b.err
    99  	}
   100  
   101  	if !b.lessSet && !b.greaterSet {
   102  		return "", newIllegalStateError("Bounds were not set")
   103  	}
   104  
   105  	if b.lessSet {
   106  		lessParamName := addQueryParameter(b.lessBound)
   107  		tmp := " < "
   108  		if b.lessInclusive {
   109  			tmp = " <= "
   110  		}
   111  		less = b.path + tmp + "$" + lessParamName
   112  	}
   113  
   114  	if b.greaterSet {
   115  		tmp := " > "
   116  		if b.greaterInclusive {
   117  			tmp = " >= "
   118  		}
   119  		greaterParamName := addQueryParameter(b.greaterBound)
   120  		greater = b.path + tmp + "$" + greaterParamName
   121  	}
   122  
   123  	if less != "" && greater != "" {
   124  		return greater + " and " + less, nil
   125  	}
   126  
   127  	if less != "" {
   128  		return less, nil
   129  	}
   130  	return greater, nil
   131  }
   132  
   133  func (b *RangeBuilder) Err() error {
   134  	return b.err
   135  }