arel_toolkit 0.4.2 → 0.4.3

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: ff1c5420d091c5e2df0fb1bbc6350fb9a7454893855c6091eb25b3d7ae5ba46c
4
- data.tar.gz: 1b98b3c7b2bc7488af08cc9b58d6f1b2d92dfe0a3cda7f7bdb01a61e2fa1a193
3
+ metadata.gz: 28d6dfc92b5aebf97e6a22fa4ded2583f5d2184b1f0a8afc7ea4bc1951805b6d
4
+ data.tar.gz: 9c72d8926233ec968b2c864886a422848bb0fd85c7e2828e86db0b9cee21144a
5
5
  SHA512:
6
- metadata.gz: 772871812878e1ac7c4989a4d14c2414675b327ed5b1b5a140841bb699a0f590fc7f04f3ea1de6dfefb0166541b5260c7a01360d41869948e8a1a7b7d77cd6b6
7
- data.tar.gz: b996389ef2016ba70449d44491496882ff246e01e43801e086b1db4831901acfe7e4a10c5df5a323e5167b74f9333dc5ff8d62e6d66b61bf3da84a650c978a06
6
+ metadata.gz: 7aaab2a35e519f4c85ce56135efa0374b8806318791913c351b797972827e0c10a5e4b9d17f6d21d8abed7508db17170a199ec4186dc16a9036a4e460a767ca0
7
+ data.tar.gz: 127121759494230ea9d82b7499812f942c44026f4ff7d22dc08b45d0b5a60ce1505b11bc4c6136391005aef17ef2932565e6266c189fd521c0869dac455bdf47
@@ -47,8 +47,10 @@ jobs:
47
47
  - name: Rebase
48
48
  if: matrix.rebase
49
49
  run: |
50
- git config --global user.email "ci@github.com"
51
- git config --global user.name "GitHub CI"
50
+ export GIT_AUTHOR_NAME=${CI_COMMIT_AUTHOR_NAME=GithubCI}
51
+ export GIT_AUTHOR_EMAIL=${CI_COMMIT_AUTHOR_EMAIL=ci@github.comm}
52
+ export GIT_COMMITTER_NAME=${GIT_AUTHOR_NAME}
53
+ export GIT_COMMITTER_EMAIL=${GIT_AUTHOR_EMAIL}
52
54
  git fetch origin $GITHUB_REF
53
55
  git rebase $GITHUB_SHA
54
56
 
data/Appraisals CHANGED
@@ -7,3 +7,7 @@ end
7
7
 
8
8
  appraise 'default' do
9
9
  end
10
+
11
+ appraise 'active_record_6' do
12
+ gem 'activerecord', '~> 6.0.0'
13
+ end
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## [v0.4.3](https://github.com/mvgijssel/arel_toolkit/tree/v0.4.3) (2020-11-09)
4
+
5
+ [Full Changelog](https://github.com/mvgijssel/arel_toolkit/compare/v0.4.2...v0.4.3)
6
+
7
+ **Implemented enhancements:**
8
+
9
+ - Upgrade active\_record to 6 [\#167](https://github.com/mvgijssel/arel_toolkit/pull/167) ([khaleksa](https://github.com/khaleksa))
10
+ - Bump json from 2.2.0 to 2.3.1 [\#166](https://github.com/mvgijssel/arel_toolkit/pull/166) ([dependabot[bot]](https://github.com/apps/dependabot))
11
+ - Bump activesupport from 5.2.3 to 5.2.4.3 [\#165](https://github.com/mvgijssel/arel_toolkit/pull/165) ([dependabot[bot]](https://github.com/apps/dependabot))
12
+ - Update rake requirement from ~\> 10.0 to ~\> 13.0 [\#161](https://github.com/mvgijssel/arel_toolkit/pull/161) ([dependabot[bot]](https://github.com/apps/dependabot))
13
+ - Bump nokogiri from 1.10.4 to 1.10.8 [\#160](https://github.com/mvgijssel/arel_toolkit/pull/160) ([dependabot[bot]](https://github.com/apps/dependabot))
14
+ - Adds cache mechanism to middleware [\#154](https://github.com/mvgijssel/arel_toolkit/pull/154) ([Willianvdv](https://github.com/Willianvdv))
15
+
3
16
  ## [v0.4.2](https://github.com/mvgijssel/arel_toolkit/tree/v0.4.2) (2020-01-08)
4
17
 
5
18
  [Full Changelog](https://github.com/mvgijssel/arel_toolkit/compare/v0.4.1...v0.4.2)
@@ -1,22 +1,21 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- arel_toolkit (0.4.2)
5
- activerecord (~> 5.2.0)
6
- arel (~> 9.0.0)
4
+ arel_toolkit (0.4.3)
5
+ activerecord
7
6
  pg (~> 1.1.4)
8
- pg_query (~> 1.1.0)
7
+ pg_query (~> 1.2.0)
9
8
 
10
9
  GEM
11
10
  remote: https://rubygems.org/
12
11
  specs:
13
- activemodel (5.2.3)
14
- activesupport (= 5.2.3)
15
- activerecord (5.2.3)
16
- activemodel (= 5.2.3)
17
- activesupport (= 5.2.3)
12
+ activemodel (5.2.4.3)
13
+ activesupport (= 5.2.4.3)
14
+ activerecord (5.2.4.3)
15
+ activemodel (= 5.2.4.3)
16
+ activesupport (= 5.2.4.3)
18
17
  arel (>= 9.0)
19
- activesupport (5.2.3)
18
+ activesupport (5.2.4.3)
20
19
  concurrent-ruby (~> 1.0, >= 1.0.2)
21
20
  i18n (>= 0.7, < 2)
22
21
  minitest (~> 5.1)
@@ -36,7 +35,7 @@ GEM
36
35
  binding_of_caller (0.8.0)
37
36
  debug_inspector (>= 0.0.1)
38
37
  coderay (1.1.2)
39
- concurrent-ruby (1.1.5)
38
+ concurrent-ruby (1.1.6)
40
39
  database_cleaner (1.7.0)
41
40
  debug_inspector (0.0.3)
42
41
  diff-lcs (1.3)
@@ -77,11 +76,11 @@ GEM
77
76
  guard (~> 2.0)
78
77
  rubocop (~> 0.20)
79
78
  hirb (0.7.3)
80
- i18n (1.7.0)
79
+ i18n (1.8.2)
81
80
  concurrent-ruby (~> 1.0)
82
81
  interception (0.5)
83
82
  jaro_winkler (1.5.3)
84
- json (2.2.0)
83
+ json (2.3.1)
85
84
  listen (3.1.5)
86
85
  rb-fsevent (~> 0.9, >= 0.9.4)
87
86
  rb-inotify (~> 0.9, >= 0.9.7)
@@ -90,11 +89,11 @@ GEM
90
89
  memory_profiler (0.9.14)
91
90
  method_source (0.9.2)
92
91
  mini_portile2 (2.4.0)
93
- minitest (5.13.0)
92
+ minitest (5.14.1)
94
93
  multi_json (1.14.1)
95
94
  multipart-post (2.1.1)
96
95
  nenv (0.3.0)
97
- nokogiri (1.10.4)
96
+ nokogiri (1.10.8)
98
97
  mini_portile2 (~> 2.4.0)
99
98
  notiffany (0.1.1)
100
99
  nenv (~> 0.1)
@@ -105,7 +104,7 @@ GEM
105
104
  parser (2.6.3.0)
106
105
  ast (~> 2.4.0)
107
106
  pg (1.1.4)
108
- pg_query (1.1.1)
107
+ pg_query (1.2.0)
109
108
  pry (0.12.2)
110
109
  coderay (~> 1.1.0)
111
110
  method_source (~> 0.9.0)
@@ -125,7 +124,7 @@ GEM
125
124
  pry (>= 0.9.11)
126
125
  public_suffix (4.0.1)
127
126
  rainbow (3.0.0)
128
- rake (10.5.0)
127
+ rake (13.0.1)
129
128
  rake-compiler (1.0.7)
130
129
  rake
131
130
  rb-fsevent (0.10.3)
@@ -170,7 +169,7 @@ GEM
170
169
  stackprof (0.2.13)
171
170
  thor (0.20.3)
172
171
  thread_safe (0.3.6)
173
- tzinfo (1.2.5)
172
+ tzinfo (1.2.7)
174
173
  thread_safe (~> 0.1)
175
174
  unicode-display_width (1.6.0)
176
175
  yard (0.9.20)
@@ -197,7 +196,7 @@ DEPENDENCIES
197
196
  pry-nav
198
197
  pry-rescue
199
198
  pry-stack_explorer
200
- rake (~> 10.0)
199
+ rake (~> 13.0)
201
200
  rake-compiler (~> 1.0)
202
201
  rspec (~> 3.8)
203
202
  rubocop (= 0.71.0)
@@ -206,4 +205,4 @@ DEPENDENCIES
206
205
  stackprof (~> 0.2)
207
206
 
208
207
  BUNDLED WITH
209
- 2.0.2
208
+ 2.1.4
@@ -25,15 +25,14 @@ Gem::Specification.new do |spec|
25
25
  spec.require_paths = ['lib']
26
26
  spec.extensions = ['ext/pg_result_init/extconf.rb']
27
27
 
28
- spec.add_dependency 'arel', '~> 9.0.0'
29
- spec.add_dependency 'activerecord', '~> 5.2.0'
28
+ spec.add_dependency 'activerecord'
30
29
  spec.add_dependency 'pg', '~> 1.1.4'
31
- spec.add_dependency 'pg_query', '~> 1.1.0'
30
+ spec.add_dependency 'pg_query', '~> 1.2.0'
32
31
 
33
32
  spec.add_development_dependency 'bundler', '~> 2.0'
34
33
  spec.add_development_dependency 'dpl', '~> 1.10.11'
35
34
  spec.add_development_dependency 'github_changelog_generator', '~> 1.15'
36
- spec.add_development_dependency 'rake', '~> 10.0'
35
+ spec.add_development_dependency 'rake', '~> 13.0'
37
36
  spec.add_development_dependency 'rake-compiler', '~> 1.0'
38
37
  spec.add_development_dependency 'rspec', '~> 3.8'
39
38
  spec.add_development_dependency 'approvals', '~> 0.0.24'
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'activerecord', '~> 6.0.0'
6
+
7
+ gemspec path: '../'
@@ -0,0 +1,210 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ arel_toolkit (0.4.2)
5
+ activerecord
6
+ pg (~> 1.1.4)
7
+ pg_query (~> 1.2.0)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ activemodel (6.0.0)
13
+ activesupport (= 6.0.0)
14
+ activerecord (6.0.0)
15
+ activemodel (= 6.0.0)
16
+ activesupport (= 6.0.0)
17
+ activesupport (6.0.0)
18
+ concurrent-ruby (~> 1.0, >= 1.0.2)
19
+ i18n (>= 0.7, < 2)
20
+ minitest (~> 5.1)
21
+ tzinfo (~> 1.1)
22
+ zeitwerk (~> 2.1, >= 2.1.8)
23
+ addressable (2.7.0)
24
+ public_suffix (>= 2.0.2, < 5.0)
25
+ ansi (1.5.0)
26
+ appraisal (2.2.0)
27
+ bundler
28
+ rake
29
+ thor (>= 0.14.0)
30
+ approvals (0.0.24)
31
+ nokogiri (~> 1.6)
32
+ thor (~> 0.18)
33
+ ast (2.4.1)
34
+ binding_of_caller (0.8.0)
35
+ debug_inspector (>= 0.0.1)
36
+ coderay (1.1.3)
37
+ concurrent-ruby (1.1.7)
38
+ database_cleaner (1.7.0)
39
+ debug_inspector (0.0.3)
40
+ diff-lcs (1.4.4)
41
+ docile (1.3.2)
42
+ dpl (1.10.15)
43
+ faraday (1.1.0)
44
+ multipart-post (>= 1.2, < 3)
45
+ ruby2_keywords
46
+ faraday-http-cache (2.2.0)
47
+ faraday (>= 0.8)
48
+ ffi (1.13.1)
49
+ formatador (0.2.5)
50
+ github_changelog_generator (1.15.2)
51
+ activesupport
52
+ faraday-http-cache
53
+ multi_json
54
+ octokit (~> 4.6)
55
+ rainbow (>= 2.2.1)
56
+ rake (>= 10.0)
57
+ retriable (~> 3.0)
58
+ guard (2.16.2)
59
+ formatador (>= 0.2.4)
60
+ listen (>= 2.7, < 4.0)
61
+ lumberjack (>= 1.0.12, < 2.0)
62
+ nenv (~> 0.1)
63
+ notiffany (~> 0.0)
64
+ pry (>= 0.9.12)
65
+ shellany (~> 0.0)
66
+ thor (>= 0.18.1)
67
+ guard-compat (1.2.1)
68
+ guard-rake (1.0.0)
69
+ guard
70
+ rake
71
+ guard-rspec (4.7.3)
72
+ guard (~> 2.1)
73
+ guard-compat (~> 1.1)
74
+ rspec (>= 2.99.0, < 4.0)
75
+ guard-rubocop (1.3.0)
76
+ guard (~> 2.0)
77
+ rubocop (~> 0.20)
78
+ hirb (0.7.3)
79
+ i18n (1.8.5)
80
+ concurrent-ruby (~> 1.0)
81
+ interception (0.5)
82
+ jaro_winkler (1.5.4)
83
+ json (2.3.1)
84
+ listen (3.2.1)
85
+ rb-fsevent (~> 0.10, >= 0.10.3)
86
+ rb-inotify (~> 0.9, >= 0.9.10)
87
+ lumberjack (1.2.8)
88
+ memory_profiler (0.9.14)
89
+ method_source (0.9.2)
90
+ mini_portile2 (2.4.0)
91
+ minitest (5.14.2)
92
+ multi_json (1.15.0)
93
+ multipart-post (2.1.1)
94
+ nenv (0.3.0)
95
+ nokogiri (1.10.10)
96
+ mini_portile2 (~> 2.4.0)
97
+ notiffany (0.1.3)
98
+ nenv (~> 0.1)
99
+ shellany (~> 0.0)
100
+ octokit (4.19.0)
101
+ faraday (>= 0.9)
102
+ sawyer (~> 0.8.0, >= 0.5.3)
103
+ parallel (1.19.2)
104
+ parser (2.7.2.0)
105
+ ast (~> 2.4.1)
106
+ pg (1.1.4)
107
+ pg_query (1.2.0)
108
+ pry (0.12.2)
109
+ coderay (~> 1.1.0)
110
+ method_source (~> 0.9.0)
111
+ pry-alias (0.0.1)
112
+ binding_of_caller
113
+ pry
114
+ pry-doc (1.1.0)
115
+ pry (~> 0.11)
116
+ yard (~> 0.9.11)
117
+ pry-nav (0.3.0)
118
+ pry (>= 0.9.10, < 0.13.0)
119
+ pry-rescue (1.5.2)
120
+ interception (>= 0.5)
121
+ pry (>= 0.12.0)
122
+ pry-stack_explorer (0.4.9.3)
123
+ binding_of_caller (>= 0.7)
124
+ pry (>= 0.9.11)
125
+ public_suffix (4.0.6)
126
+ rainbow (3.0.0)
127
+ rake (13.0.1)
128
+ rake-compiler (1.1.1)
129
+ rake
130
+ rb-fsevent (0.10.4)
131
+ rb-inotify (0.10.1)
132
+ ffi (~> 1.0)
133
+ retriable (3.1.2)
134
+ rspec (3.9.0)
135
+ rspec-core (~> 3.9.0)
136
+ rspec-expectations (~> 3.9.0)
137
+ rspec-mocks (~> 3.9.0)
138
+ rspec-core (3.9.3)
139
+ rspec-support (~> 3.9.3)
140
+ rspec-expectations (3.9.3)
141
+ diff-lcs (>= 1.2.0, < 2.0)
142
+ rspec-support (~> 3.9.0)
143
+ rspec-mocks (3.9.1)
144
+ diff-lcs (>= 1.2.0, < 2.0)
145
+ rspec-support (~> 3.9.0)
146
+ rspec-support (3.9.4)
147
+ rubocop (0.71.0)
148
+ jaro_winkler (~> 1.5.1)
149
+ parallel (~> 1.10)
150
+ parser (>= 2.6)
151
+ rainbow (>= 2.2.2, < 4.0)
152
+ ruby-progressbar (~> 1.7)
153
+ unicode-display_width (>= 1.4.0, < 1.7)
154
+ ruby-progressbar (1.10.1)
155
+ ruby2_keywords (0.0.2)
156
+ sawyer (0.8.2)
157
+ addressable (>= 2.3.5)
158
+ faraday (> 0.8, < 2.0)
159
+ shellany (0.0.1)
160
+ simplecov (0.16.1)
161
+ docile (~> 1.1)
162
+ json (>= 1.8, < 3)
163
+ simplecov-html (~> 0.10.0)
164
+ simplecov-console (0.4.2)
165
+ ansi
166
+ hirb
167
+ simplecov
168
+ simplecov-html (0.10.2)
169
+ stackprof (0.2.16)
170
+ thor (0.20.3)
171
+ thread_safe (0.3.6)
172
+ tzinfo (1.2.7)
173
+ thread_safe (~> 0.1)
174
+ unicode-display_width (1.6.1)
175
+ yard (0.9.25)
176
+ zeitwerk (2.4.0)
177
+
178
+ PLATFORMS
179
+ ruby
180
+
181
+ DEPENDENCIES
182
+ activerecord (~> 6.0.0)
183
+ appraisal (~> 2.2.0)
184
+ approvals (~> 0.0.24)
185
+ arel_toolkit!
186
+ bundler (~> 2.0)
187
+ database_cleaner (~> 1.7.0)
188
+ dpl (~> 1.10.11)
189
+ github_changelog_generator (~> 1.15)
190
+ guard (~> 2.15)
191
+ guard-rake (~> 1.0.0)
192
+ guard-rspec (~> 4.7)
193
+ guard-rubocop (~> 1.3.0)
194
+ memory_profiler (~> 0.9)
195
+ pry
196
+ pry-alias
197
+ pry-doc
198
+ pry-nav
199
+ pry-rescue
200
+ pry-stack_explorer
201
+ rake (~> 13.0)
202
+ rake-compiler (~> 1.0)
203
+ rspec (~> 3.8)
204
+ rubocop (= 0.71.0)
205
+ simplecov (~> 0.16.1)
206
+ simplecov-console (~> 0.4.2)
207
+ stackprof (~> 0.2)
208
+
209
+ BUNDLED WITH
210
+ 2.0.2
@@ -32,10 +32,9 @@ PATH
32
32
  remote: ..
33
33
  specs:
34
34
  arel_toolkit (0.4.2)
35
- activerecord (~> 5.2.0)
36
- arel (~> 9.0.0)
35
+ activerecord
37
36
  pg (~> 1.1.4)
38
- pg_query (~> 1.1.0)
37
+ pg_query (~> 1.2.0)
39
38
 
40
39
  GEM
41
40
  remote: https://rubygems.org/
@@ -155,7 +154,7 @@ GEM
155
154
  ast (~> 2.4.0)
156
155
  pg (1.1.4)
157
156
  pg_array_parser (0.0.9)
158
- pg_query (1.1.1)
157
+ pg_query (1.2.0)
159
158
  pry (0.12.2)
160
159
  coderay (~> 1.1.0)
161
160
  method_source (~> 0.9.0)
@@ -189,7 +188,7 @@ GEM
189
188
  rake (>= 0.8.7)
190
189
  thor (>= 0.19.0, < 2.0)
191
190
  rainbow (3.0.0)
192
- rake (10.5.0)
191
+ rake (13.0.1)
193
192
  rake-compiler (1.0.7)
194
193
  rake
195
194
  rb-fsevent (0.10.3)
@@ -272,7 +271,7 @@ DEPENDENCIES
272
271
  pry-nav
273
272
  pry-rescue
274
273
  pry-stack_explorer
275
- rake (~> 10.0)
274
+ rake (~> 13.0)
276
275
  rake-compiler (~> 1.0)
277
276
  rspec (~> 3.8)
278
277
  rspec-rails (~> 3.8.0)
@@ -2,10 +2,9 @@ PATH
2
2
  remote: ..
3
3
  specs:
4
4
  arel_toolkit (0.4.2)
5
- activerecord (~> 5.2.0)
6
- arel (~> 9.0.0)
5
+ activerecord
7
6
  pg (~> 1.1.4)
8
- pg_query (~> 1.1.0)
7
+ pg_query (~> 1.2.0)
9
8
 
10
9
  GEM
11
10
  remote: https://rubygems.org/
@@ -105,7 +104,7 @@ GEM
105
104
  parser (2.6.3.0)
106
105
  ast (~> 2.4.0)
107
106
  pg (1.1.4)
108
- pg_query (1.1.1)
107
+ pg_query (1.2.0)
109
108
  pry (0.12.2)
110
109
  coderay (~> 1.1.0)
111
110
  method_source (~> 0.9.0)
@@ -125,7 +124,7 @@ GEM
125
124
  pry (>= 0.9.11)
126
125
  public_suffix (4.0.1)
127
126
  rainbow (3.0.0)
128
- rake (10.5.0)
127
+ rake (13.0.1)
129
128
  rake-compiler (1.0.7)
130
129
  rake
131
130
  rb-fsevent (0.10.3)
@@ -197,7 +196,7 @@ DEPENDENCIES
197
196
  pry-nav
198
197
  pry-rescue
199
198
  pry-stack_explorer
200
- rake (~> 10.0)
199
+ rake (~> 13.0)
201
200
  rake-compiler (~> 1.0)
202
201
  rspec (~> 3.8)
203
202
  rubocop (= 0.71.0)
@@ -115,6 +115,7 @@ require 'arel/extensions/active_model_attribute_with_cast_value'
115
115
  require 'arel/extensions/exists'
116
116
  require 'arel/extensions/bind_param'
117
117
  require 'arel/extensions/node'
118
+ require 'arel/extensions/top'
118
119
 
119
120
  module Arel
120
121
  module Extensions
@@ -27,7 +27,7 @@ module Arel
27
27
  def visit_Arel_Nodes_DeleteStatement(o, collector)
28
28
  if o.with
29
29
  collector = visit o.with, collector
30
- collector << SPACE
30
+ collector << ' '
31
31
  end
32
32
 
33
33
  collector << 'DELETE FROM '
@@ -39,8 +39,8 @@ module Arel
39
39
  end
40
40
 
41
41
  if o.wheres.any?
42
- collector << WHERE
43
- collector = inject_join o.wheres, collector, AND
42
+ collector << ' WHERE '
43
+ collector = inject_join o.wheres, collector, ' AND '
44
44
  end
45
45
 
46
46
  unless o.returning.empty?
@@ -46,7 +46,7 @@ module Arel
46
46
  end
47
47
 
48
48
  if o.orders.any?
49
- collector << SPACE unless o.within_group
49
+ collector << ' ' unless o.within_group
50
50
  collector << 'ORDER BY '
51
51
  collector = inject_join o.orders, collector, ', '
52
52
  end
@@ -16,7 +16,7 @@ module Arel
16
16
  if o.name
17
17
  collector << 'ON CONSTRAINT '
18
18
  collector << o.left
19
- collector << SPACE
19
+ collector << ' '
20
20
  end
21
21
 
22
22
  if o.right
@@ -30,7 +30,7 @@ module Arel
30
30
  def visit_Arel_Nodes_InsertStatement(o, collector)
31
31
  if o.with
32
32
  collector = visit o.with, collector
33
- collector << SPACE
33
+ collector << ' '
34
34
  end
35
35
 
36
36
  collector << 'INSERT INTO '
@@ -6,6 +6,22 @@ module Arel
6
6
  module Nodes
7
7
  class SelectCore < Arel::Nodes::Node
8
8
  attr_accessor :into
9
+ attr_accessor :top
10
+
11
+ private
12
+
13
+ def hash
14
+ [
15
+ @source, @set_quantifier, @projections, @optimizer_hints,
16
+ @wheres, @groups, @havings, @windows, @comment, @top, @into
17
+ ].hash
18
+ end
19
+
20
+ def eql?(other)
21
+ super &&
22
+ top == other.top &&
23
+ into == other.into
24
+ end
9
25
  end
10
26
  end
11
27
 
@@ -14,11 +30,9 @@ module Arel
14
30
  def visit_Arel_Nodes_SelectCore(o, collector)
15
31
  collector << 'SELECT'
16
32
 
17
- collector = maybe_visit o.top, collector
18
-
19
33
  collector = maybe_visit o.set_quantifier, collector
20
34
 
21
- collect_nodes_for o.projections, collector, SPACE
35
+ collect_nodes_for o.projections, collector, ' '
22
36
 
23
37
  maybe_visit o.into, collector
24
38
 
@@ -27,13 +41,13 @@ module Arel
27
41
  collector = visit o.source, collector
28
42
  end
29
43
 
30
- collect_nodes_for o.wheres, collector, WHERE, AND
31
- collect_nodes_for o.groups, collector, GROUP_BY
44
+ collect_nodes_for o.wheres, collector, ' WHERE ', ' AND '
45
+ collect_nodes_for o.groups, collector, ' GROUP BY '
32
46
  unless o.havings.empty?
33
47
  collector << ' HAVING '
34
- inject_join o.havings, collector, AND
48
+ inject_join o.havings, collector, ' AND '
35
49
  end
36
- collect_nodes_for o.windows, collector, WINDOW
50
+ collect_nodes_for o.windows, collector, ' WINDOW '
37
51
 
38
52
  collector
39
53
  end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Top < Unary
6
+ end
7
+ end
8
+ end
@@ -30,7 +30,7 @@ module Arel
30
30
  def visit_Arel_Nodes_UpdateStatement(o, collector)
31
31
  if o.with
32
32
  collector = visit o.with, collector
33
- collector << SPACE
33
+ collector << ' '
34
34
  end
35
35
 
36
36
  wheres = if o.orders.empty? && o.limit.nil?
@@ -0,0 +1,35 @@
1
+ module Arel
2
+ module Middleware
3
+ class CacheAccessor
4
+ attr_reader :cache
5
+
6
+ def initialize(cache)
7
+ @cache = cache
8
+ end
9
+
10
+ def read(original_sql)
11
+ cache.read cache_key(original_sql)
12
+ end
13
+
14
+ def write(transformed_sql:, transformed_binds:, original_sql:, original_binds:)
15
+ # To play it safe, the order of binds was changed and therefore we won't reuse the query
16
+ return if transformed_binds != original_binds
17
+
18
+ cache.write(cache_key(original_sql), transformed_sql)
19
+ end
20
+
21
+ def cache_key_for_sql(sql)
22
+ Digest::SHA256.hexdigest(sql)
23
+ end
24
+
25
+ def cache_key(sql)
26
+ # An important aspect of this cache key method is that it includes hashes of all active
27
+ # middlewares. If multiple Arel middleware chains that are using the same cache backend,
28
+ # this cache key mechanism will prevent cache entries leak in the wrong chain.
29
+
30
+ active_middleware_cache_key = Arel.middleware.current.map(&:hash).join('&') || 0
31
+ active_middleware_cache_key + '|' + cache_key_for_sql(sql)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,81 +1,90 @@
1
+ require_relative './no_op_cache'
2
+ require_relative './cache_accessor'
3
+
1
4
  module Arel
2
5
  module Middleware
3
6
  class Chain
4
- attr_reader :executing_middleware
7
+ attr_reader :executing_middleware_depth
5
8
  attr_reader :executor
9
+ attr_reader :cache
10
+
11
+ MAX_RECURSION_DEPTH = 10
6
12
 
7
13
  def initialize(
8
14
  internal_middleware = [],
9
15
  internal_context = {},
10
- executor_class = Arel::Middleware::DatabaseExecutor
16
+ executor_class = Arel::Middleware::DatabaseExecutor,
17
+ cache: nil
11
18
  )
12
19
  @internal_middleware = internal_middleware
13
20
  @internal_context = internal_context
14
21
  @executor = executor_class.new(internal_middleware)
15
- @executing_middleware = false
22
+ @executing_middleware_depth = 0
23
+ @cache = cache || NoOpCache
24
+ end
25
+
26
+ def cache_accessor
27
+ @cache_accessor ||= CacheAccessor.new @cache
16
28
  end
17
29
 
18
30
  def execute(sql, binds = [], &execute_sql)
19
31
  return execute_sql.call(sql, binds).to_casted_result if internal_middleware.length.zero?
20
32
 
21
- check_middleware_recursion(sql)
22
-
23
- updated_context = context.merge(original_sql: sql)
24
- enhanced_arel = Arel.enhance(Arel.sql_to_arel(sql, binds: binds))
25
-
26
- result = executor.run(enhanced_arel, updated_context, execute_sql)
33
+ if (cached_sql = cache_accessor.read(sql))
34
+ return execute_sql.call(cached_sql, binds).to_casted_result
35
+ end
27
36
 
28
- result.to_casted_result
37
+ execute_with_middleware(sql, binds, execute_sql).to_casted_result
29
38
  rescue ::PgQuery::ParseError
30
39
  execute_sql.call(sql, binds)
31
40
  ensure
32
- @executing_middleware = false
41
+ @executing_middleware_depth -= 1
33
42
  end
34
43
 
35
44
  def current
36
45
  internal_middleware.dup
37
46
  end
38
47
 
39
- def apply(middleware, &block)
48
+ def apply(middleware, cache: @cache, &block)
40
49
  new_middleware = Array.wrap(middleware)
41
- continue_chain(new_middleware, internal_context, &block)
50
+ continue_chain(new_middleware, internal_context, cache: cache, &block)
42
51
  end
43
52
  alias only apply
44
53
 
45
54
  def none(&block)
46
- continue_chain([], internal_context, &block)
55
+ continue_chain([], internal_context, cache: cache, &block)
47
56
  end
48
57
 
49
- def except(without_middleware, &block)
58
+ def except(without_middleware, cache: @cache, &block)
50
59
  without_middleware = Array.wrap(without_middleware)
51
60
  new_middleware = internal_middleware - without_middleware
52
- continue_chain(new_middleware, internal_context, &block)
61
+ continue_chain(new_middleware, internal_context, cache: cache, &block)
53
62
  end
54
63
 
55
- def insert_before(new_middleware, existing_middleware, &block)
64
+ def insert_before(new_middleware, existing_middleware, cache: @cache, &block)
56
65
  new_middleware = Array.wrap(new_middleware)
57
66
  index = internal_middleware.index(existing_middleware)
58
67
  updated_middleware = internal_middleware.insert(index, *new_middleware)
59
- continue_chain(updated_middleware, internal_context, &block)
68
+ continue_chain(updated_middleware, internal_context, cache: cache, &block)
60
69
  end
61
70
 
62
- def prepend(new_middleware, &block)
71
+ def prepend(new_middleware, cache: @cache, &block)
63
72
  new_middleware = Array.wrap(new_middleware)
64
73
  updated_middleware = new_middleware + internal_middleware
65
- continue_chain(updated_middleware, internal_context, &block)
74
+ continue_chain(updated_middleware, internal_context, cache: cache, &block)
66
75
  end
67
76
 
68
- def insert_after(new_middleware, existing_middleware, &block)
77
+ def insert_after(new_middleware, existing_middleware, cache: @cache, &block)
69
78
  new_middleware = Array.wrap(new_middleware)
70
79
  index = internal_middleware.index(existing_middleware)
71
80
  updated_middleware = internal_middleware.insert(index + 1, *new_middleware)
72
- continue_chain(updated_middleware, internal_context, &block)
81
+ continue_chain(updated_middleware, internal_context, cache: cache, &block)
73
82
  end
74
83
 
75
- def append(new_middleware, &block)
84
+ def append(new_middleware, cache: @cache, &block)
76
85
  new_middleware = Array.wrap(new_middleware)
77
86
  updated_middleware = internal_middleware + new_middleware
78
- continue_chain(updated_middleware, internal_context, &block)
87
+ continue_chain(updated_middleware, internal_context, cache: cache, &block)
79
88
  end
80
89
 
81
90
  def context(new_context = nil, &block)
@@ -85,7 +94,7 @@ module Arel
85
94
 
86
95
  return internal_context if new_context.nil?
87
96
 
88
- continue_chain(internal_middleware, new_context, &block)
97
+ continue_chain(internal_middleware, new_context, cache: @cache, &block)
89
98
  end
90
99
 
91
100
  def to_sql(type, &block)
@@ -109,8 +118,23 @@ module Arel
109
118
 
110
119
  private
111
120
 
112
- def continue_chain(middleware, context, &block)
113
- new_chain = Arel::Middleware::Chain.new(middleware, context)
121
+ def execute_with_middleware(sql, binds, execute_sql)
122
+ check_middleware_recursion(sql)
123
+
124
+ updated_context = context.merge(
125
+ original_sql: sql,
126
+ original_binds: binds,
127
+ cache_accessor: cache_accessor,
128
+ )
129
+
130
+ arel = Arel.sql_to_arel(sql, binds: binds)
131
+ enhanced_arel = Arel.enhance(arel)
132
+
133
+ executor.run(enhanced_arel, updated_context, execute_sql)
134
+ end
135
+
136
+ def continue_chain(middleware, context, cache:, &block)
137
+ new_chain = Arel::Middleware::Chain.new(middleware, context, cache: cache)
114
138
  maybe_execute_block(new_chain, &block)
115
139
  end
116
140
 
@@ -125,7 +149,7 @@ module Arel
125
149
  end
126
150
 
127
151
  def check_middleware_recursion(sql)
128
- if executing_middleware
152
+ if executing_middleware_depth > MAX_RECURSION_DEPTH
129
153
  message = <<~ERROR
130
154
  Middleware is being called from within middleware, aborting execution
131
155
  to prevent endless recursion. You can do the following if you want to execute SQL
@@ -140,7 +164,7 @@ module Arel
140
164
 
141
165
  raise message
142
166
  else
143
- @executing_middleware = true
167
+ @executing_middleware_depth += 1
144
168
  end
145
169
  end
146
170
  end
@@ -11,12 +11,12 @@ module Arel
11
11
  @middleware = middleware
12
12
  end
13
13
 
14
- def run(enhanced_arel, context, final_block)
14
+ def run(arel, context, final_block)
15
15
  @index = 0
16
16
  @context = context
17
17
  @final_block = final_block
18
18
 
19
- result = call(enhanced_arel)
19
+ result = call(arel)
20
20
  check_return_type result
21
21
  result
22
22
  ensure
@@ -46,7 +46,16 @@ module Arel
46
46
 
47
47
  def execute_sql(next_arel)
48
48
  sql, binds = next_arel.to_sql_and_binds
49
+
50
+ context[:cache_accessor].write(
51
+ transformed_sql: sql,
52
+ transformed_binds: binds,
53
+ original_sql: context[:original_sql],
54
+ original_binds: context[:original_binds],
55
+ )
56
+
49
57
  sql_result = final_block.call(sql, binds)
58
+
50
59
  check_return_type sql_result
51
60
  sql_result
52
61
  end
@@ -0,0 +1,9 @@
1
+ module Arel
2
+ module Middleware
3
+ module NoOpCache
4
+ def self.read(key); end
5
+
6
+ def self.write(key, sql); end
7
+ end
8
+ end
9
+ end
@@ -5,6 +5,7 @@ require 'pg_search' if Gem.loaded_specs.key?('pg_search')
5
5
  require 'rails/railtie' if Gem.loaded_specs.key?('railties')
6
6
  require 'arel'
7
7
  require 'active_record'
8
+ require 'active_record/connection_adapters/postgresql_adapter'
8
9
 
9
10
  require 'arel_toolkit/version'
10
11
 
@@ -1,3 +1,3 @@
1
1
  module ArelToolkit
2
- VERSION = '0.4.2'.freeze
2
+ VERSION = '0.4.3'.freeze
3
3
  end
metadata CHANGED
@@ -1,43 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arel_toolkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - maarten
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-08 00:00:00.000000000 Z
11
+ date: 2020-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: arel
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: 9.0.0
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 9.0.0
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: activerecord
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
- - - "~>"
17
+ - - ">="
32
18
  - !ruby/object:Gem::Version
33
- version: 5.2.0
19
+ version: '0'
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
- - - "~>"
24
+ - - ">="
39
25
  - !ruby/object:Gem::Version
40
- version: 5.2.0
26
+ version: '0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: pg
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +44,14 @@ dependencies:
58
44
  requirements:
59
45
  - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: 1.1.0
47
+ version: 1.2.0
62
48
  type: :runtime
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: 1.1.0
54
+ version: 1.2.0
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: bundler
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +100,14 @@ dependencies:
114
100
  requirements:
115
101
  - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: '10.0'
103
+ version: '13.0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: '10.0'
110
+ version: '13.0'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: rake-compiler
127
113
  requirement: !ruby/object:Gem::Requirement
@@ -437,6 +423,8 @@ files:
437
423
  - ext/pg_result_init/pg_result_init.c
438
424
  - ext/pg_result_init/pg_result_init.h
439
425
  - gemfiles/.bundle/config
426
+ - gemfiles/active_record_6.gemfile
427
+ - gemfiles/active_record_6.gemfile.lock
440
428
  - gemfiles/arel_gems.gemfile
441
429
  - gemfiles/arel_gems.gemfile.lock
442
430
  - gemfiles/default.gemfile
@@ -548,6 +536,7 @@ files:
548
536
  - lib/arel/extensions/table.rb
549
537
  - lib/arel/extensions/time_with_precision.rb
550
538
  - lib/arel/extensions/to_sql.rb
539
+ - lib/arel/extensions/top.rb
551
540
  - lib/arel/extensions/transaction.rb
552
541
  - lib/arel/extensions/tree_manager.rb
553
542
  - lib/arel/extensions/trim.rb
@@ -565,8 +554,10 @@ files:
565
554
  - lib/arel/extensions/with_ordinality.rb
566
555
  - lib/arel/middleware.rb
567
556
  - lib/arel/middleware/active_record_extension.rb
557
+ - lib/arel/middleware/cache_accessor.rb
568
558
  - lib/arel/middleware/chain.rb
569
559
  - lib/arel/middleware/database_executor.rb
560
+ - lib/arel/middleware/no_op_cache.rb
570
561
  - lib/arel/middleware/postgresql_adapter.rb
571
562
  - lib/arel/middleware/railtie.rb
572
563
  - lib/arel/middleware/result.rb
@@ -587,7 +578,7 @@ homepage: https://github.com/mvgijssel/arel_toolkit
587
578
  licenses:
588
579
  - MIT
589
580
  metadata: {}
590
- post_install_message:
581
+ post_install_message:
591
582
  rdoc_options: []
592
583
  require_paths:
593
584
  - lib
@@ -603,7 +594,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
603
594
  version: '0'
604
595
  requirements: []
605
596
  rubygems_version: 3.0.3
606
- signing_key:
597
+ signing_key:
607
598
  specification_version: 4
608
599
  summary: Collection of tools for Arel
609
600
  test_files: []