Skip to content

Commit

Permalink
Refactor using PredicateBuilder class
Browse files Browse the repository at this point in the history
  • Loading branch information
shioyama committed Apr 29, 2018
1 parent 51d21d5 commit e187657
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 21 deletions.
17 changes: 0 additions & 17 deletions lib/mobility/backends/active_record.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,6 @@ def self.included(backend_class)
end

module ClassMethods
def build_predicate(attr, locale, values, backend_options)
node = build_node(attr, locale, backend_options)

nils, vals = Array.wrap(collapse(values)).uniq.partition(&:nil?)
return node.eq(nil) if vals.empty?

vals = vals.map { |val| quote_value(val, backend_options) }

predicate = vals.length == 1 ? node.eq(vals.first) : node.in(vals)
predicate = predicate.or(node.eq(nil)) unless nils.empty?
predicate
end

def quote_value(value, **)
value.to_s
end
Expand All @@ -32,10 +19,6 @@ def add_scope(relation, _opts, _locale, _invert, _backend_options)
relation
end

def collapse(value)
value.is_a?(Array) ? value.uniq : value
end

def build_quoted(value)
::Arel::Nodes.build_quoted(value)
end
Expand Down
2 changes: 1 addition & 1 deletion lib/mobility/backends/active_record/jsonb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class Jsonb < PgHash

def self.build_node(attr, locale, model_class:, column_affix:, **)
column_name = column_affix % attr
Node.new(model_class.arel_table[column_name], ::Arel::Nodes.build_quoted(locale))
Node.new(model_class.arel_table[column_name], build_quoted(locale))
end

def self.quote_value(value, **)
Expand Down
29 changes: 26 additions & 3 deletions lib/mobility/plugins/query.rb
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,9 @@ def map(opts, locale, invert: false)

attrs_opts = opts.slice(*i18n_keys)

backend_class = attrs.backend_class
predicate_builder = PredicateBuilder.new(attrs.backend_class)
predicates += i18n_keys.map do |key|
backend_class.build_predicate(key, locale, opts.delete(key), attrs.options)
predicate_builder.build(key, locale, opts.delete(key), attrs.options)
end

[attrs, attrs_opts]
Expand All @@ -91,7 +91,30 @@ def map(opts, locale, invert: false)
end
end

private_constant :WhereChain, :ClauseMapper
class PredicateBuilder
def initialize(backend_class)
@backend_class = backend_class
end

def build(attr, locale, values, backend_options)
node = @backend_class.build_node(attr, locale, backend_options)

nils, vals = Array.wrap(collapse(values)).uniq.partition(&:nil?)
return node.eq(nil) if vals.empty?

vals = vals.map { |val| @backend_class.quote_value(val, backend_options) }

predicate = vals.length == 1 ? node.eq(vals.first) : node.in(vals)
predicate = predicate.or(node.eq(nil)) unless nils.empty?
predicate
end

def collapse(value)
value.is_a?(Array) ? value.uniq : value
end
end

private_constant :WhereChain, :ClauseMapper, :PredicateBuilder
end

class FindByMethods < Module
Expand Down

0 comments on commit e187657

Please sign in to comment.