Module: Sequel::Plugins::Bitemporal::InstanceMethods
- Defined in:
- lib/sequel/plugins/bitemporal.rb
Instance Attribute Summary collapse
-
#pending_version ⇒ Object
readonly
Returns the value of attribute pending_version.
Instance Method Summary collapse
- #after_create ⇒ Object
- #after_save ⇒ Object
- #attributes ⇒ Object
- #attributes=(attributes) ⇒ Object
- #audited? ⇒ Boolean
- #before_create ⇒ Object
- #before_update ⇒ Object
- #before_validation ⇒ Object
- #deleted? ⇒ Boolean
- #destroy ⇒ Object
- #destroy_version(version, expand_previous_version) ⇒ Object
- #last_version ⇒ Object
- #next_version ⇒ Object
- #pending_or_current_version ⇒ Object
- #propagated_during_last_save ⇒ Object
- #reload ⇒ Object
- #restore(attrs = {}) ⇒ Object
- #update_attributes(attributes = {}) ⇒ Object
- #validate ⇒ Object
Instance Attribute Details
#pending_version ⇒ Object (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_create ⇒ Object
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_save ⇒ Object
342 343 344 345 |
# File 'lib/sequel/plugins/bitemporal.rb', line 342 def after_save super _refresh_set_values @values end |
#attributes ⇒ Object
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
270 271 272 |
# File 'lib/sequel/plugins/bitemporal.rb', line 270 def audited? !!self.class.audit_class end |
#before_create ⇒ Object
321 322 323 324 |
# File 'lib/sequel/plugins/bitemporal.rb', line 321 def before_create @create_version = pending_version_holds_changes? super end |
#before_update ⇒ Object
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_validation ⇒ Object
274 275 276 277 |
# File 'lib/sequel/plugins/bitemporal.rb', line 274 def before_validation prepare_pending_version super end |
#deleted? ⇒ Boolean
381 382 383 |
# File 'lib/sequel/plugins/bitemporal.rb', line 381 def deleted? !new? && !current_version end |
#destroy ⇒ Object
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, ) 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 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_version ⇒ Object
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_version ⇒ Object
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_version ⇒ Object
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_save ⇒ Object
446 447 448 |
# File 'lib/sequel/plugins/bitemporal.rb', line 446 def propagated_during_last_save @propagated_during_last_save ||= [] end |
#reload ⇒ Object
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 |
#validate ⇒ Object
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 |