gopkg.in/rethinkdb/rethinkdb-go.v6@v6.2.2/query_transformation.go (about) 1 package rethinkdb 2 3 import p "gopkg.in/rethinkdb/rethinkdb-go.v6/ql2" 4 5 // Map transform each element of the sequence by applying the given mapping 6 // function. It takes two arguments, a sequence and a function of type 7 // `func (r.Term) interface{}`. 8 // 9 // For example this query doubles each element in an array: 10 // 11 // r.Map([]int{1,3,6}, func (row r.Term) interface{} { 12 // return row.Mul(2) 13 // }) 14 func Map(args ...interface{}) Term { 15 if len(args) > 0 { 16 args = append(args[:len(args)-1], funcWrap(args[len(args)-1])) 17 } 18 19 return constructRootTerm("Map", p.Term_MAP, args, map[string]interface{}{}) 20 } 21 22 // Map transforms each element of the sequence by applying the given mapping 23 // function. It takes one argument of type `func (r.Term) interface{}`. 24 // 25 // For example this query doubles each element in an array: 26 // 27 // r.Expr([]int{1,3,6}).Map(func (row r.Term) interface{} { 28 // return row.Mul(2) 29 // }) 30 func (t Term) Map(args ...interface{}) Term { 31 if len(args) > 0 { 32 args = append(args[:len(args)-1], funcWrap(args[len(args)-1])) 33 } 34 35 return constructMethodTerm(t, "Map", p.Term_MAP, args, map[string]interface{}{}) 36 } 37 38 // WithFields takes a sequence of objects and a list of fields. If any objects in the 39 // sequence don't have all of the specified fields, they're dropped from the 40 // sequence. The remaining objects have the specified fields plucked out. 41 // (This is identical to `HasFields` followed by `Pluck` on a sequence.) 42 func (t Term) WithFields(args ...interface{}) Term { 43 return constructMethodTerm(t, "WithFields", p.Term_WITH_FIELDS, args, map[string]interface{}{}) 44 } 45 46 // ConcatMap concatenates one or more elements into a single sequence using a 47 // mapping function. ConcatMap works in a similar fashion to Map, applying the 48 // given function to each element in a sequence, but it will always return a 49 // single sequence. 50 func (t Term) ConcatMap(args ...interface{}) Term { 51 return constructMethodTerm(t, "ConcatMap", p.Term_CONCAT_MAP, funcWrapArgs(args), map[string]interface{}{}) 52 } 53 54 // OrderByOpts contains the optional arguments for the OrderBy term 55 type OrderByOpts struct { 56 Index interface{} `rethinkdb:"index,omitempty"` 57 } 58 59 func (o OrderByOpts) toMap() map[string]interface{} { 60 return optArgsToMap(o) 61 } 62 63 // OrderBy sorts the sequence by document values of the given key(s). To specify 64 // the ordering, wrap the attribute with either r.Asc or r.Desc (defaults to 65 // ascending). 66 // 67 // Sorting without an index requires the server to hold the sequence in memory, 68 // and is limited to 100,000 documents (or the setting of the ArrayLimit option 69 // for run). Sorting with an index can be done on arbitrarily large tables, or 70 // after a between command using the same index. 71 func (t Term) OrderBy(args ...interface{}) Term { 72 var opts = map[string]interface{}{} 73 74 // Look for options map 75 if len(args) > 0 { 76 if possibleOpts, ok := args[len(args)-1].(OrderByOpts); ok { 77 opts = possibleOpts.toMap() 78 args = args[:len(args)-1] 79 } 80 } 81 82 for k, arg := range args { 83 if t, ok := arg.(Term); !(ok && (t.termType == p.Term_DESC || t.termType == p.Term_ASC)) { 84 args[k] = funcWrap(arg) 85 } 86 } 87 88 return constructMethodTerm(t, "OrderBy", p.Term_ORDER_BY, args, opts) 89 } 90 91 // Desc is used by the OrderBy term to specify the ordering to be descending. 92 func Desc(args ...interface{}) Term { 93 return constructRootTerm("Desc", p.Term_DESC, funcWrapArgs(args), map[string]interface{}{}) 94 } 95 96 // Asc is used by the OrderBy term to specify that the ordering be ascending (the 97 // default). 98 func Asc(args ...interface{}) Term { 99 return constructRootTerm("Asc", p.Term_ASC, funcWrapArgs(args), map[string]interface{}{}) 100 } 101 102 // Skip skips a number of elements from the head of the sequence. 103 func (t Term) Skip(args ...interface{}) Term { 104 return constructMethodTerm(t, "Skip", p.Term_SKIP, args, map[string]interface{}{}) 105 } 106 107 // Limit ends the sequence after the given number of elements. 108 func (t Term) Limit(args ...interface{}) Term { 109 return constructMethodTerm(t, "Limit", p.Term_LIMIT, args, map[string]interface{}{}) 110 } 111 112 // SliceOpts contains the optional arguments for the Slice term 113 type SliceOpts struct { 114 LeftBound interface{} `rethinkdb:"left_bound,omitempty"` 115 RightBound interface{} `rethinkdb:"right_bound,omitempty"` 116 } 117 118 func (o SliceOpts) toMap() map[string]interface{} { 119 return optArgsToMap(o) 120 } 121 122 // Slice trims the sequence to within the bounds provided. 123 func (t Term) Slice(args ...interface{}) Term { 124 var opts = map[string]interface{}{} 125 126 // Look for options map 127 if len(args) > 0 { 128 if possibleOpts, ok := args[len(args)-1].(SliceOpts); ok { 129 opts = possibleOpts.toMap() 130 args = args[:len(args)-1] 131 } 132 } 133 134 return constructMethodTerm(t, "Slice", p.Term_SLICE, args, opts) 135 } 136 137 // AtIndex gets a single field from an object or the nth element from a sequence. 138 func (t Term) AtIndex(args ...interface{}) Term { 139 return constructMethodTerm(t, "AtIndex", p.Term_BRACKET, args, map[string]interface{}{}) 140 } 141 142 // Nth gets the nth element from a sequence. 143 func (t Term) Nth(args ...interface{}) Term { 144 return constructMethodTerm(t, "Nth", p.Term_NTH, args, map[string]interface{}{}) 145 } 146 147 // OffsetsOf gets the indexes of an element in a sequence. If the argument is a 148 // predicate, get the indexes of all elements matching it. 149 func (t Term) OffsetsOf(args ...interface{}) Term { 150 return constructMethodTerm(t, "OffsetsOf", p.Term_OFFSETS_OF, funcWrapArgs(args), map[string]interface{}{}) 151 } 152 153 // IsEmpty tests if a sequence is empty. 154 func (t Term) IsEmpty(args ...interface{}) Term { 155 return constructMethodTerm(t, "IsEmpty", p.Term_IS_EMPTY, args, map[string]interface{}{}) 156 } 157 158 // UnionOpts contains the optional arguments for the Slice term 159 type UnionOpts struct { 160 Interleave interface{} `rethinkdb:"interleave,omitempty"` 161 } 162 163 func (o UnionOpts) toMap() map[string]interface{} { 164 return optArgsToMap(o) 165 } 166 167 // Union concatenates two sequences. 168 func Union(args ...interface{}) Term { 169 return constructRootTerm("Union", p.Term_UNION, args, map[string]interface{}{}) 170 } 171 172 // Union concatenates two sequences. 173 func (t Term) Union(args ...interface{}) Term { 174 return constructMethodTerm(t, "Union", p.Term_UNION, args, map[string]interface{}{}) 175 } 176 177 // UnionWithOpts like Union concatenates two sequences however allows for optional 178 // arguments to be passed. 179 func UnionWithOpts(optArgs UnionOpts, args ...interface{}) Term { 180 return constructRootTerm("Union", p.Term_UNION, args, optArgs.toMap()) 181 } 182 183 // UnionWithOpts like Union concatenates two sequences however allows for optional 184 // arguments to be passed. 185 func (t Term) UnionWithOpts(optArgs UnionOpts, args ...interface{}) Term { 186 return constructMethodTerm(t, "Union", p.Term_UNION, args, optArgs.toMap()) 187 } 188 189 // Sample selects a given number of elements from a sequence with uniform random 190 // distribution. Selection is done without replacement. 191 func (t Term) Sample(args ...interface{}) Term { 192 return constructMethodTerm(t, "Sample", p.Term_SAMPLE, args, map[string]interface{}{}) 193 }