module GraphQL::Groups::Utils

Public Class Methods

duplicate(keys, values) click to toggle source

This is used by the resul transformer when the user executed a query where some groupings are repeated, so depth of the query doesn't match the length of the query result keys. We need to modify the result keys so everything matches again.

# File lib/graphql/groups/utils.rb, line 20
def duplicate(keys, values)
  return if keys.length == values.length

  duplicates = duplicates(keys)
  return if duplicates.empty?

  duplicates.each do |_, indices|
    first_occurrence, *rest = indices
    value_to_duplicate = values[first_occurrence]
    rest.each { |index| values.insert(index, value_to_duplicate) }
  end
end
wrap(object) click to toggle source
# File lib/graphql/groups/utils.rb, line 7
def wrap(object)
  if object.nil?
    []
  elsif object.respond_to?(:to_ary)
    object.to_ary || [object]
  else
    [object]
  end
end

Private Class Methods

duplicates(array) click to toggle source
# File lib/graphql/groups/utils.rb, line 35
def duplicates(array)
  map = {}
  duplicates = {}
  array.each_with_index do |v, i|
    map[v] = (map[v] || 0) + 1
    duplicates[v] ||= []
    duplicates[v] << i
  end
  duplicates.select { |_, v| v.length > 1 }
end