class Zen::Query::ApiBlock

Constants

OPTION_KEYS

Attributes

block[R]
force[R]
options[R]
presence_fields[R]
value_fields[R]

Public Class Methods

new(presence_fields:, value_fields:, block:, force: false) click to toggle source
# File lib/zen/query/api_block.rb, line 11
def initialize(presence_fields:, value_fields:, block:, force: false)
  @options = extract_options!(value_fields)

  @presence_fields = presence_fields
  @value_fields = value_fields
  @block = block
  @force = force
end

Public Instance Methods

fits?(query) click to toggle source
# File lib/zen/query/api_block.rb, line 20
def fits?(query)
  return false unless conditions_met_by?(query)
  return true if force

  (presence_fields.empty? && value_fields.empty?) ||
    values_for(query.params).all? { |value| present?(value) }
end
index() click to toggle source
# File lib/zen/query/api_block.rb, line 36
def index
  case options[:index]
  when :first  then -Float::INFINITY
  when :last   then Float::INFINITY
  when Numeric then options[:index]
  else 0
  end
end
present?(value) click to toggle source
# File lib/zen/query/api_block.rb, line 32
def present?(value)
  value.respond_to?(:empty?) ? !value.empty? : !!value
end
values_for(params) click to toggle source
# File lib/zen/query/api_block.rb, line 28
def values_for(params)
  params.values_at(*presence_fields) + valued_values_for(params)
end

Private Instance Methods

condition_met?(query, key) click to toggle source
# File lib/zen/query/api_block.rb, line 63
def condition_met?(query, key)
  return true unless options.key?(key)

  condition = options[key]

  value =
    case condition
    when String, Symbol then query.send(condition)
    when Proc then query.instance_exec(&condition)
    else condition
    end

  key == :if ? value : !value
end
conditions_met_by?(query) click to toggle source
# File lib/zen/query/api_block.rb, line 59
def conditions_met_by?(query)
  condition_met?(query, :if) && condition_met?(query, :unless)
end
extract_options!(fields) click to toggle source
# File lib/zen/query/api_block.rb, line 47
def extract_options!(fields)
  fields.keys.each_with_object({}) do |key, options|
    options[key] = fields.delete(key) if OPTION_KEYS.include?(key)
  end
end
valued_values_for(params) click to toggle source
# File lib/zen/query/api_block.rb, line 53
def valued_values_for(params)
  value_fields.map do |field, required_value|
    params[field] == required_value && required_value
  end
end