Skip to content

Commit f9ad610

Browse files
committed
write documents using string buffers.
1 parent dae4bea commit f9ad610

2 files changed

Lines changed: 43 additions & 29 deletions

File tree

lib/graphql/stitching/executor/root_source.rb

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,24 +44,28 @@ def fetch(ops)
4444
# Builds root source documents
4545
# "query MyOperation_1($var:VarType) { rootSelections ... }"
4646
def build_document(op, operation_name = nil, operation_directives = nil)
47-
doc = String.new
48-
doc << op.operation_type
47+
doc_buffer = String.new
48+
doc_buffer << op.operation_type
4949

5050
if operation_name
51-
doc << " #{operation_name}_#{op.step}"
51+
doc_buffer << " " << operation_name << "_" << op.step.to_s
5252
end
5353

54-
if op.variables.any?
55-
variable_defs = op.variables.map { |k, v| "$#{k}:#{v}" }.join(",")
56-
doc << "(#{variable_defs})"
54+
unless op.variables.empty?
55+
doc_buffer << "("
56+
op.variables.each_with_index do |(k, v), i|
57+
doc_buffer << "," unless i.zero?
58+
doc_buffer << "$" << k << ":" << v
59+
end
60+
doc_buffer << ")"
5761
end
5862

5963
if operation_directives
60-
doc << " #{operation_directives} "
64+
doc_buffer << " " << operation_directives << " "
6165
end
6266

63-
doc << op.selections
64-
doc
67+
doc_buffer << op.selections
68+
doc_buffer
6569
end
6670

6771
# Format response errors without a document location (because it won't match the request doc),

lib/graphql/stitching/executor/type_resolver_source.rb

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,66 +51,76 @@ def fetch(ops)
5151
# }"
5252
def build_document(origin_sets_by_operation, operation_name = nil, operation_directives = nil)
5353
variable_defs = {}
54-
query_fields = origin_sets_by_operation.map.with_index do |(op, origin_set), batch_index|
54+
fields_buffer = String.new
55+
56+
origin_sets_by_operation.each_with_index do |(op, origin_set), batch_index|
5557
variable_defs.merge!(op.variables)
5658
resolver = @executor.request.supergraph.resolvers_by_version[op.resolver]
59+
fields_buffer << " " unless batch_index.zero?
5760

5861
if resolver.list?
59-
arguments = resolver.arguments.map.with_index do |arg, i|
62+
fields_buffer << "_" << batch_index.to_s << "_result: " << resolver.field << "("
63+
64+
resolver.arguments.each_with_index do |arg, i|
65+
fields_buffer << "," unless i.zero?
6066
if arg.key?
6167
variable_name = "_#{batch_index}_key_#{i}".freeze
6268
@variables[variable_name] = origin_set.map { arg.build(_1) }
6369
variable_defs[variable_name] = arg.to_type_signature
64-
"#{arg.name}:$#{variable_name}"
70+
fields_buffer << arg.name << ":$" << variable_name
6571
else
66-
"#{arg.name}:#{arg.value.print}"
72+
fields_buffer << arg.name << ":" << arg.value.print
6773
end
6874
end
6975

70-
"_#{batch_index}_result: #{resolver.field}(#{arguments.join(",")}) #{op.selections}"
76+
fields_buffer << ") " << op.selections
7177
else
72-
origin_set.map.with_index do |origin_obj, index|
73-
arguments = resolver.arguments.map.with_index do |arg, i|
78+
origin_set.each_with_index do |origin_obj, index|
79+
fields_buffer << " " unless index.zero?
80+
fields_buffer << "_" << batch_index.to_s << "_" << index.to_s << "_result: " << resolver.field << "("
81+
82+
resolver.arguments.each_with_index do |arg, i|
83+
fields_buffer << "," unless i.zero?
7484
if arg.key?
7585
variable_name = "_#{batch_index}_#{index}_key_#{i}".freeze
7686
@variables[variable_name] = arg.build(origin_obj)
7787
variable_defs[variable_name] = arg.to_type_signature
78-
"#{arg.name}:$#{variable_name}"
88+
fields_buffer << arg.name << ":$" << variable_name
7989
else
80-
"#{arg.name}:#{arg.value.print}"
90+
fields_buffer << arg.name << ":" << arg.value.print
8191
end
8292
end
8393

84-
"_#{batch_index}_#{index}_result: #{resolver.field}(#{arguments.join(",")}) #{op.selections}"
94+
fields_buffer << ") " << op.selections
8595
end
8696
end
8797
end
8898

89-
doc = String.new(QUERY_OP) # << resolver fulfillment always uses query
99+
doc_buffer = String.new(QUERY_OP) # << resolver fulfillment always uses query
90100

91101
if operation_name
92-
doc << " " << operation_name
102+
doc_buffer << " " << operation_name
93103
origin_sets_by_operation.each_key do |op|
94-
doc << "_" << op.step.to_s
104+
doc_buffer << "_" << op.step.to_s
95105
end
96106
end
97107

98108
if variable_defs.any?
99-
doc << "("
109+
doc_buffer << "("
100110
variable_defs.each_with_index do |(k, v), i|
101-
doc << "," unless i.zero?
102-
doc << "$" << k << ":" << v
111+
doc_buffer << "," unless i.zero?
112+
doc_buffer << "$" << k << ":" << v
103113
end
104-
doc << ")"
114+
doc_buffer << ")"
105115
end
106116

107117
if operation_directives
108-
doc << " " << operation_directives << " "
118+
doc_buffer << " " << operation_directives << " "
109119
end
110120

111-
doc << "{ " << query_fields.join(" ") << " }"
121+
doc_buffer << "{ " << fields_buffer << " }"
112122

113-
return doc, variable_defs.keys.tap do |names|
123+
return doc_buffer, variable_defs.keys.tap do |names|
114124
names.reject! { @variables.key?(_1) }
115125
end
116126
end

0 commit comments

Comments
 (0)