arel_toolkit 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
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: []