class BazaModels::Query::Inspector

Public Class Methods

new(args) click to toggle source
# File lib/baza_models/query/inspector.rb, line 2
def initialize(args)
  @query = args.fetch(:query)
  @model = args.fetch(:model)
  @argument = args.fetch(:argument)
  @joins = args.fetch(:joins)
  @joins_tracker = args.fetch(:joins_tracker)
end

Public Instance Methods

execute() click to toggle source
# File lib/baza_models/query/inspector.rb, line 10
def execute
  inspect_argument(@argument)
end

Private Instance Methods

inspect_argument(argument) click to toggle source
# File lib/baza_models/query/inspector.rb, line 16
def inspect_argument(argument)
  if argument.is_a?(Hash)
    inspect_hash(argument)
  elsif argument.is_a?(Array)
    argument.each do |argument_i|
      inspect_argument(argument_i)
    end
  elsif argument.is_a?(Symbol)
    inspect_symbol(argument)
  elsif argument.is_a?(String)
    inspect_string(argument)
  end
end
inspect_hash(argument) click to toggle source
# File lib/baza_models/query/inspector.rb, line 58
def inspect_hash(argument)
  argument.each do |key, value|
    inspect_symbol(key)

    relationship_pair = @model.relationships.detect { |relationship_name, _relationship| relationship_name == key }
    raise "Could not find a relationship on #{@model.name} by that name: #{value}" unless relationship_pair

    relationship = relationship_pair[1]

    BazaModels::Query::Inspector.new(
      query: @query,
      argument: value,
      model: StringCases.constantize(relationship.fetch(:class_name)),
      joins: @joins,
      joins_tracker: @joins_tracker[key]
    ).execute
  end
end
inspect_string(argument) click to toggle source
# File lib/baza_models/query/inspector.rb, line 30
def inspect_string(argument)
  @joins << argument
end
inspect_symbol(argument) click to toggle source
# File lib/baza_models/query/inspector.rb, line 34
def inspect_symbol(argument)
  return if @joins_tracker.include?(argument)

  relationship_pair = @model.relationships.detect { |key, _value| key == argument }
  raise "Could not find a relationship on #{@model.name} by that name: #{argument}" unless relationship_pair

  relationship = relationship_pair[1]

  table_name = relationship.fetch(:table_name)

  if relationship.fetch(:type) == :belongs_to
    column_left = :id
    column_right = relationship.fetch(:foreign_key)
  else
    column_left = relationship.fetch(:foreign_key)
    column_right = :id
  end

  orig_table = @model.table_name

  @joins << "INNER JOIN `#{table_name}` ON `#{table_name}`.`#{column_left}` = `#{orig_table}`.`#{column_right}`"
  @joins_tracker[argument] = {}
end