Module: Sequel::Plugins::Bitemporal::ClassMethods

Defined in:
lib/sequel/plugins/bitemporal.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#audit_classObject (readonly)

Returns the value of attribute audit_class.



220
221
222
# File 'lib/sequel/plugins/bitemporal.rb', line 220

def audit_class
  @audit_class
end

#audit_updated_by_methodObject (readonly)

Returns the value of attribute audit_updated_by_method.



220
221
222
# File 'lib/sequel/plugins/bitemporal.rb', line 220

def audit_updated_by_method
  @audit_updated_by_method
end

#current_version_aliasObject (readonly)

Returns the value of attribute current_version_alias.



220
221
222
# File 'lib/sequel/plugins/bitemporal.rb', line 220

def current_version_alias
  @current_version_alias
end

#excluded_columnsObject (readonly)

Returns the value of attribute excluded_columns.



220
221
222
# File 'lib/sequel/plugins/bitemporal.rb', line 220

def excluded_columns
  @excluded_columns
end

#propagate_per_columnObject (readonly)

Returns the value of attribute propagate_per_column.



220
221
222
# File 'lib/sequel/plugins/bitemporal.rb', line 220

def propagate_per_column
  @propagate_per_column
end

#use_rangesObject (readonly)

Returns the value of attribute use_ranges.



220
221
222
# File 'lib/sequel/plugins/bitemporal.rb', line 220

def use_ranges
  @use_ranges
end

#version_classObject (readonly)

Returns the value of attribute version_class.



220
221
222
# File 'lib/sequel/plugins/bitemporal.rb', line 220

def version_class
  @version_class
end

#version_uses_string_nilifierObject (readonly)

Returns the value of attribute version_uses_string_nilifier.



220
221
222
# File 'lib/sequel/plugins/bitemporal.rb', line 220

def version_uses_string_nilifier
  @version_uses_string_nilifier
end

#versions_aliasObject (readonly)

Returns the value of attribute versions_alias.



220
221
222
# File 'lib/sequel/plugins/bitemporal.rb', line 220

def versions_alias
  @versions_alias
end

Instance Method Details

#existence_range(qualifier = nil) ⇒ Object



258
259
260
261
262
263
264
265
266
# File 'lib/sequel/plugins/bitemporal.rb', line 258

def existence_range(qualifier=nil)
  created_at_column = :created_at
  created_at_column = Sequel.qualify qualifier, created_at_column if qualifier
  expired_at_column = :expired_at
  expired_at_column = Sequel.qualify qualifier, expired_at_column if qualifier
  Sequel.function(
    :tsrange, created_at_column, expired_at_column, "[)"
  ).pg_range
end

#existence_range_contains(point_in_time, qualifier = nil) ⇒ Object



268
269
270
271
272
# File 'lib/sequel/plugins/bitemporal.rb', line 268

def existence_range_contains(point_in_time, qualifier=nil)
  existence_range(qualifier).contains(
    Sequel.cast(point_in_time, :timestamp)
  )
end

#validity_cast_typeObject



247
248
249
250
251
252
253
254
255
256
# File 'lib/sequel/plugins/bitemporal.rb', line 247

def validity_cast_type
  case validity_range_type
  when :daterange
    :date
  when :tsrange, :tstzrange
    :timestamp
  else
    raise "Don't know how to handle cast for range type: #{validity_range_type}"
  end
end

#validity_range(qualifier = nil) ⇒ Object



274
275
276
277
278
279
280
281
282
283
# File 'lib/sequel/plugins/bitemporal.rb', line 274

def validity_range(qualifier=nil)
  valid_from_column = :valid_from
  valid_from_column = Sequel.qualify qualifier, valid_from_column if qualifier
  valid_to_column = :valid_to
  valid_to_column = Sequel.qualify qualifier, valid_to_column if qualifier

  Sequel.function(
    validity_range_type, valid_from_column, valid_to_column, "[)"
  ).pg_range
end

#validity_range_contains(now, qualifier = nil) ⇒ Object



285
286
287
288
289
# File 'lib/sequel/plugins/bitemporal.rb', line 285

def validity_range_contains(now, qualifier=nil)
  validity_range(qualifier).contains(
    Sequel.cast(now, validity_cast_type)
  )
end

#validity_range_typeObject



224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
# File 'lib/sequel/plugins/bitemporal.rb', line 224

def validity_range_type
  @validity_range_type ||= begin
    valid_from_infos = db.schema(
      version_class.table_name
    ).detect do |column_name, _|
      column_name==:valid_from
    end
    unless valid_from_infos
      raise "Could not find valid_from column in #{version_class.table_name}"
    end
    case valid_from_infos.last[:db_type]
    when "date"
      :daterange
    when "timestamp without time zone"
      :tsrange
    when "timestamp with time zone"
      :tstzrange
    else
      raise "Don't know how to handle ranges for type: #{valid_from_infos[:db_type]}"
    end
  end
end