class Rokaki::FilterModel::JoinMap

Attributes

key_paths[R]
result[RW]

Public Class Methods

new(key_paths) click to toggle source
# File lib/rokaki/filter_model/join_map.rb, line 15
def initialize(key_paths)
  @key_paths = key_paths
  @result = {}
end

Public Instance Methods

call() click to toggle source
# File lib/rokaki/filter_model/join_map.rb, line 23
def call
  key_paths.uniq.each do |key_path|
    current_key_path = []
    previous_key = nil

    if Symbol === key_path
      if key_paths.length == 1
        @result = key_paths
      else
        result[key_path] = {} unless result.keys.include? key_path
      end
    end

    if Array === key_path
      key_path.each do |key|
        current_path_length = current_key_path.length

        if current_path_length > 0 && result.dig(current_key_path).nil?

          if current_path_length == 1
            parent_result = result[previous_key]

            if Symbol === parent_result && parent_result != key
              result[previous_key] = [parent_result, key]
            elsif Array === parent_result

              parent_result.each_with_index do |array_item, index|
                if array_item == key
                  current_key_path << index
                end
              end

            else
              result[previous_key] = key unless result[previous_key] == key
            end

          else
            previous_key_path = current_key_path - [previous_key]
            previous_path_length = previous_key_path.length
            p current_key_path

            if previous_path_length == 1
              res = result.dig(*previous_key_path)

              if Symbol === res
                result[previous_key_path.first] = { previous_key => key }
              end
            elsif previous_path_length > 1
              res = result.dig(*previous_key_path)

              if Symbol === res
                base = previous_key_path.pop
                result.dig(*previous_key_path)[base] = { previous_key => key }
              end
            end

          end
        else
        end

        previous_key = key
        current_key_path << key
      end
    end
  end
  result
end