Class: Sequel::SQL::DateAdd

Inherits:
GenericExpression show all
Defined in:
lib/sequel/extensions/date_arithmetic.rb

Overview

The DateAdd class represents the addition of an interval to a date/timestamp expression.

Defined Under Namespace

Modules: DatasetMethods

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Postgres::HStoreOpMethods

#hstore

Methods included from Postgres::RangeOpMethods

#pg_range

Methods included from Postgres::ArrayOpMethods

#pg_array

Methods included from Postgres::JSONOpMethods

#pg_json, #pg_jsonb

Methods included from Postgres::InetOpMethods

#pg_inet

Methods included from Postgres::PGRowOp::ExpressionMethods

#pg_row

Methods included from SubscriptMethods

#sql_subscript

Methods included from StringMethods

#escaped_ilike, #escaped_like, #ilike, #like

Methods included from PatternMatchMethods

#!~, #=~

Methods included from OrderMethods

#asc, #desc

Methods included from NumericMethods

#+, #coerce

Methods included from ComplexExpressionMethods

#extract, #sql_boolean, #sql_number, #sql_string

Methods included from CastMethods

#cast, #cast_numeric, #cast_string

Methods included from BooleanMethods

#~

Methods included from AliasMethods

#as

Methods inherited from Expression

#==, attr_reader, #clone, #eql?, #hash, inherited, #inspect

Constructor Details

#initialize(expr, interval, opts = OPTS) ⇒ DateAdd

Supports two types of intervals:

Hash

Used directly, but values cannot be plain strings.

ActiveSupport::Duration

Converted to a hash using the interval's parts.


186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/sequel/extensions/date_arithmetic.rb', line 186

def initialize(expr, interval, opts=OPTS)
  @expr = expr

  h = Hash.new(0)
  interval = interval.parts unless interval.is_a?(Hash)
  interval.each do |unit, value|
    # skip nil values
    next unless value

    # Convert weeks to days, as ActiveSupport::Duration can use weeks,
    # but the database-specific literalizers only support days.
    if unit == :weeks
      unit = :days
      value *= 7
    end

    unless DatasetMethods::DURATION_UNITS.include?(unit)
      raise Sequel::Error, "Invalid key used in DateAdd interval hash: #{unit.inspect}"
    end

    # Attempt to prevent SQL injection by users who pass untrusted strings
    # as interval values. It doesn't make sense to support literal strings,
    # due to the numeric adding below.
    if value.is_a?(String)
      raise Sequel::InvalidValue, "cannot provide String value as interval part: #{value.inspect}"
    end

    h[unit] += value
  end

  @interval = Hash[h].freeze
  @cast_type = opts[:cast] if opts[:cast]
  freeze
end

Instance Attribute Details

#cast_typeObject (readonly)

The type to cast the expression to. nil if not overridden, in which cast the generic timestamp type for the database will be used.


181
182
183
# File 'lib/sequel/extensions/date_arithmetic.rb', line 181

def cast_type
  @cast_type
end

#exprObject (readonly)

The expression that the interval is being added to.


173
174
175
# File 'lib/sequel/extensions/date_arithmetic.rb', line 173

def expr
  @expr
end

#intervalObject (readonly)

The interval added to the expression, as a hash with symbol keys.


177
178
179
# File 'lib/sequel/extensions/date_arithmetic.rb', line 177

def interval
  @interval
end