desc: Tests manipulation operations on arrays tests: # Define a sequence to work with - def: arr = r.expr([1, 2, 3]) - def: dupe_arr = r.expr([1, 1, 2, 3]) - def: objArr = r.expr([{'a':1, 'b':'a'}, {'a':2, 'b':'b'}, {'a':3, 'b':'c'}]) - def: nestedObjArr = r.expr([{'a':1, 'b':{'c':1}}, {'a':2, 'b':{'c':2}}, {'a':3, 'b':{'c':3}}]) ## Append - cd: arr.append(4) ot: [1,2,3,4] - cd: arr.append('a') ot: [1,2,3,'a'] ## Prepend - cd: arr.prepend(0) ot: [0,1,2,3] - cd: arr.prepend('a') ot: ['a',1,2,3] ## Difference - cd: arr.difference([1,2,2]) ot: [3] - cd: arr.difference([]) ot: [1,2,3] - cd: arr.difference(["foo", "bar"]) ot: [1,2,3] ## Set operations - cd: dupe_arr.set_insert(1) ot: [1,2,3] - cd: dupe_arr.set_insert(4) ot: [1,2,3,4] - cd: dupe_arr.set_union([3,4,5,5]) ot: [1,2,3,4,5] - cd: dupe_arr.set_union([5,6]) ot: [1,2,3,5,6] - cd: dupe_arr.set_intersection([1,1,1,2,2]) ot: [1,2] - cd: dupe_arr.set_intersection(["foo"]) ot: [] - cd: dupe_arr.set_difference([1,1,1,10]) ot: [2,3] - cd: dupe_arr.set_difference([2]) ot: [1,3] ## Slice # Python uses the slice syntax - py: - arr[1:3] - arr.slice(1, 3) - arr.slice(1, 2, right_bound='closed') js: - arr.slice(1,3) - arr.slice(1, 2, {right_bound:'closed'}) rb: - arr[(1..2)] - arr[(1...3)] - arr.slice(1, 2, :right_bound => 'closed') ot: [2, 3] # One ended slices - py: - arr[:2] - arr.slice(0,2) js: arr.slice(0,2) rb: - arr[(0..1)] - arr[(0...2)] - arr.slice(0,2) ot: [1,2] - py: - arr[1:] - arr.slice(1) js: arr.slice(1) rb: arr.slice(1) ot: [2,3] # Negative indicies # Python 2.x doesn't handle negative indicies properly - cd: arr.slice(-2, -1) rb: arr[(-2...-1)] ot: [2] ## Skip - cd: arr.skip(1) ot: [2,3] - cd: arr.skip(2) ot: [3] - cd: arr.skip(12) ot: [] ## Limit - cd: arr.limit(2) ot: [1,2] - cd: arr.limit(0) ot: [] - cd: arr.limit(12) ot: [1,2,3] ## Pluck - cd: objArr.pluck('a', 'b') ot: [{'a':1, 'b':'a'}, {'a':2, 'b':'b'}, {'a':3, 'b':'c'}] - cd: objArr.pluck('a') ot: [{'a':1}, {'a':2}, {'a':3}] - cd: objArr.pluck() ot: [{}, {}, {}] ## With_Fields - def: wftst = objArr.union(objArr.pluck('a')).union(objArr.pluck('b')).union([{'a':null}]) - cd: wftst.with_fields('a') ot: ([{'a':1},{'a':2},{'a':3},{'a':1},{'a':2},{'a':3}]) - cd: wftst.with_fields('b') ot: ([{'b':'a'},{'b':'b'},{'b':'c'},{'b':'a'},{'b':'b'},{'b':'c'}]) - cd: wftst.with_fields('a', 'b') ot: ([{'a':1,'b':'a'},{'a':2,'b':'b'},{'a':3,'b':'c'}]) - cd: wftst.with_fields() ot: [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}] - def: wftst2 = nestedObjArr.union(objArr.pluck({'b':'missing'})).union(nestedObjArr.pluck({'b':'c'})) - cd: wftst2.with_fields({'b':'c'}) ot: ([{'b':{'c':1}}, {'b':{'c':2}}, {'b':{'c':3}}, {'b':{'c':1}}, {'b':{'c':2}}, {'b':{'c':3}}]) - cd: wftst.with_fields(1) ot: err("ReqlQueryLogicError", "Invalid path argument `1`.", []) - cd: r.expr(1).with_fields() ot: err("ReqlQueryLogicError", "Cannot perform has_fields on a non-object non-sequence `1`.", []) ## Without - cd: objArr.without('a', 'b') ot: [{}, {}, {}] - cd: objArr.without('a') ot: [{'b':'a'}, {'b':'b'}, {'b':'c'}] - cd: objArr.without() ot: [{'a':1, 'b':'a'}, {'a':2, 'b':'b'}, {'a':3, 'b':'c'}] ## Map - py: arr.map(lambda v: v + 1) js: arr.map(function(v) { return v.add(1); }) rb: arr.map{ |v| v + 1 } ot: [2,3,4] #- py: objArr.map(r.row['b']) # js: objArr.map(r.row('b')) # ot: ['a', 'b', 'c'] ## Reduce - py: arr.reduce(lambda a, b: a + b) js: arr.reduce(function(a,b) { return a.add(b); }) rb: arr.reduce{ |a, b| a + b } ot: 6 - py: arr.reduce(lambda a, b:a + b) js: arr.reduce(function(a,b) { return a.add(b); }) rb: arr.reduce(){ |a, b| a + b } ot: 6 - py: arr.union(arr).reduce(lambda a, b: a + b) js: arr.union(arr).reduce(function(a,b) { return a.add(b); }) rb: arr.union(arr).reduce{ |a, b| a + b } ot: 12 - py: arr.union(arr).reduce(lambda a, b:a + b) js: arr.union(arr).reduce(function(a,b) { return a.add(b); }) rb: arr.union(arr).reduce(){ |a, b| a + b } ot: 12 ## Filter - py: objArr.filter(lambda row: row['b'] == 'b') js: objArr.filter(function(row) { return row('b').eq('b'); }) rb: objArr.filter{ |row| row[:b].eq 'b' } ot: [{'a':2, 'b':'b'}] ## ConcatMap - py: arr.concat_map(lambda v: [1,2]) js: arr.concatMap(function(v) { return [1,2]; }) rb: arr.concat_map{ |v| [1,2] } ot: [1,2,1,2,1,2] - py: arr.concat_map(lambda v: [{'v':v}, {'v2':v + 1}]) js: arr.concatMap(function(v) { return [{'v':v}, {'v2':v.add(1)}]; }) rb: arr.concat_map{ |v| [{:v => v}, {:v2 => v + 1}] } ot: [{'v':1}, {'v2':2}, {'v':2}, {'v2':3}, {'v':3}, {'v2':4}] ## OrderBy - cd: objArr.order_by('b') rb: objArr.order_by :b ot: [{'a':1, 'b':'a'}, {'a':2, 'b':'b'}, {'a':3, 'b':'c'}] - cd: objArr.order_by(r.desc('b')) ot: [{'a':3, 'b':'c'}, {'a':2, 'b':'b'}, {'a':1, 'b':'a'}] - cd: r.expr([{'-a':1},{'-a':2}]).order_by('-a') rb: r.expr([{ '-a' => 1}, {'-a' => 2}]).order_by('-a') ot: cd: [{'-a':1},{'-a':2}] rb: [{'-a'=>1},{'-a'=>2}] ## Distinct - cd: r.expr([1,1,2,2,2,3,4]).distinct() ot: [1,2,3,4] ## Count - cd: arr.count() ot: 3 cd: objArr.count() ot: 3 ## Union - cd: arr.union(objArr) ot: [1, 2, 3, {'a':1, 'b':'a'}, {'a':2, 'b':'b'}, {'a':3, 'b':'c'}] ## Nth - cd: - arr[1] - arr.nth(1) js: arr.nth(1) ot: 2 - py: arr[0] rb: arr[0] js: arr.nth(0) ot: 1 ## Is Empty - cd: r.expr([]).is_empty() ot: true - cd: arr.is_empty() ot: false ## Contains - cd: arr.contains(2) ot: true - cd: arr.contains(2, 3) ot: true - cd: arr.contains(4) ot: false - cd: arr.contains(2, 4) ot: false - cd: arr.contains(2, 2) ot: false - cd: arr.union(arr).contains(2, 2) ot: true - cd: arr.contains{|x| x.eq(2)} py: arr.contains(lambda x:x == 2) js: arr.contains(function(x){return x.eq(2);}) ot: true - cd: arr.contains(lambda {|x| x.eq(2)}, lambda {|x| x.eq(3)}) py: arr.contains(lambda x:x == 2, lambda x:x==3) js: arr.contains(function(x){return x.eq(2);}, function(x){return x.eq(3);}) ot: true - cd: arr.contains{|x| x.eq(4)} py: arr.contains(lambda x:x == 4) js: arr.contains(function(x){return x.eq(4);}) ot: false - cd: arr.contains(lambda {|x| x.eq(2)}, lambda {|x| x.eq(4)}) py: arr.contains(lambda x:x == 2, lambda x:x==4) js: arr.contains(function(x){return x.eq(2);}, function(x){return x.eq(4);}) ot: false - cd: arr.contains(lambda {|x| x.eq(2)}, lambda {|x| x.eq(2)}) py: arr.contains(lambda x:x == 2, lambda x:x==2) js: arr.contains(function(x){return x.eq(2);}, function(x){return x.eq(2);}) ot: false - cd: arr.union(arr).contains(lambda {|x| x.eq(2)}, lambda {|x| x.eq(2)}) py: arr.union(arr).contains(lambda x:x == 2, lambda x:x==2) js: arr.union(arr).contains(function(x){return x.eq(2);}, function(x){return x.eq(2);}) ot: true ## Get Field - cd: r.expr([{'a':1},{'b':2},{'a':3,'c':4}])['a'] js: r.expr([{'a':1},{'b':2},{'a':3,'c':4}])('a') ot: [1, 3] - cd: r.expr([{'a':1},'a',{'b':2},{'a':3,'c':4}])['a'] js: r.expr([{'a':1},'a',{'b':2},{'a':3,'c':4}])('a') ot: err("ReqlQueryLogicError", "Cannot perform bracket on a non-object non-sequence `\"a\"`.", []) ## Grouped Map Reduce ## Group by ## Inner Join ## Outer Join