class GraphQL::Execution::Interpreter::Runtime::GraphQLResultHash
Attributes
Public Class Methods
# File lib/graphql/execution/interpreter/runtime/graphql_result.rb, line 65 def initialize(_result_name, _result_type, _application_value, _parent_result, _is_non_null_in_parent, _selections, _is_eager, _ast_node, _graphql_arguments, graphql_field) # rubocop:disable Metrics/ParameterLists super @graphql_result_data = {} @ordered_result_keys = nil end
Calls superclass method
GraphQL::Execution::Interpreter::Runtime::GraphQLResult::new
Public Instance Methods
Source
# File lib/graphql/execution/interpreter/runtime/graphql_result.rb, line 137 def [](k) (@graphql_metadata || @graphql_result_data)[k] end
# File lib/graphql/execution/interpreter/runtime/graphql_result.rb, line 173 def collect_result(result_name, result_value) false end
hook for breadth-first implementations to signal when collecting results.
Source
# File lib/graphql/execution/interpreter/runtime/graphql_result.rb, line 120 def delete(key) @graphql_metadata && @graphql_metadata.delete(key) @graphql_result_data.delete(key) end
Source
# File lib/graphql/execution/interpreter/runtime/graphql_result.rb, line 125 def each (@graphql_metadata || @graphql_result_data).each { |k, v| yield(k, v) } end
Source
# File lib/graphql/execution/interpreter/runtime/graphql_result.rb, line 164 def fix_result_order @ordered_result_keys.each do |k| if @graphql_result_data.key?(k) @graphql_result_data[k] = @graphql_result_data.delete(k) end end end
Source
# File lib/graphql/execution/interpreter/runtime/graphql_result.rb, line 133 def key?(k) @graphql_result_data.key?(k) end
Source
# File lib/graphql/execution/interpreter/runtime/graphql_result.rb, line 141 def merge_into(into_result) self.each do |key, value| case value when GraphQLResultHash next_into = into_result[key] if next_into value.merge_into(next_into) else into_result.set_child_result(key, value) end when GraphQLResultArray # There's no special handling of arrays because currently, there's no way to split the execution # of a list over several concurrent flows. into_result.set_child_result(key, value) else # We have to assume that, since this passed the `fields_will_merge` selection, # that the old and new values are the same. into_result.set_leaf(key, value) end end @graphql_merged_into = into_result end
# File lib/graphql/execution/interpreter/runtime/graphql_result.rb, line 103 def set_child_result(key, value) if (t = @graphql_merged_into) t.set_child_result(key, value) end before_size = @graphql_result_data.size @graphql_result_data[key] = value.graphql_result_data after_size = @graphql_result_data.size if after_size > before_size && @ordered_result_keys[before_size] != key fix_result_order end # If we encounter some part of this response that requires metadata tracking, # then create the metadata hash if necessary. It will be kept up-to-date after this. (@graphql_metadata ||= @graphql_result_data.dup)[key] = value value end
Source
# File lib/graphql/execution/interpreter/runtime/graphql_result.rb, line 77 def set_leaf(key, value) # This is a hack. # Basically, this object is merged into the root-level result at some point. # But the problem is, some lazies are created whose closures retain reference to _this_ # object. When those lazies are resolved, they cause an update to this object. # # In order to return a proper top-level result, we have to update that top-level result object. # In order to return a proper partial result (eg, for a directive), we have to update this object, too. # Yowza. if (t = @graphql_merged_into) t.set_leaf(key, value) end before_size = @graphql_result_data.size @graphql_result_data[key] = value after_size = @graphql_result_data.size if after_size > before_size && @ordered_result_keys[before_size] != key fix_result_order end # keep this up-to-date if it's been initialized @graphql_metadata && @graphql_metadata[key] = value value end
Source
# File lib/graphql/execution/interpreter/runtime/graphql_result.rb, line 129 def values (@graphql_metadata || @graphql_result_data).values end