class ArelExtensions::Nodes::DateAdd
Constants
- RETURN_TYPE
Attributes
date_type[RW]
Public Class Methods
new(expr)
click to toggle source
Calls superclass method
# File lib/arel_extensions/nodes/date_diff.rb, line 40 def initialize expr col = expr.first @date_type = type_of_attribute(col) tab = expr.map do |arg| convert(arg) end return super(tab) end
Public Instance Methods
mssql_datepart(v = nil)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 136 def mssql_datepart(v = nil) v ||= self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :date Arel.sql('day') elsif @date_type == :datetime res = if v.parts.size == 1 # first entry in the dict v.parts; one of [:years, :months, :weeks, :days, :hours, :minutes, :seconds] # | the key # | | convert symbol to string # | | | remove the plural suffix `s` # v v v v v.parts.first.first.to_s[0..-2] else 'second' end Arel.sql(res) end else if ArelExtensions::Nodes::Duration === v v.with_interval = true case v.left when 'd', 'm', 'y' Arel.sql('day') when 'h', 'mn', 's' Arel.sql('second') when /i\z/ Arel.sql(ArelExtensions::Visitors::MSSQL::LOADED_VISITOR::DATE_MAPPING[v.left[0..-2]]) else Arel.sql(ArelExtensions::Visitors::MSSQL::LOADED_VISITOR::DATE_MAPPING[v.left]) end end end end
mssql_value(v = nil)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 114 def mssql_value(v = nil) v ||= self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :date v.to_i / (24 * 3600) elsif @date_type == :datetime if v.parts.size == 1 # first entry in the dict v.parts; one of [:years, :months, :weeks, :days, :hours, :minutes, :seconds] # | the value # | | # | | # v v v.parts.first.second else v.to_i end end else v end end
mysql_value(v = nil)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 62 def mysql_value(v = nil) v ||= self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :date || @date_type == :datetime Arel.sql('INTERVAL %s' % v.inspect.sub(/s\Z/, '')) end else if ArelExtensions::Nodes::Duration === v v.with_interval = true v else v end end end
oracle_value(v = nil)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 96 def oracle_value(v = nil) v ||= self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :ruby_date Arel.sql("(INTERVAL '1' DAY) * %s" % v.inspect.to_i) else Arel.sql("(INTERVAL '1' SECOND) * %s" % v.to_i) end else if ArelExtensions::Nodes::Duration === v v.with_interval = true v else v end end end
postgresql_value(v = nil)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 78 def postgresql_value(v = nil) v ||= self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :date Arel.sql("INTERVAL '%s'" % v.inspect.sub(/s\Z/, '').upcase) elsif @date_type == :datetime Arel.sql("INTERVAL '%s'" % v.inspect.sub(/s\Z/, '').upcase) end else if ArelExtensions::Nodes::Duration === v v.with_interval = true v else v end end end
sqlite_value()
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 49 def sqlite_value v = self.expressions.last if defined?(ActiveSupport::Duration) && ActiveSupport::Duration === v if @date_type == :date return Arel.quoted((v.value >= 0 ? '+' : '-') + v.inspect) elsif @date_type == :datetime return Arel.quoted((v.value >= 0 ? '+' : '-') + v.inspect) end else return v end end
Private Instance Methods
convert(object)
click to toggle source
# File lib/arel_extensions/nodes/date_diff.rb, line 173 def convert(object) case object when Arel::Attributes::Attribute, Arel::Nodes::Node, ActiveSupport::Duration object when Integer object.days when DateTime, Time, Date raise(ArgumentError, "#{object.class} cannot be converted to Integer") when String Arel.quoted(object) else raise(ArgumentError, "#{object.class} cannot be converted to Integer") end end