class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::OID::Range
def extract_bounds(value)
def extract_bounds(value) from, to = value[1..-2].split(',') { from: (value[1] == ',' || from == '-infinity') ? infinity(:negative => true) : from, to: (value[-2] == ',' || to == 'infinity') ? infinity : to, exclude_start: (value[0] == '('), exclude_end: (value[-1] == ')') } end
def infinity(options = {})
def infinity(options = {}) ::Float::INFINITY * (options[:negative] ? -1 : 1) end
def infinity?(value)
def infinity?(value) value.respond_to?(:infinite?) && value.infinite? end
def initialize(subtype)
def initialize(subtype) @subtype = subtype end
def to_integer(value)
def to_integer(value) infinity?(value) ? value : value.to_i end
def type_cast(value)
def type_cast(value) return if value.nil? || value == 'empty' return value if value.is_a?(::Range) extracted = extract_bounds(value) case @subtype when :date from = ConnectionAdapters::Column.value_to_date(extracted[:from]) from -= 1.day if extracted[:exclude_start] to = ConnectionAdapters::Column.value_to_date(extracted[:to]) when :decimal from = BigDecimal.new(extracted[:from].to_s) # FIXME: add exclude start for ::Range, same for timestamp ranges to = BigDecimal.new(extracted[:to].to_s) when :time from = ConnectionAdapters::Column.string_to_time(extracted[:from]) to = ConnectionAdapters::Column.string_to_time(extracted[:to]) when :integer from = to_integer(extracted[:from]) rescue value ? 1 : 0 from -= 1 if extracted[:exclude_start] to = to_integer(extracted[:to]) rescue value ? 1 : 0 else return value end ::Range.new(from, to, extracted[:exclude_end]) end