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