module Mobility::Plugins::Sequel::Query::QueryBuilder

Constants

IDENTITY

Public Class Methods

build(dataset, query_method, query_conds) { || ... } click to toggle source
# File lib/mobility/plugins/sequel/query.rb, line 123
def build(dataset, query_method, query_conds, &block)
  return yield unless ::Hash === query_conds.first

  cond = query_conds.first.dup
  locale = cond.delete(:locale) || Mobility.locale

  _build(dataset, cond, locale, query_method, &block)
end

Private Class Methods

_build(dataset, cond, locale, query_method) { || ... } click to toggle source
# File lib/mobility/plugins/sequel/query.rb, line 134
def _build(dataset, cond, locale, query_method)
  keys, predicates = cond.keys, []
  model = dataset.model

  query_map = attribute_modules(model).inject(IDENTITY) do |qm, mod|
    i18n_keys = mod.names.map(&:to_sym) & keys
    next qm if i18n_keys.empty?

    mod_predicates = i18n_keys.map do |key|
      build_predicate(dataset.backend_op(key, locale), cond.delete(key))
    end
    predicates += mod_predicates

    ->(ds) { mod.backend_class.prepare_dataset(qm[ds], mod_predicates, locale) }
  end

  return yield if query_map == IDENTITY

  predicates = ::Sequel.&(*predicates, cond) unless cond.empty?
  query_map[dataset.public_send(query_method, ::Sequel.&(*predicates))]
end
attribute_modules(model) click to toggle source
# File lib/mobility/plugins/sequel/query.rb, line 156
def attribute_modules(model)
  model.ancestors.grep(::Mobility::Translations)
end
build_predicate(op, values) click to toggle source
# File lib/mobility/plugins/sequel/query.rb, line 160
def build_predicate(op, values)
  vals = values.is_a?(Array) ? values.uniq: [values]
  vals = vals.first if vals.size == 1
  op =~ vals
end