diff --git a/lib/fauna/query.rb b/lib/fauna/query.rb index 6a06d3e9..f54e0179 100644 --- a/lib/fauna/query.rb +++ b/lib/fauna/query.rb @@ -447,6 +447,24 @@ def distinct(set) Expr.new distinct: Expr.wrap(set) end + ## + # A sum expression + def sum(set) + Expr.new sum: Expr.wrap(set) + end + + ## + # A merge expression + # + # Only one of +resolver_expr+ or +resolver_block+, or neither should be provided. + def merge(object1, object2, resolver_expr = nil, &resolver_block) + if resolver_expr.nil? && resolver_block.nil? + Expr.new merge: Expr.wrap(object1), with: Expr.wrap(object2) + else + Expr.new merge: Expr.wrap(object1), with: Expr.wrap(object2), lambda: Expr.wrap(resolver_expr || resolver_block) + end + end + ## # A join expression # diff --git a/spec/query_spec.rb b/spec/query_spec.rb index 16bf3106..a21fedd8 100644 --- a/spec/query_spec.rb +++ b/spec/query_spec.rb @@ -614,6 +614,58 @@ def test_method end end + describe '#sum' do + before do + over_z = client.query do + create ref('indexes'), name: 'query_over_z', source: @test_class, values: [{ field: %w(data z) }] + end + wait_for_index(over_z[:ref]) + @test_over_z = over_z[:ref] + + @refs = [] + @refs << client.query { create @test_class, data: { z: 0 } }[:ref] + @refs << client.query { create @test_class, data: { z: 1 } }[:ref] + @refs << client.query { create @test_class, data: { z: 1 } }[:ref] + end + + it 'performs sum' do + set = Fauna::Query.match(@test_over_z) + sum = Fauna::Query.sum(set) + + expect(get_set_data(set)).to eq([0, 1, 1]) + expect(client.query sum).to eq(2) + end + end + + describe '#merge' do + before do + @a_ref = client.query { create @test_class, data: { a: 0, c: 2 } }[:ref] + @b_ref = client.query { create @test_class, data: { b: 1, c: 3 } }[:ref] + + @refs = [] + @refs << @a_ref + @refs << @b_ref + + @a_ref_data = Fauna::Query.select(['data'], Fauna::Query.get(@a_ref)) + @b_ref_data = Fauna::Query.select(['data'], Fauna::Query.get(@b_ref)) + end + + it 'performs merge' do + merged = Fauna::Query.merge(@a_ref_data, @b_ref_data) + expect(client.query merged).to eq({a: 0, b: 1, c: 3}) + end + + it 'performs merge with resolver' do + merged = Fauna::Query.merge(@a_ref_data, @b_ref_data, lambda { |field, val1, val2| + if_(equals(nil, val1), + val2, + val1 + ) + }) + expect(client.query merged).to eq({a: 0, b: 1, c: 2}) + end + end + describe '#join' do before do @x_value = random_number