class Mobility::Backends::Sequel::Table

Implements the {Mobility::Backends::Table} backend for Sequel models.

Public Class Methods

build_op(attr, locale) click to toggle source

@param [Symbol] name Attribute name @param [Symbol] locale Locale @return [Sequel::SQL::QualifiedIdentifier]

# File lib/mobility/backends/sequel/table.rb, line 51
def build_op(attr, locale)
  ::Sequel::SQL::QualifiedIdentifier.new(table_alias(locale), attr || :value)
end
configure(options) click to toggle source

@!group Backend Configuration @option options [Symbol] association_name (:translations) Name of association method @option options [Symbol] table_name Name of translation table @option options [Symbol] foreign_key Name of foreign key @option options [Symbol] subclass_name Name of subclass to append to model class to generate translation class @raise [CacheRequired] if cache option is false

# File lib/mobility/backends/sequel/table.rb, line 33
def configure(options)
  raise CacheRequired, "Cache required for Sequel::Table backend" if options[:cache] == false
  table_name = Util.singularize(model_class.table_name)
  options[:table_name]  ||= :"#{table_name}_translations"
  options[:foreign_key] ||= Util.foreign_key(Util.camelize(table_name.downcase))
  if association_name = options[:association_name]
    options[:subclass_name] ||= Util.camelize(Util.singularize(association_name))
  else
    options[:association_name] = :translations
    options[:subclass_name] ||= :Translation
  end
  %i[table_name foreign_key association_name subclass_name].each { |key| options[key] = options[key].to_sym }
end
prepare_dataset(dataset, predicate, locale) click to toggle source

@param [Sequel::Dataset] dataset Dataset to prepare @param [Object] predicate Predicate @param [Symbol] locale Locale @return [Sequel::Dataset] Prepared dataset

# File lib/mobility/backends/sequel/table.rb, line 59
def prepare_dataset(dataset, predicate, locale)
  join_translations(dataset, locale, visit(predicate, locale))
end
translation_class() click to toggle source

@return [Symbol] class for translations

# File lib/mobility/backends/sequel/table.rb, line 23
def translation_class
  @translation_class ||= model_class.const_get(subclass_name)
end

Private Class Methods

join_translations(dataset, locale, join_type) click to toggle source
# File lib/mobility/backends/sequel/table.rb, line 65
def join_translations(dataset, locale, join_type)
  if joins = dataset.opts[:join]
    return dataset if joins.any? { |clause| clause.table_expr.alias == table_alias(locale) }
  end
  dataset.join_table(join_type,
                     translation_class.table_name,
                     {
                       locale: locale.to_s,
                       foreign_key => ::Sequel[model_class.table_name][:id]
                     },
                     table_alias: table_alias(locale))
end
visit(predicate, locale) click to toggle source

@return [Symbol] Join type

# File lib/mobility/backends/sequel/table.rb, line 79
def visit(predicate, locale)
  case predicate
  when Array
    visit_collection(predicate, locale)
  when ::Sequel::SQL::QualifiedIdentifier
    visit_sql_identifier(predicate, locale)
  when ::Sequel::SQL::BooleanExpression
    visit_boolean(predicate, locale)
  when ::Sequel::SQL::Expression
    visit(predicate.args, locale)
  else
    nil
  end
end
visit_boolean(boolean, locale) click to toggle source
# File lib/mobility/backends/sequel/table.rb, line 106
def visit_boolean(boolean, locale)
  if boolean.op == :'='
    boolean.args.any? { |op| visit(op, locale) } && :inner || nil
  elsif boolean.op == :IS
    boolean.args.any?(&:nil?) && :left_outer || nil
  elsif boolean.op == :OR
    boolean.args.any? { |op| visit(op, locale) } && :left_outer || nil
  else
    visit(boolean.args, locale)
  end
end
visit_collection(collection, locale) click to toggle source
# File lib/mobility/backends/sequel/table.rb, line 94
def visit_collection(collection, locale)
  collection.map { |obj|
    visit(obj, locale).tap do |visited|
      return visited if visited == :inner
    end
  }.compact.first
end
visit_sql_identifier(identifier, locale) click to toggle source
# File lib/mobility/backends/sequel/table.rb, line 102
def visit_sql_identifier(identifier, locale)
  (table_alias(locale) == identifier.table) && :inner || nil
end

Public Instance Methods

translation_class() click to toggle source
# File lib/mobility/backends/sequel/table.rb, line 17
def translation_class
  self.class.translation_class
end
translation_for(locale, **) click to toggle source
# File lib/mobility/backends/sequel/table.rb, line 161
def translation_for(locale, **)
  translation = model.send(association_name).find { |t| t.locale == locale.to_s }
  translation ||= translation_class.new(locale: locale)
  translation
end