1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Merge pull request #38719 from eileencodes/refactor-fetch_attribute

Refactor fetch_attribute
This commit is contained in:
Eileen M. Uchitelle 2020-03-13 16:26:49 -04:00 committed by GitHub
commit 99b607e6ad
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 43 additions and 26 deletions

View file

@ -47,16 +47,8 @@ module Arel
end end
def self.fetch_attribute(value, &block) # :nodoc: def self.fetch_attribute(value, &block) # :nodoc:
case value unless String === value
when Arel::Nodes::Between, Arel::Nodes::In, Arel::Nodes::NotIn, Arel::Nodes::Equality, value.fetch_attribute(&block)
Arel::Nodes::NotEqual, Arel::Nodes::LessThan, Arel::Nodes::LessThanOrEqual,
Arel::Nodes::GreaterThan, Arel::Nodes::GreaterThanOrEqual
attribute_value = value.detect_attribute
yield attribute_value if attribute_value
when Arel::Nodes::Or
fetch_attribute(value.left, &block) && fetch_attribute(value.right, &block)
when Arel::Nodes::Grouping
fetch_attribute(value.expr, &block)
end end
end end
end end

View file

@ -11,14 +11,6 @@ module Arel # :nodoc: all
@right = right @right = right
end end
def detect_attribute
if self.left.is_a?(Arel::Attributes::Attribute)
self.left
elsif self.right.is_a?(Arel::Attributes::Attribute)
self.right
end
end
def initialize_copy(other) def initialize_copy(other)
super super
@left = @left.clone if @left @left = @left.clone if @left
@ -37,18 +29,34 @@ module Arel # :nodoc: all
alias :== :eql? alias :== :eql?
end end
module FetchAttribute
def fetch_attribute
if left.is_a?(Arel::Attributes::Attribute)
yield left
elsif right.is_a?(Arel::Attributes::Attribute)
yield right
end
end
end
class Between < Binary; include FetchAttribute; end
class NotIn < Binary; include FetchAttribute; end
class GreaterThan < Binary; include FetchAttribute; end
class GreaterThanOrEqual < Binary; include FetchAttribute; end
class NotEqual < Binary; include FetchAttribute; end
class LessThan < Binary; include FetchAttribute; end
class LessThanOrEqual < Binary; include FetchAttribute; end
class Or < Binary
def fetch_attribute(&block)
left.fetch_attribute(&block) && right.fetch_attribute(&block)
end
end
%w{ %w{
As As
Assignment Assignment
Between
GreaterThan
GreaterThanOrEqual
Join Join
LessThan
LessThanOrEqual
NotEqual
NotIn
Or
Union Union
UnionAll UnionAll
Intersect Intersect

View file

@ -10,6 +10,14 @@ module Arel # :nodoc: all
def invert def invert
Arel::Nodes::NotEqual.new(left, right) Arel::Nodes::NotEqual.new(left, right)
end end
def fetch_attribute
if left.is_a?(Arel::Attributes::Attribute)
yield left
elsif right.is_a?(Arel::Attributes::Attribute)
yield right
end
end
end end
class IsDistinctFrom < Equality class IsDistinctFrom < Equality

View file

@ -3,6 +3,9 @@
module Arel # :nodoc: all module Arel # :nodoc: all
module Nodes module Nodes
class Grouping < Unary class Grouping < Unary
def fetch_attribute(&block)
expr.fetch_attribute(&block)
end
end end
end end
end end

View file

@ -41,6 +41,9 @@ module Arel # :nodoc: all
collector = engine.connection.visitor.accept self, collector collector = engine.connection.visitor.accept self, collector
collector.value collector.value
end end
def fetch_attribute
end
end end
end end
end end

View file

@ -11,6 +11,9 @@ module Arel # :nodoc: all
def encode_with(coder) def encode_with(coder)
coder.scalar = self.to_s coder.scalar = self.to_s
end end
def fetch_attribute
end
end end
end end
end end