module Sequel::Plugins::TstzrangeFields

Constants

VERSION

Public Class Methods

configure(model, *args) click to toggle source
# File lib/sequel/plugins/tstzrange_fields.rb, line 37
def self.configure(model, *args)
  unless model.db.schema_type_class(:tstzrange)
    msg = 'tstzrange_fields plugin requires pg_range db extension to be installed. ' \
          ' Use db.extension(:pg_range) after the db = Sequel.connect call.'
    raise msg
  end
  args << :period if args.empty?
  args = args.flatten

  setup_model(model)

  args.flatten.each do |column|
    create_accessors(model, column)
  end
end
create_accessors(model, column) click to toggle source
# File lib/sequel/plugins/tstzrange_fields.rb, line 70
def self.create_accessors(model, column)
  get_column_method = column.to_sym
  set_column_method = "#{column}=".to_sym
  get_begin_method = "#{column}_begin".to_sym
  set_begin_method = "#{column}_begin=".to_sym
  get_end_method = "#{column}_end".to_sym
  set_end_method = "#{column}_end=".to_sym

  model.define_method(get_column_method) do
    self[column]
  end

  model.define_method(set_column_method) do |value|
    case value
    when Sequel::Postgres::PGRange
      self[column] = value
    when Float::INFINITY
      range = Sequel::Postgres::PGRange.new(nil, nil, empty: false, db_type: :tstzrange)
      self[column] = range
    when 'empty'
      self[column] = Sequel::Postgres::PGRange.empty(:tstzrange)
    else
      beg = value.respond_to?(:begin) ? value.begin : (value[:begin] || value['begin'])
      en = value.respond_to?(:end) ? value.end : (value[:end] || value['end'])
      self[column] = self.class.new_tstzrange(beg, en)
    end
  end

  model.define_method(get_begin_method) do
    send(get_column_method).begin
  end

  model.define_method(set_begin_method) do |new_time|
    new_range = self.class.new_tstzrange(new_time, send(get_end_method))
    send(set_column_method, new_range)
  end

  model.define_method(get_end_method) do
    r = send(get_column_method)
    return r.nil? ? nil : r.end # &.end is invalid syntax
  end

  model.define_method(set_end_method) do |new_time|
    new_range = self.class.new_tstzrange(send(get_begin_method), new_time)
    send(set_column_method, new_range)
  end
end
setup_model(model) click to toggle source
# File lib/sequel/plugins/tstzrange_fields.rb, line 53
def self.setup_model(model)
  model.class.define_method(:new_tstzrange) do |b, e|
    b = value_to_time(b)
    e = value_to_time(e)
    return Sequel::Postgres::PGRange.empty(:tstzrange) if b.nil? && e.nil?

    return Sequel::Postgres::PGRange.new(b&.to_time, e&.to_time, db_type: :tstzrange, exclude_end: true)
  end

  model.class.define_method(:value_to_time) do |v|
    return v if v.nil?
    return v if v.respond_to?(:to_time)

    return Time.parse(v)
  end
end