temporal_tables 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 60c0235cfec08bde495d37a7304eeca6a0bd46aa310224b8a240bbc2ff98bd23
4
- data.tar.gz: b68fb0409c0fd389e6a544f0d3ba10f560da3e6536e6dff5a3655e8fe21c3494
3
+ metadata.gz: 457aecc9f2b96e0a7ef98f6e7e2d4c30fc0aa091ddeb3abc9a3c684cae67768c
4
+ data.tar.gz: 1bf1f9bd6e98b063b73c3bdafb9f5d31bba6e75a2e605838c466915c85231317
5
5
  SHA512:
6
- metadata.gz: 2b9e2a3855dcce4b6f50a40e887451097efe51377cd3edbfe4ee7af6023dfb62f3f8deb9d3664827cc7db6426d29aab235349ab33b00b691b7dcaca639c0874b
7
- data.tar.gz: f35f963e1540f869f0d0375d63aacd02eb76805a51f11324163712e48a7e38e54153c6ab496088edfc647dc3dfa1b689d03d17908033c9addd10fad6138ff5ac
6
+ metadata.gz: 9b9baeefc81aadfe5f23db7fc5790321cf2550812a6818a9b3d2d3f96af4f12efb8672bea34e9b7981f6e577c9c43574378d72894684a866c762aaf94d17d5f2
7
+ data.tar.gz: 9ae4da3db11583308195eca7c1965c0a91242ab61711794bb8b0f3264e25df39b2453a6dcafd3ae7dad119f7f5d31d3a5d681b18bd711422c12d0965e8b184fb
@@ -9,7 +9,7 @@ module TemporalTables
9
9
  if at_value
10
10
  join =
11
11
  join
12
- .and(to[:eff_to].gteq(at_value))
12
+ .and(to[:eff_to].gt(at_value).or(to[:eff_to].eq(TemporalTables::END_OF_TIME)))
13
13
  .and(to[:eff_from].lteq(at_value))
14
14
  end
15
15
  join
@@ -34,7 +34,7 @@ module TemporalTables
34
34
 
35
35
  update #{temporal_name(table_name)} set eff_to = @current_time
36
36
  where #{primary_key} = new.#{primary_key}
37
- and eff_to = '9999-12-31';
37
+ and eff_to = '#{TemporalTables::END_OF_TIME}';
38
38
 
39
39
  insert into #{temporal_name(table_name)} (#{column_names.join(', ')}, eff_from)
40
40
  values (#{column_names.collect { |c| "new.#{c}" }.join(', ')}, @current_time);
@@ -51,7 +51,7 @@ module TemporalTables
51
51
 
52
52
  update #{temporal_name(table_name)} set eff_to = @current_time
53
53
  where #{primary_key} = old.#{primary_key}
54
- and eff_to = '9999-12-31';
54
+ and eff_to = '#{TemporalTables::END_OF_TIME}';
55
55
 
56
56
  end
57
57
  }
@@ -40,7 +40,7 @@ module TemporalTables
40
40
 
41
41
  update #{temporal_name(table_name)} set eff_to = cur_time
42
42
  where #{primary_key} = new.#{primary_key}
43
- and eff_to = '9999-12-31';
43
+ and eff_to = '#{TemporalTables::END_OF_TIME}';
44
44
 
45
45
  insert into #{temporal_name(table_name)} (#{column_list(column_names)}, eff_from)
46
46
  values (#{column_names.collect { |c| "new.#{c}" }.join(', ')}, cur_time);
@@ -63,7 +63,7 @@ module TemporalTables
63
63
 
64
64
  update #{temporal_name(table_name)} set eff_to = cur_time
65
65
  where #{primary_key} = old.#{primary_key}
66
- and eff_to = '9999-12-31';
66
+ and eff_to = '#{TemporalTables::END_OF_TIME}';
67
67
 
68
68
  return null;
69
69
  end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TemporalTables
4
+ END_OF_TIME = '9999-12-31'
5
+ end
@@ -35,7 +35,7 @@ module TemporalTables
35
35
  **options.merge(id: false, primary_key: 'history_id', temporal_bypass: true)
36
36
  ) do |t|
37
37
  t.datetime :eff_from, null: false, limit: 6
38
- t.datetime :eff_to, null: false, limit: 6, default: '9999-12-31'
38
+ t.datetime :eff_to, null: false, limit: 6, default: TemporalTables::END_OF_TIME
39
39
 
40
40
  columns(table_name).each do |c|
41
41
  column_options = { limit: c.limit }
@@ -37,7 +37,7 @@ module TemporalTables
37
37
  **options.merge(id: false, primary_key: 'history_id', temporal_bypass: true)
38
38
  ) do |t|
39
39
  t.datetime :eff_from, null: false, limit: 6
40
- t.datetime :eff_to, null: false, limit: 6, default: '9999-12-31'
40
+ t.datetime :eff_to, null: false, limit: 6, default: TemporalTables::END_OF_TIME
41
41
 
42
42
  columns(table_name).each do |c|
43
43
  column_type = c.type == :enum ? c.sql_type_metadata.sql_type : c.type
@@ -74,8 +74,10 @@ module TemporalTables
74
74
 
75
75
  delegate :descends_from_active_record?, to: :superclass
76
76
 
77
+ # An object at a given time should fall within the range, excluding the effective end date.
78
+ # However, when using '9999-12-31', this is effectively infinity and should not be excluded.
77
79
  def build_temporal_constraint(at_value)
78
- arel_table[:eff_to].gteq(at_value).and(
80
+ (arel_table[:eff_to].gt(at_value).or(arel_table[:eff_to].eq(TemporalTables::END_OF_TIME))).and(
79
81
  arel_table[:eff_from].lteq(at_value)
80
82
  )
81
83
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TemporalTables
4
- VERSION = '1.1.0'
4
+ VERSION = '2.0.0'
5
5
  end
@@ -12,6 +12,7 @@ require 'temporal_tables/association_extensions'
12
12
  require 'temporal_tables/preloader_extensions'
13
13
  require 'temporal_tables/reflection_extensions'
14
14
  require 'temporal_tables/arel_table'
15
+ require 'temporal_tables/constants'
15
16
  require 'temporal_tables/version'
16
17
 
17
18
  module TemporalTables
@@ -90,10 +90,10 @@ describe Person do
90
90
  where = sql[4]
91
91
 
92
92
  expect(from.scan(/.warts_h.\..eff_from./i).count).to eq(1)
93
- expect(from.scan(/.warts_h.\..eff_to./i).count).to eq(1)
93
+ expect(from.scan(/.warts_h.\..eff_to./i).count).to eq(2)
94
94
 
95
95
  expect(where.scan(/.people_h.\..eff_from./i).count).to eq(1)
96
- expect(where.scan(/.people_h.\..eff_to./i).count).to eq(1)
96
+ expect(where.scan(/.people_h.\..eff_to./i).count).to eq(2)
97
97
  expect(where.scan(/.warts_h.\..eff_from./i).count).to eq(0)
98
98
  expect(where.scan(/.warts_h.\..eff_to./i).count).to eq(0)
99
99
  end
@@ -195,6 +195,12 @@ describe Person do
195
195
  expect(fido.orig_obj.name).to eq('Max')
196
196
  end
197
197
 
198
+ it 'at the exact time of the name change, the dog should not be both Max and Fido' do
199
+ dog_at_moment_of_name_change = dog.history.at(dog.history.last.eff_from)
200
+ expect(dog_at_moment_of_name_change.count).to eq(1)
201
+ expect(dog_at_moment_of_name_change.first.name).to eq('Max')
202
+ end
203
+
198
204
  context 'Max is rehomed' do
199
205
  before do
200
206
  dog.destroy!
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: temporal_tables
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brent Kroeker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-14 00:00:00.000000000 Z
11
+ date: 2022-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -179,6 +179,7 @@ files:
179
179
  - lib/temporal_tables/association_extensions.rb
180
180
  - lib/temporal_tables/connection_adapters/mysql_adapter.rb
181
181
  - lib/temporal_tables/connection_adapters/postgresql_adapter.rb
182
+ - lib/temporal_tables/constants.rb
182
183
  - lib/temporal_tables/history_hook.rb
183
184
  - lib/temporal_tables/preloader_extensions.rb
184
185
  - lib/temporal_tables/reflection_extensions.rb