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 127
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
      Arel.sql('second')
    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(Arel::Visitors::MSSQL::DATE_MAPPING[v.left[0..-2]])
      else
        Arel.sql(Arel::Visitors::MSSQL::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
      v.to_i
    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::Nodes.build_quoted((v.value >= 0 ? '+' : '-') + v.inspect)
    elsif @date_type == :datetime
      return Arel::Nodes.build_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 154
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::Nodes.build_quoted(object)
  else
    raise(ArgumentError, "#{object.class} cannot be converted to Integer")
  end
end