class GraphQL::Batch::ExecutionStrategy

Public Instance Methods

execute(_, _, query) click to toggle source
Calls superclass method
# File lib/graphql/batch/execution_strategy.rb, line 5
def execute(_, _, query)
  GraphQL::Batch.batch do
    as_promise_unless_resolved(super)
  end
rescue GraphQL::InvalidNullError => err
  err.parent_error? || query.context.errors.push(err)
  nil
end

Private Instance Methods

as_promise_unless_resolved(result) click to toggle source
# File lib/graphql/batch/execution_strategy.rb, line 21
def as_promise_unless_resolved(result)
  all_promises = []
  each_promise(result) do |obj, key, promise|
    obj[key] = nil
    all_promises << promise.then do |value|
      obj[key] = value
      as_promise_unless_resolved(value)
    end
  end
  return result if all_promises.empty?
  ::Promise.all(all_promises).then { result }
end
each_promise(obj, &block) click to toggle source
# File lib/graphql/batch/execution_strategy.rb, line 34
def each_promise(obj, &block)
  case obj
  when Array
    obj.each_with_index do |value, idx|
      each_promise_in_entry(obj, idx, value, &block)
    end
  when Hash
    obj.each do |key, value|
      each_promise_in_entry(obj, key, value, &block)
    end
  end
end
each_promise_in_entry(obj, key, value) { |obj, key, value| ... } click to toggle source
# File lib/graphql/batch/execution_strategy.rb, line 47
def each_promise_in_entry(obj, key, value, &block)
  if value.is_a?(::Promise)
    yield obj, key, value
  else
    each_promise(value, &block)
  end
end