greatest_updated_at 0.0.1 → 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b4972e75f678551d7572c46d2679fb160dbfa395
4
+ data.tar.gz: 17d201b2f70d4123fbfee160637ab560c3651043
5
+ SHA512:
6
+ metadata.gz: 4c1184bab68f4ec25cddd1218de294e3158bdda49693cd49f1419c4edd527f0bc2b34790b0a0cc2b7f4c65aa3f0729eb28cead7d28244b7bf389180ad8c09f5f
7
+ data.tar.gz: 82b418b5ac5272b5006ecdd5b7309caf03c6bffab8001bc34a1201c571518bfdc4b817f835adc67b88a68db69ce872236fd7f63be8a5a79435da41ae3c493d72
@@ -3,24 +3,52 @@ module GreatestUpdatedAt
3
3
  # a dumb method for getting the most recently updated date from the named tables.
4
4
  # Note that if the tables are not selected in your query as named you will receive an error.
5
5
  def greatest_updated_at_from_tables(table_names)
6
- max_calcs = Array(table_names).collect{|name|
7
- "MAX(#{connection.quote_table_name(name.to_s.pluralize)}.#{connection.quote_column_name("updated_at")})"
8
- }
6
+ self.pluck(greatest_select_val(table_names)).first
7
+ end
8
+
9
+ # Make an attempt to get the most recently updated record out of all the
10
+ # included (aka preloaded) records
11
+ def greatest_updated_at
12
+ # Force everything included to be in the query via LEFT OUTER JOIN
13
+ relation = self.eager_load(self.includes_values)
9
14
 
10
- if max_calcs.length == 1
11
- pluck_val = max_calcs.first
12
- else
13
- pluck_val = "GREATEST(#{max_calcs.join(",")})"
15
+ # Using this to get a list of tables included via join statements, we don't want to calculate based on those
16
+ alias_tracker = ActiveRecord::Associations::AliasTracker.create(relation.klass.connection, relation.joins_values)
17
+ join_tables = alias_tracker.aliases.keys
18
+
19
+ if relation.eager_loading?
20
+ relation.send(:find_with_associations) { |rel| relation = rel };nil
14
21
  end
22
+ relation.select_values = ['1'] #placeholder while we generate the initial arel
23
+ arel = relation.arel
24
+
25
+ # collect the list of table names we want to get the max updated at from
26
+ join_nodes = arel.join_sources.reject{ |join| join.kind_of?(Arel::Nodes::StringJoin) }
27
+ table_names = join_nodes.collect{ |join| join.left.name }
28
+
29
+ # remove the join tables and make sure the root table is present
30
+ table_names = (table_names - join_tables) | [relation.klass.table_name]
15
31
 
16
- self.pluck(pluck_val).first
32
+ # Clear the arel projection, it used to be a placeholder
33
+ arel.projections = []
34
+
35
+ arel.project greatest_select_val(table_names)
17
36
 
37
+ relation.klass.connection.select_value(arel, 'SQL', arel.bind_values + relation.bind_values)
38
+
18
39
  end
19
40
 
20
- # Make an attempt to get the most recently updated record out of all the
21
- # included (aka preloaded) records
22
- def greatest_updated_at
23
- greatest_updated_at_from_tables(self.includes_values.collect{|relation| Array(relation)}.flatten << self.table_name)
41
+ protected
42
+ def greatest_select_val(table_names)
43
+ max_calcs = Array(table_names).collect{|name|
44
+ "MAX(#{connection.quote_table_name(name.to_s)}.#{connection.quote_column_name("updated_at")})"
45
+ }
46
+
47
+ if max_calcs.length == 1
48
+ max_calcs.first
49
+ else
50
+ "GREATEST(#{max_calcs.join(", ")})"
51
+ end
24
52
  end
25
53
 
26
54
  end
metadata CHANGED
@@ -1,70 +1,68 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: greatest_updated_at
3
- version: !ruby/object:Gem::Version
4
- hash: 29
5
- prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 1
10
- version: 0.0.1
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - James Prior
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2015-02-19 00:00:00 -05:00
19
- default_executable:
20
- dependencies: []
21
-
22
- description: An AR extension to get the most recent updated_at from an active record relation and it's included records
23
- email:
11
+ date: 2015-02-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.2'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5'
33
+ description: An AR extension to get the most recent updated_at from an active record
34
+ relation and it's included records
35
+ email:
24
36
  - j.prior@asee.org
25
37
  executables: []
26
-
27
38
  extensions: []
28
-
29
39
  extra_rdoc_files: []
30
-
31
- files:
32
- - lib/greatest_updated_at/calculations.rb
33
- - lib/greatest_updated_at.rb
40
+ files:
34
41
  - LICENSE
35
- has_rdoc: true
42
+ - lib/greatest_updated_at.rb
43
+ - lib/greatest_updated_at/calculations.rb
36
44
  homepage: https://github.com/asee/greatest_updated_at
37
- licenses: []
38
-
45
+ licenses:
46
+ - GPL v2
47
+ metadata: {}
39
48
  post_install_message:
40
49
  rdoc_options: []
41
-
42
- require_paths:
50
+ require_paths:
43
51
  - lib
44
- required_ruby_version: !ruby/object:Gem::Requirement
45
- none: false
46
- requirements:
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ requirements:
47
54
  - - ">="
48
- - !ruby/object:Gem::Version
49
- hash: 3
50
- segments:
51
- - 0
52
- version: "0"
53
- required_rubygems_version: !ruby/object:Gem::Requirement
54
- none: false
55
- requirements:
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
56
59
  - - ">="
57
- - !ruby/object:Gem::Version
58
- hash: 3
59
- segments:
60
- - 0
61
- version: "0"
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
62
  requirements: []
63
-
64
63
  rubyforge_project:
65
- rubygems_version: 1.6.2
64
+ rubygems_version: 2.2.2
66
65
  signing_key:
67
- specification_version: 3
66
+ specification_version: 4
68
67
  summary: Find the greatest updated_at from all included records in an AR scope
69
68
  test_files: []
70
-