Module: Sequel::Plugins::Bitemporal::InstanceMethods

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#pending_versionObject (readonly)

Returns the value of attribute pending_version.



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

def pending_version
  @pending_version
end

Instance Method Details

#after_createObject



326
327
328
329
330
331
332
# File 'lib/sequel/plugins/bitemporal.rb', line 326

def after_create
  super
  if @create_version
    @create_version = nil
    return false unless save_pending_version
  end
end

#after_saveObject



342
343
344
345
# File 'lib/sequel/plugins/bitemporal.rb', line 342

def after_save
  super
  _refresh_set_values @values
end

#attributesObject



290
291
292
293
294
295
296
297
298
# File 'lib/sequel/plugins/bitemporal.rb', line 290

def attributes
  if pending_version
    pending_version.values
  elsif current_version
    current_version.values
  else
    initial_version.values
  end
end

#attributes=(attributes) ⇒ Object



300
301
302
303
304
305
306
307
308
309
310
# File 'lib/sequel/plugins/bitemporal.rb', line 300

def attributes=(attributes)
  @pending_version ||= begin
    current_attributes = {master_id: id}
    current_version.keys.each do |key|
      next if excluded_columns.include? key
      current_attributes[key] = current_version.send key
    end if current_version?
    model.version_class.new current_attributes
  end
  pending_version.set_all attributes
end

#audited?Boolean

Returns:

  • (Boolean)


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

def audited?
  !!self.class.audit_class
end

#before_createObject



321
322
323
324
# File 'lib/sequel/plugins/bitemporal.rb', line 321

def before_create
  @create_version = pending_version_holds_changes?
  super
end

#before_updateObject



334
335
336
337
338
339
340
# File 'lib/sequel/plugins/bitemporal.rb', line 334

def before_update
  if pending_version_holds_changes?
    expire_previous_versions
    return false unless save_pending_version
  end
  super
end

#before_validationObject



274
275
276
277
# File 'lib/sequel/plugins/bitemporal.rb', line 274

def before_validation
  prepare_pending_version
  super
end

#deleted?Boolean

Returns:

  • (Boolean)


381
382
383
# File 'lib/sequel/plugins/bitemporal.rb', line 381

def deleted?
  !new? && !current_version
end

#destroyObject



347
348
349
350
# File 'lib/sequel/plugins/bitemporal.rb', line 347

def destroy
  point_in_time = ::Sequel::Plugins::Bitemporal.point_in_time
  versions_dataset.where(expired_at: nil).where("valid_to>valid_from").update expired_at: point_in_time
end

#destroy_version(version, expand_previous_version) ⇒ Object



352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
# File 'lib/sequel/plugins/bitemporal.rb', line 352

def destroy_version(version, expand_previous_version)
  now = ::Sequel::Plugins::Bitemporal.now
  point_in_time = ::Sequel::Plugins::Bitemporal.point_in_time
  return false if version.valid_to.to_datetime<=now
  associations.delete :current_version
  model.db.transaction do
    success = true
    version_was_valid = now>=version.valid_from.to_datetime
    if expand_previous_version
      previous = versions_dataset.where({
        expired_at: nil,
        valid_to: version.valid_from,
      }).where("valid_to>valid_from").first
      if previous
        if version_was_valid
          success &&= save_fossil previous, created_at: point_in_time, valid_from: now, valid_to: version.valid_to
        else
          success &&= save_fossil previous, created_at: point_in_time, valid_to: version.valid_to
          success &&= previous.update expired_at: point_in_time
        end
      end
    end
    success &&= save_fossil version, created_at: point_in_time, valid_to: now if version_was_valid
    success &&= version.update expired_at: point_in_time
    raise Sequel::Rollback unless success
    success
  end
end

#last_versionObject



385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
# File 'lib/sequel/plugins/bitemporal.rb', line 385

def last_version
  @last_version ||= begin
    return if new?
    t = ::Sequel::Plugins::Bitemporal.point_in_time
    n = ::Sequel::Plugins::Bitemporal.now
    if use_ranges = self.class.use_ranges
      range_conditions = self.class.existence_range_contains t
    end
    versions_dataset.where do
      if use_ranges
        range_conditions
      else
        (created_at <= t) &
        Sequel.|({expired_at=>nil}, expired_at > t)
      end & (valid_from <= n)
    end.order(Sequel.desc(:valid_to), Sequel.desc(:created_at)).first
  end
end

#next_versionObject



404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
# File 'lib/sequel/plugins/bitemporal.rb', line 404

def next_version
  @next_version ||= begin
    return if new?
    t = ::Sequel::Plugins::Bitemporal.point_in_time
    n = ::Sequel::Plugins::Bitemporal.now
    if use_ranges = self.class.use_ranges
      range_conditions = self.class.existence_range_contains t
    end
    versions_dataset.where do
      if use_ranges
        range_conditions
      else
        (created_at <= t) &
        Sequel.|({expired_at=>nil}, expired_at > t)
      end & (valid_from > n)
    end.order(Sequel.asc(:valid_to), Sequel.desc(:created_at)).first
  end
end

#pending_or_current_versionObject



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

def pending_or_current_version
  pending_version || current_version || initial_version
end

#propagated_during_last_saveObject



446
447
448
# File 'lib/sequel/plugins/bitemporal.rb', line 446

def propagated_during_last_save
  @propagated_during_last_save ||= []
end

#reloadObject



438
439
440
441
442
443
444
# File 'lib/sequel/plugins/bitemporal.rb', line 438

def reload
  @last_version = nil
  @current_version_values = nil
  @pending_version = nil
  @initial_version = nil
  super
end

#restore(attrs = {}) ⇒ Object



423
424
425
426
427
428
429
430
431
432
433
434
435
436
# File 'lib/sequel/plugins/bitemporal.rb', line 423

def restore(attrs={})
  return false unless deleted?
  last_version_attributes = if last_version
    last_version.columns.each_with_object({}) do |column, hash|
      unless excluded_columns.include? column
        hash[column] = last_version.send column
      end
    end
  else
    {}
  end
  update_attributes last_version_attributes.merge attrs
  @last_version = nil
end

#update_attributes(attributes = {}) ⇒ Object



312
313
314
315
316
317
318
319
# File 'lib/sequel/plugins/bitemporal.rb', line 312

def update_attributes(attributes={})
  self.attributes = attributes
  if save raise_on_failure: false
    self
  else
    false
  end
end

#validateObject



279
280
281
282
283
284
# File 'lib/sequel/plugins/bitemporal.rb', line 279

def validate
  super
  pending_version.errors.each do |key, key_errors|
    key_errors.each{|error| errors.add key, error}
  end if pending_version_holds_changes? && !pending_version.valid?
end