Class: GraphQL::Execution::Interpreter::Runtime::GraphQLResultHash Private

Inherits:
Object
  • Object
show all
Includes:
GraphQLResult
Defined in:
lib/graphql/execution/interpreter/runtime/graphql_result.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

API:

  • private

Instance Attribute Summary collapse

Attributes included from GraphQLResult

#ast_node, #base_path, #graphql_application_value, #graphql_arguments, #graphql_dead, #graphql_field, #graphql_is_eager, #graphql_is_non_null_in_parent, #graphql_parent, #graphql_result_data, #graphql_result_name, #graphql_result_type, #graphql_selections

Instance Method Summary collapse

Methods included from GraphQLResult

#build_path, #depth, #path

Constructor Details

#initialize(_result_name, _result_type, _application_value, _parent_result, _is_non_null_in_parent, _selections, _is_eager, _ast_node, _graphql_arguments, graphql_field) ⇒ GraphQLResultHash

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

rubocop:disable Metrics/ParameterLists

API:

  • private



62
63
64
65
66
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 62

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

Instance Attribute Details

#graphql_merged_intoObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



72
73
74
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 72

def graphql_merged_into
  @graphql_merged_into
end

#ordered_result_keysObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



68
69
70
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 68

def ordered_result_keys
  @ordered_result_keys
end

Instance Method Details

#[](k) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



134
135
136
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 134

def [](k)
  (@graphql_metadata || @graphql_result_data)[k]
end

#collect_result(result_name, result_value) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

hook for breadth-first implementations to signal when collecting results.

API:

  • private



170
171
172
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 170

def collect_result(result_name, result_value)
  false
end

#delete(key) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



117
118
119
120
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 117

def delete(key)
  @graphql_metadata && @graphql_metadata.delete(key)
  @graphql_result_data.delete(key)
end

#eachObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



122
123
124
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 122

def each
  (@graphql_metadata || @graphql_result_data).each { |k, v| yield(k, v) }
end

#fix_result_orderObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



161
162
163
164
165
166
167
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 161

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

#key?(k) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

API:

  • private



130
131
132
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 130

def key?(k)
  @graphql_result_data.key?(k)
end

#merge_into(into_result) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 138

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

#set_child_result(key, value) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 100

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

#set_leaf(key, value) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 74

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

#valuesObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



126
127
128
# File 'lib/graphql/execution/interpreter/runtime/graphql_result.rb', line 126

def values
  (@graphql_metadata || @graphql_result_data).values
end