lib/graphql/execution/multiplex.rb in graphql-1.11.10 vs lib/graphql/execution/multiplex.rb in graphql-1.12.0

- old
+ new

@@ -27,15 +27,17 @@ # @api private NO_OPERATION = {}.freeze include Tracing::Traceable - attr_reader :context, :queries, :schema, :max_complexity + attr_reader :context, :queries, :schema, :max_complexity, :dataloader def initialize(schema:, queries:, context:, max_complexity:) @schema = schema @queries = queries + @queries.each { |q| q.multiplex = self } @context = context + @context[:dataloader] = @dataloader = @schema.dataloader_class.new(context) @tracers = schema.tracers + (context[:tracers] || []) # Support `context: {backtrace: true}` if context[:backtrace] && !@tracers.include?(GraphQL::Backtrace::Tracer) @tracers << GraphQL::Backtrace::Tracer end @@ -77,24 +79,34 @@ def run_as_multiplex(multiplex) multiplex.schema.query_execution_strategy.begin_multiplex(multiplex) queries = multiplex.queries # Do as much eager evaluation of the query as possible - results = queries.map do |query| - begin_query(query, multiplex) + results = [] + queries.each_with_index do |query, idx| + multiplex.dataloader.enqueue { + results[idx] = begin_query(query, multiplex) + } end + multiplex.dataloader.run + # Then, work through lazy results in a breadth-first way - multiplex.schema.query_execution_strategy.finish_multiplex(results, multiplex) + multiplex.dataloader.enqueue { + multiplex.schema.query_execution_strategy.finish_multiplex(results, multiplex) + } + multiplex.dataloader.run # Then, find all errors and assign the result to the query object - results.each_with_index.map do |data_result, idx| + results.each_with_index do |data_result, idx| query = queries[idx] finish_query(data_result, query, multiplex) # Get the Query::Result, not the Hash - query.result + results[idx] = query.result end + + results rescue Exception # TODO rescue at a higher level so it will catch errors in analysis, too # Assign values here so that the query's `@executed` becomes true queries.map { |q| q.result_values ||= {} } raise @@ -142,9 +154,11 @@ end end # use the old `query_execution_strategy` etc to run this query def run_one_legacy(schema, query) + warn "Multiplex.run_one_legacy will be removed from GraphQL-Ruby 2.0, upgrade to the Interpreter to avoid this deprecated codepath: https://graphql-ruby.org/queries/interpreter.html" + query.result_values = if !query.valid? all_errors = query.validation_errors + query.analysis_errors + query.context.errors if all_errors.any? { "errors" => all_errors.map(&:to_h) } else