Skip to content

Commit

Permalink
Merge pull request #835 from rmosolgo/fix-lazy-cousin-batching
Browse files Browse the repository at this point in the history
fix(Lazy) resolve cousin fields in the same pass
  • Loading branch information
Robert Mosolgo committed Jul 12, 2017
2 parents 5cf4afe + e531352 commit 4f1c12c
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 15 deletions.
11 changes: 9 additions & 2 deletions lib/graphql/compatibility/lazy_execution_specification.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,17 @@ def test_it_resolves_lazy_values
p2: push(value: 2) {
push(value: 3) {
value
push(value: 21) {
value
}
}
}
p3: push(value: 4) {
push(value: 5) {
value
push(value: 22) {
value
}
}
}
}
Expand All @@ -37,14 +43,15 @@ def test_it_resolves_lazy_values

expected_data = {
"p1"=>{"value"=>1},
"p2"=>{"push"=>{"value"=>3}},
"p3"=>{"push"=>{"value"=>5}},
"p2"=>{"push"=>{"value"=>3, "push"=>{"value"=>21}}},
"p3"=>{"push"=>{"value"=>5, "push"=>{"value"=>22}}},
}
assert_equal expected_data, res["data"]

expected_pushes = [
[1,2,4], # first level
[3,5], # second level
[21, 22],
]
assert_equal expected_pushes, pushes
end
Expand Down
2 changes: 1 addition & 1 deletion lib/graphql/execution/field_result.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def value=(new_value)
end

def inspect
"#<FieldResult #{value.inspect} (#{field.type})>"
"#<FieldResult #{value.inspect} (#{@type})>"
end
end
end
Expand Down
19 changes: 10 additions & 9 deletions lib/graphql/execution/lazy/resolve.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,14 @@ def self.resolve_in_place(value)
if acc.empty?
Lazy::NullResult
else
acc.each_with_index do |field_result, idx|
acc[idx] = field_result.value.then do |inner_v|
Lazy.new {
acc.each_with_index { |field_result, idx|
inner_v = field_result.value.value
field_result.value = inner_v
resolve_in_place(inner_v)
end
end

Lazy.new { acc.each_with_index { |l, idx| acc[idx] = l.value }; acc }
acc[idx] = inner_v
}
resolve_in_place(acc)
}
end
end

Expand All @@ -62,9 +62,10 @@ def self.each_lazy(acc, value)
end
when FieldResult
field_value = value.value
if field_value.is_a?(Lazy)
case field_value
when Lazy
acc = acc << value
else
when SelectionResult
acc = each_lazy(acc, field_value)
end
end
Expand Down
33 changes: 30 additions & 3 deletions spec/graphql/execution/lazy_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,24 @@
value
nestedSum(value: 7) {
value
nestedSum(value: 1) {
value
nestedSum(value: -50) {
value
}
}
}
}
b: nestedSum(value: 2) {
value
nestedSum(value: 11) {
value
nestedSum(value: 2) {
value
nestedSum(value: -50) {
value
}
}
}
}
Expand All @@ -35,9 +47,24 @@
|

expected_data = {
"a"=>{"value"=>14, "nestedSum"=>{"value"=>46}},
"b"=>{"value"=>14, "nestedSum"=>{"value"=>46}},
"c"=>[{"nestedSum"=>{"value"=>14}}, {"nestedSum"=>{"value"=>14}}],
"a"=>{"value"=>14, "nestedSum"=>{
"value"=>46,
"nestedSum"=>{
"value"=>95,
"nestedSum"=>{"value"=>90}
}
}},
"b"=>{"value"=>14, "nestedSum"=>{
"value"=>46,
"nestedSum"=>{
"value"=>95,
"nestedSum"=>{"value"=>90}
}
}},
"c"=>[
{"nestedSum"=>{"value"=>14}},
{"nestedSum"=>{"value"=>14}}
],
}

assert_equal expected_data, res["data"]
Expand Down

0 comments on commit 4f1c12c

Please sign in to comment.