class GraphqlPreloadQueries::Extensions::Preload

Public Class Methods

preload_associations(value, node, type_klass) click to toggle source

Add all the corresponding preloads to the collection @param value (ActiveCollection) @param @node (GqlNode) @param @type_klass (GqlTypeKlass) @return @data with necessary preloads

# File lib/graphql_preload_queries/extensions/preload.rb, line 14
def preload_associations(value, node, type_klass)
  preloads = filter_preloads(node, type_klass.preloads || {})
  log_info = { type_klass: type_klass, preloads: preloads, configured: type_klass.preloads }
  GraphqlPreloadQueries.log("Preloading: #{log_info}")
  apply_preloads(value, preloads)
end

Private Class Methods

add_preload_key(root, key, value) click to toggle source

parse nested preload key and add it to the tree Sample: parent_preload: “categories.users”

==> { categories: { users: [res here] } }
# File lib/graphql_preload_queries/extensions/preload.rb, line 61
def add_preload_key(root, key, value)
  key_path = key.to_s.split('.').map(&:to_sym)
  root.dig(*key_path)
  *path, last = key_path
  path.inject(root, :fetch)[last] = value
end
apply_preloads(collection, preloads) click to toggle source
# File lib/graphql_preload_queries/extensions/preload.rb, line 23
def apply_preloads(collection, preloads)
  collection.eager_load(preloads)
end
filter_preload(node, key, preload_conf, root) click to toggle source

find preloads under a specific key

# File lib/graphql_preload_queries/extensions/preload.rb, line 38
def filter_preload(node, key, preload_conf, root)
  sub_node = sub_node(node, key)
  multiple_preload = preload_conf.is_a?(Hash)
  return unless sub_node
  return add_preload_key(root, preload_conf, {}) unless multiple_preload

  child_root = nested_hash
  association_name = preload_conf[:preload] || key.to_s.underscore
  filter_preloads(sub_node, preload_conf, child_root)
  add_preload_key(root, association_name, child_root.presence || {})
end
filter_preloads(node, preload_conf, root = nested_hash) click to toggle source

find all configured preloads inside a node

# File lib/graphql_preload_queries/extensions/preload.rb, line 28
def filter_preloads(node, preload_conf, root = nested_hash)
  return root unless node

  preload_conf.map do |key, sub_preload_conf|
    filter_preload(node, key, sub_preload_conf, root)
  end
  root
end
nested_hash() click to toggle source
# File lib/graphql_preload_queries/extensions/preload.rb, line 68
def nested_hash
  Hash.new { |h, k| h[k] = {} }
end
sub_node(node, key) click to toggle source
# File lib/graphql_preload_queries/extensions/preload.rb, line 50
def sub_node(node, key)
  is_relay_node = %w[nodes edges].include?(node.selections.first.name)
  node = node.selections.first if is_relay_node
  node.selections.find do |node_i|
    key.to_s.split('|').include?(node_i.name.to_s)
  end
end