|
1 | | -require "date" |
| 1 | +require "time" |
2 | 2 |
|
3 | 3 | module Sequel |
4 | 4 | module Plugins |
5 | 5 | module Bitemporal |
| 6 | + VALIDITY_TIME_MAX = Time.utc 9999 |
| 7 | + |
6 | 8 | THREAD_POINT_IN_TIME_KEY = :sequel_plugins_bitemporal_point_in_time |
7 | 9 | def self.as_we_knew_it(time) |
8 | 10 | previous = Thread.current[THREAD_POINT_IN_TIME_KEY] |
9 | 11 | raise ArgumentError, "requires a block" unless block_given? |
10 | | - Thread.current[THREAD_POINT_IN_TIME_KEY] = time.to_datetime |
| 12 | + Thread.current[THREAD_POINT_IN_TIME_KEY] = time.to_time.utc |
11 | 13 | yield |
12 | 14 | ensure |
13 | 15 | Thread.current[THREAD_POINT_IN_TIME_KEY] = previous |
14 | 16 | end |
15 | 17 |
|
16 | 18 | def self.point_in_time |
17 | | - Thread.current[THREAD_POINT_IN_TIME_KEY] || DateTime.now |
| 19 | + Thread.current[THREAD_POINT_IN_TIME_KEY] || Time.now.utc |
18 | 20 | end |
19 | 21 |
|
20 | 22 | THREAD_NOW_KEY = :sequel_plugins_bitemporal_now |
21 | 23 | def self.at(time) |
22 | 24 | previous = Thread.current[THREAD_NOW_KEY] |
23 | 25 | raise ArgumentError, "requires a block" unless block_given? |
24 | | - Thread.current[THREAD_NOW_KEY] = time.to_datetime |
| 26 | + Thread.current[THREAD_NOW_KEY] = time.to_time.utc |
25 | 27 | yield |
26 | 28 | ensure |
27 | 29 | Thread.current[THREAD_NOW_KEY] = previous |
28 | 30 | end |
29 | 31 |
|
30 | 32 | def self.now |
31 | | - Thread.current[THREAD_NOW_KEY] || DateTime.now |
| 33 | + Thread.current[THREAD_NOW_KEY] || Time.now.utc |
32 | 34 | end |
33 | 35 |
|
34 | 36 | def self.version_foreign_keys(master = nil) |
@@ -185,14 +187,14 @@ def current? |
185 | 187 | t = ::Sequel::Plugins::Bitemporal.point_in_time |
186 | 188 | n = ::Sequel::Plugins::Bitemporal.now |
187 | 189 | !new? && |
188 | | - created_at.to_datetime<=t && |
189 | | - (expired_at.nil? || expired_at.to_datetime>t) && |
190 | | - valid_from.to_datetime<=n && |
191 | | - valid_to.to_datetime>n |
| 190 | + created_at.to_time<=t && |
| 191 | + (expired_at.nil? || expired_at.to_time>t) && |
| 192 | + valid_from.to_time<=n && |
| 193 | + valid_to.to_time>n |
192 | 194 | end |
193 | 195 | def destroy(opts={}) |
194 | 196 | expand_previous_version = opts.fetch(:expand_previous_version){ |
195 | | - valid_from.to_datetime>::Sequel::Plugins::Bitemporal.now |
| 197 | + valid_from.to_time>::Sequel::Plugins::Bitemporal.now |
196 | 198 | } |
197 | 199 | master.destroy_version self, expand_previous_version |
198 | 200 | end |
@@ -396,11 +398,11 @@ def destroy |
396 | 398 | def destroy_version(version, expand_previous_version) |
397 | 399 | now = ::Sequel::Plugins::Bitemporal.now |
398 | 400 | point_in_time = ::Sequel::Plugins::Bitemporal.point_in_time |
399 | | - return false if version.valid_to.to_datetime<=now |
| 401 | + return false if version.valid_to.to_time<=now |
400 | 402 | associations.delete :current_version |
401 | 403 | model.db.transaction do |
402 | 404 | success = true |
403 | | - version_was_valid = now>=version.valid_from.to_datetime |
| 405 | + version_was_valid = now>=version.valid_from.to_time |
404 | 406 | if expand_previous_version |
405 | 407 | previous = versions_dataset.where({ |
406 | 408 | expired_at: nil, |
@@ -513,7 +515,7 @@ def expire_previous_versions |
513 | 515 | expired = expired.exclude Sequel.lit("valid_from=valid_to") |
514 | 516 | expired = expired.exclude Sequel.lit("valid_to<=?", pending_version.valid_from) |
515 | 517 | pending_version.valid_to ||= expired.where(Sequel.lit("valid_from>?", pending_version.valid_from)).min(:valid_from) |
516 | | - pending_version.valid_to ||= Time.utc 9999 |
| 518 | + pending_version.valid_to ||= Sequel::Plugins::Bitemporal::VALIDITY_TIME_MAX |
517 | 519 | expired = expired.exclude Sequel.lit("valid_from>=?", pending_version.valid_to) |
518 | 520 | expired = expired.all |
519 | 521 | expired.each do |expired_version| |
|
0 commit comments