class GraphQL::Groups::ResultTransformer

Public Instance Methods

run(query_results) click to toggle source
# File lib/graphql/groups/result_transformer.rb, line 6
def run(query_results)
  # Sort by key length so that deeper nested queries come later
  query_results
    .sort_by { |query_result| query_result.key.length }
    .each_with_object({}) do |query_result, object|
    transform_result(query_result, object)
  end
end

Private Instance Methods

create_nested_result(keys, group_result_keys, object) click to toggle source
# File lib/graphql/groups/result_transformer.rb, line 37
def create_nested_result(keys, group_result_keys, object)
  head_key, *rest_keys = keys
  head_group_key, *rest_group_keys = group_result_keys
  object[head_key] ||= {}
  object[head_key][head_group_key] ||= {}
  inner_hash = object[head_key][head_group_key]
  return inner_hash if rest_keys.empty?

  inner_hash[:group_by] ||= {}
  create_nested_result(rest_keys, rest_group_keys, inner_hash[:group_by])
end
transform_result(query_result, object) click to toggle source
# File lib/graphql/groups/result_transformer.rb, line 17
def transform_result(query_result, object)
  keys = query_result.key
  return object[keys[0]] = [] if query_result.result_hash.empty?

  query_result.result_hash.each do |grouping_result|
    group_result_keys = Utils.wrap(grouping_result[0])
    group_result_value = grouping_result[1]
    Utils.duplicate(keys, group_result_keys)
    inner_hash = create_nested_result(keys, group_result_keys, object)
    if query_result.aggregate.length == 1
      inner_hash[query_result.aggregate[0]] = group_result_value
    else
      aggregate_type = query_result.aggregate[0]
      aggregate_attribute = query_result.aggregate[1]
      inner_hash[aggregate_type] ||= {}
      inner_hash[aggregate_type][aggregate_attribute] ||= group_result_value
    end
  end
end