Class: GraphQL::Stitching::Executor::RootSource
- Inherits:
-
Dataloader::Source
- Object
- Dataloader::Source
- GraphQL::Stitching::Executor::RootSource
- Defined in:
- lib/graphql/stitching/executor/root_source.rb
Instance Method Summary collapse
-
#build_document(op, operation_name = nil, operation_directives = nil) ⇒ Object
Builds root source documents "query MyOperation_1($var:VarType) { rootSelections ... }".
- #fetch(ops) ⇒ Object
-
#format_errors!(errors, path) ⇒ Object
Format response errors without a document location (because it won't match the request doc), and prepend any insertion path for the scope into error paths.
-
#initialize(executor, location) ⇒ RootSource
constructor
A new instance of RootSource.
Constructor Details
#initialize(executor, location) ⇒ RootSource
Returns a new instance of RootSource.
6 7 8 9 |
# File 'lib/graphql/stitching/executor/root_source.rb', line 6 def initialize(executor, location) @executor = executor @location = location end |
Instance Method Details
#build_document(op, operation_name = nil, operation_directives = nil) ⇒ Object
Builds root source documents "query MyOperation_1($var:VarType) { rootSelections ... }"
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/graphql/stitching/executor/root_source.rb', line 46 def build_document(op, operation_name = nil, operation_directives = nil) doc = String.new doc << op.operation_type if operation_name doc << " #{operation_name}_#{op.step}" end if op.variables.any? variable_defs = op.variables.map { |k, v| "$#{k}:#{v}" }.join(",") doc << "(#{variable_defs})" end if operation_directives doc << " #{operation_directives} " end doc << op.selections doc end |
#fetch(ops) ⇒ Object
[View source]
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/graphql/stitching/executor/root_source.rb', line 11 def fetch(ops) op = ops.first # There should only ever be one per location at a time query_document = build_document( op, @executor.request.operation_name, @executor.request.operation_directives, ) query_variables = @executor.request.variables.slice(*op.variables.keys) result = @executor.request.supergraph.execute_at_location(op.location, query_document, query_variables, @executor.request) @executor.query_count += 1 if result["data"] if op.path.any? # Nested root scopes must expand their pathed origin set origin_set = op.path.reduce([@executor.data]) do |set, ns| set.flat_map { |obj| obj && obj[ns] }.tap(&:compact!) end origin_set.each { _1.merge!(result["data"]) } else # Actual root scopes merge directly into results data @executor.data.merge!(result["data"]) end end if result["errors"]&.any? @executor.errors.concat(format_errors!(result["errors"], op.path)) end ops.map(&:step) end |
#format_errors!(errors, path) ⇒ Object
Format response errors without a document location (because it won't match the request doc), and prepend any insertion path for the scope into error paths.
69 70 71 72 73 74 75 |
# File 'lib/graphql/stitching/executor/root_source.rb', line 69 def format_errors!(errors, path) errors.each do |err| err.delete("locations") err["path"].unshift(*path) if err["path"] && path.any? end errors end |