arel_extensions 1.7.0 → 2.0.0.rc3
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 +4 -4
- data/.codeclimate.yml +2 -1
- data/.gitignore +6 -8
- data/.rubocop.yml +4 -194
- data/.travis/oracle/download.js +152 -0
- data/.travis/oracle/download.sh +30 -0
- data/.travis/oracle/download_ojdbc.js +116 -0
- data/.travis/oracle/install.sh +34 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis/sqlite3/extension-functions.sh +6 -0
- data/.travis.yml +223 -0
- data/Gemfile +28 -2
- data/README.md +89 -265
- data/Rakefile +30 -50
- data/TODO +1 -0
- data/appveyor.yml +22 -60
- data/arel_extensions.gemspec +17 -14
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +20 -0
- data/gemfiles/rails4.gemfile +29 -0
- data/gemfiles/rails5_0.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +17 -19
- data/gemfiles/rails5_2.gemfile +17 -26
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +25 -24
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/attributes.rb +3 -9
- data/lib/arel_extensions/boolean_functions.rb +16 -57
- data/lib/arel_extensions/common_sql_functions.rb +20 -21
- data/lib/arel_extensions/comparators.rb +28 -31
- data/lib/arel_extensions/date_duration.rb +13 -19
- data/lib/arel_extensions/insert_manager.rb +15 -22
- data/lib/arel_extensions/math.rb +70 -68
- data/lib/arel_extensions/math_functions.rb +52 -57
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +5 -6
- data/lib/arel_extensions/nodes/case.rb +27 -31
- data/lib/arel_extensions/nodes/cast.rb +12 -12
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/coalesce.rb +5 -4
- data/lib/arel_extensions/nodes/collate.rb +10 -9
- data/lib/arel_extensions/nodes/concat.rb +22 -13
- data/lib/arel_extensions/nodes/date_diff.rb +70 -77
- data/lib/arel_extensions/nodes/duration.rb +5 -2
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
- data/lib/arel_extensions/nodes/floor.rb +1 -1
- data/lib/arel_extensions/nodes/format.rb +8 -35
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +39 -50
- data/lib/arel_extensions/nodes/is_null.rb +0 -2
- data/lib/arel_extensions/nodes/json.rb +47 -72
- data/lib/arel_extensions/nodes/length.rb +0 -5
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +2 -2
- data/lib/arel_extensions/nodes/locate.rb +3 -2
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +8 -6
- data/lib/arel_extensions/nodes/md5.rb +1 -0
- data/lib/arel_extensions/nodes/power.rb +5 -5
- data/lib/arel_extensions/nodes/rand.rb +3 -2
- data/lib/arel_extensions/nodes/repeat.rb +6 -4
- data/lib/arel_extensions/nodes/replace.rb +8 -16
- data/lib/arel_extensions/nodes/round.rb +7 -6
- data/lib/arel_extensions/nodes/soundex.rb +15 -15
- data/lib/arel_extensions/nodes/std.rb +21 -18
- data/lib/arel_extensions/nodes/substring.rb +16 -58
- data/lib/arel_extensions/nodes/then.rb +2 -2
- data/lib/arel_extensions/nodes/trim.rb +7 -5
- data/lib/arel_extensions/nodes/union.rb +9 -6
- data/lib/arel_extensions/nodes/union_all.rb +8 -5
- data/lib/arel_extensions/nodes/wday.rb +6 -2
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +6 -18
- data/lib/arel_extensions/predications.rb +49 -54
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +55 -110
- data/lib/arel_extensions/tasks.rb +6 -6
- data/lib/arel_extensions/version.rb +1 -3
- data/lib/arel_extensions/visitors/ibm_db.rb +36 -29
- data/lib/arel_extensions/visitors/mssql.rb +248 -493
- data/lib/arel_extensions/visitors/mysql.rb +244 -420
- data/lib/arel_extensions/visitors/oracle.rb +258 -311
- data/lib/arel_extensions/visitors/oracle12.rb +34 -20
- data/lib/arel_extensions/visitors/postgresql.rb +239 -350
- data/lib/arel_extensions/visitors/sqlite.rb +169 -191
- data/lib/arel_extensions/visitors/to_sql.rb +299 -371
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +32 -243
- data/test/database.yml +10 -20
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +120 -123
- data/test/support/fake_record.rb +3 -11
- data/test/test_comparators.rb +17 -14
- data/test/visitors/test_bulk_insert_oracle.rb +12 -12
- data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
- data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
- data/test/visitors/test_oracle.rb +55 -55
- data/test/visitors/test_to_sql.rb +226 -419
- data/test/with_ar/all_agnostic_test.rb +375 -912
- data/test/with_ar/insert_agnostic_test.rb +22 -28
- data/test/with_ar/test_bulk_sqlite.rb +17 -18
- data/test/with_ar/test_math_sqlite.rb +27 -27
- data/test/with_ar/test_string_mysql.rb +34 -32
- data/test/with_ar/test_string_sqlite.rb +35 -31
- metadata +64 -50
- data/.github/workflows/publish.yml +0 -30
- data/.github/workflows/release.yml +0 -30
- data/.github/workflows/ruby.yml +0 -452
- data/CONTRIBUTING.md +0 -102
- data/Makefile +0 -48
- data/NEWS.md +0 -131
- data/bin/build +0 -15
- data/bin/publish +0 -8
- data/dev/arelx.dockerfile +0 -41
- data/dev/compose.yaml +0 -69
- data/dev/postgres.dockerfile +0 -5
- data/dev/rbenv +0 -189
- data/gemfiles/rails5.gemfile +0 -36
- data/gemfiles/rails6.gemfile +0 -40
- data/gemfiles/rails6_1.gemfile +0 -48
- data/gemfiles/rails7.gemfile +0 -48
- data/gemfiles/rails7_1.gemfile +0 -48
- data/gemfiles/rails7_2.gemfile +0 -47
- data/gemfiles/rails8.gemfile +0 -40
- data/gemfiles/rails8_1.gemfile +0 -41
- data/gemspecs/arel_extensions-v1.gemspec +0 -25
- data/gemspecs/arel_extensions-v2.gemspec +0 -25
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/aliases.rb +0 -14
- data/lib/arel_extensions/constants.rb +0 -13
- data/lib/arel_extensions/helpers.rb +0 -61
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- data/lib/arel_extensions/nodes/byte_size.rb +0 -11
- data/lib/arel_extensions/nodes/char_length.rb +0 -11
- data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
- data/lib/arel_extensions/nodes/rollup.rb +0 -36
- data/lib/arel_extensions/nodes/select.rb +0 -10
- data/lib/arel_extensions/nodes/sum.rb +0 -7
- data/lib/arel_extensions/visitors/convert_format.rb +0 -37
- data/lib/arel_extensions/warning.rb +0 -42
- data/test/arelx_test_helper.rb +0 -94
- data/test/config_loader.rb +0 -9
- data/version_v1.rb +0 -5
- data/version_v2.rb +0 -5
|
@@ -1,96 +1,75 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
2
|
module Visitors
|
|
3
|
-
|
|
4
|
-
DATE_MAPPING = {
|
|
5
|
-
|
|
6
|
-
'
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
'%%' => '%',
|
|
17
|
-
}.freeze
|
|
18
|
-
|
|
19
|
-
NUMBER_COMMA_MAPPING = {
|
|
20
|
-
'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', '
|
|
21
|
-
}.freeze
|
|
22
|
-
|
|
23
|
-
def visit_ArelExtensions_Nodes_ByteSize(o, collector)
|
|
24
|
-
collector << 'octet_length('
|
|
25
|
-
collector = visit o.expr.coalesce(''), collector
|
|
26
|
-
collector << ')'
|
|
27
|
-
collector
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def visit_ArelExtensions_Nodes_CharLength(o, collector)
|
|
31
|
-
collector << 'length('
|
|
32
|
-
collector = visit o.expr.coalesce(''), collector
|
|
33
|
-
collector << ')'
|
|
34
|
-
collector
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def visit_ArelExtensions_Nodes_Rand(o, collector)
|
|
38
|
-
collector << 'RANDOM('
|
|
39
|
-
if !o.left.nil? && !o.right.nil?
|
|
3
|
+
Arel::Visitors::PostgreSQL.class_eval do
|
|
4
|
+
Arel::Visitors::PostgreSQL::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'WEEK', 'y' => 'YEAR', 'wd' => 'DOW', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
|
|
5
|
+
Arel::Visitors::PostgreSQL::DATE_FORMAT_DIRECTIVES = {
|
|
6
|
+
'%Y' => 'IYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
|
|
7
|
+
'%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%A' => 'Day', # day, weekday
|
|
8
|
+
'%H' => 'HH24', '%k' => '', '%I' => 'HH', '%l' => '', '%P' => 'am', '%p' => 'AM', # hours
|
|
9
|
+
'%M' => 'MI', '%S' => 'SS', '%L' => 'MS', '%N' => 'US', '%z' => 'tz' # seconds, subseconds
|
|
10
|
+
}
|
|
11
|
+
Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING = { 'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', ' }
|
|
12
|
+
|
|
13
|
+
def visit_ArelExtensions_Nodes_Rand o, collector
|
|
14
|
+
collector << "RANDOM("
|
|
15
|
+
if(o.left != nil && o.right != nil)
|
|
40
16
|
collector = visit o.left, collector
|
|
41
|
-
collector << COMMA
|
|
17
|
+
collector << Arel::Visitors::PostgreSQL::COMMA
|
|
42
18
|
collector = isit o.right, collector
|
|
43
19
|
end
|
|
44
|
-
collector <<
|
|
20
|
+
collector << ")"
|
|
45
21
|
collector
|
|
46
22
|
end
|
|
47
23
|
|
|
48
|
-
def visit_ArelExtensions_Nodes_Power
|
|
49
|
-
collector <<
|
|
24
|
+
def visit_ArelExtensions_Nodes_Power o, collector
|
|
25
|
+
collector << "POWER("
|
|
50
26
|
o.expressions.each_with_index { |arg, i|
|
|
51
|
-
collector << COMMA
|
|
27
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
52
28
|
collector = visit arg, collector
|
|
53
29
|
}
|
|
54
|
-
collector <<
|
|
30
|
+
collector << ")"
|
|
55
31
|
collector
|
|
56
32
|
end
|
|
57
33
|
|
|
58
|
-
def visit_ArelExtensions_Nodes_Log10
|
|
59
|
-
collector <<
|
|
34
|
+
def visit_ArelExtensions_Nodes_Log10 o, collector
|
|
35
|
+
collector << "LOG("
|
|
60
36
|
o.expressions.each_with_index { |arg, i|
|
|
61
|
-
collector << COMMA
|
|
37
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
62
38
|
collector = visit arg, collector
|
|
63
39
|
}
|
|
64
|
-
collector <<
|
|
40
|
+
collector << ")"
|
|
65
41
|
collector
|
|
66
42
|
end
|
|
67
43
|
|
|
44
|
+
|
|
68
45
|
remove_method(:visit_Arel_Nodes_Regexp) rescue nil
|
|
69
|
-
def visit_Arel_Nodes_Regexp
|
|
46
|
+
def visit_Arel_Nodes_Regexp o, collector
|
|
70
47
|
collector = visit o.left, collector
|
|
71
|
-
collector <<
|
|
72
|
-
visit o.right, collector
|
|
48
|
+
collector << " ~ "
|
|
49
|
+
collector = visit o.right, collector
|
|
50
|
+
collector
|
|
73
51
|
end
|
|
74
52
|
|
|
75
53
|
remove_method(:visit_Arel_Nodes_NotRegexp) rescue nil
|
|
76
|
-
def visit_Arel_Nodes_NotRegexp
|
|
54
|
+
def visit_Arel_Nodes_NotRegexp o, collector
|
|
77
55
|
collector = visit o.left, collector
|
|
78
|
-
collector <<
|
|
79
|
-
visit o.right, collector
|
|
56
|
+
collector << " !~ "
|
|
57
|
+
collector = visit o.right, collector
|
|
58
|
+
collector
|
|
80
59
|
end
|
|
81
60
|
|
|
82
|
-
def visit_ArelExtensions_Nodes_Concat
|
|
61
|
+
def visit_ArelExtensions_Nodes_Concat o, collector
|
|
83
62
|
collector << '('
|
|
84
63
|
o.expressions.each_with_index { |arg, i|
|
|
85
64
|
collector = visit arg, collector
|
|
86
65
|
collector << ' || ' unless i == o.expressions.length - 1
|
|
87
66
|
}
|
|
88
|
-
collector <<
|
|
67
|
+
collector << ")"
|
|
89
68
|
collector
|
|
90
69
|
end
|
|
91
70
|
|
|
92
|
-
|
|
93
|
-
def visit_Arel_Nodes_As
|
|
71
|
+
alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
|
|
72
|
+
def visit_Arel_Nodes_As o, collector
|
|
94
73
|
if o.left.is_a?(Arel::Nodes::Binary)
|
|
95
74
|
collector << '('
|
|
96
75
|
collector = visit o.left, collector
|
|
@@ -98,130 +77,84 @@ module ArelExtensions
|
|
|
98
77
|
else
|
|
99
78
|
collector = visit o.left, collector
|
|
100
79
|
end
|
|
101
|
-
collector <<
|
|
102
|
-
|
|
103
|
-
# sometimes these values are already quoted, if they are, don't double quote it
|
|
104
|
-
quote = o.right.is_a?(Arel::Nodes::SqlLiteral) && o.right[0] != '"' && o.right[-1] != '"'
|
|
105
|
-
|
|
106
|
-
collector << '"' if quote
|
|
80
|
+
collector << " AS \""
|
|
107
81
|
collector = visit o.right, collector
|
|
108
|
-
collector <<
|
|
109
|
-
|
|
82
|
+
collector << "\""
|
|
110
83
|
collector
|
|
111
84
|
end
|
|
112
85
|
|
|
113
|
-
def
|
|
114
|
-
|
|
115
|
-
collector << ' OVER ('
|
|
116
|
-
if !o.group.blank?
|
|
117
|
-
collector << ' PARTITION BY '
|
|
118
|
-
o.group.each_with_index do |group, i|
|
|
119
|
-
collector << COMMA if i != 0
|
|
120
|
-
visit group, collector
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
if !o.order.blank?
|
|
124
|
-
collector << ' ORDER BY '
|
|
125
|
-
o.order.each_with_index do |order, i|
|
|
126
|
-
collector << COMMA if i != 0
|
|
127
|
-
visit order, collector
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
collector << ')'
|
|
131
|
-
end
|
|
132
|
-
collector
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def visit_ArelExtensions_Nodes_GroupConcat(o, collector)
|
|
136
|
-
collector << 'array_to_string(array_agg('
|
|
86
|
+
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
|
87
|
+
collector << "array_to_string(array_agg("
|
|
137
88
|
collector = visit o.left, collector
|
|
138
|
-
if
|
|
139
|
-
collector << ' ORDER BY'
|
|
140
|
-
o.
|
|
141
|
-
collector << COMMA
|
|
142
|
-
collector
|
|
143
|
-
visit order, collector
|
|
89
|
+
if !o.orders.blank?
|
|
90
|
+
collector << ' ORDER BY '
|
|
91
|
+
o.orders.each_with_index do |order,i|
|
|
92
|
+
collector << Arel::Visitors::PostgreSQL::COMMA unless i == 0
|
|
93
|
+
collector = visit order, collector
|
|
144
94
|
end
|
|
145
95
|
end
|
|
146
|
-
collector <<
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
else
|
|
155
|
-
visit o.separator, collector
|
|
156
|
-
end
|
|
157
|
-
collector << ')'
|
|
96
|
+
collector << ")"
|
|
97
|
+
collector << Arel::Visitors::PostgreSQL::COMMA
|
|
98
|
+
if o.right && o.right != 'NULL'
|
|
99
|
+
collector = visit o.right, collector
|
|
100
|
+
else
|
|
101
|
+
collector = visit Arel::Nodes.build_quoted(','), collector
|
|
102
|
+
end
|
|
103
|
+
collector << ")"
|
|
158
104
|
collector
|
|
159
105
|
end
|
|
160
106
|
|
|
161
|
-
def visit_ArelExtensions_Nodes_Trim
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
107
|
+
def visit_ArelExtensions_Nodes_Trim o, collector
|
|
108
|
+
collector << 'TRIM(BOTH '
|
|
109
|
+
collector = visit o.right, collector
|
|
110
|
+
collector << " FROM "
|
|
111
|
+
collector = visit o.left, collector
|
|
112
|
+
collector << ")"
|
|
113
|
+
collector
|
|
168
114
|
end
|
|
169
115
|
|
|
170
|
-
def visit_ArelExtensions_Nodes_Ltrim
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
116
|
+
def visit_ArelExtensions_Nodes_Ltrim o, collector
|
|
117
|
+
collector << 'TRIM(LEADING '
|
|
118
|
+
collector = visit o.right, collector
|
|
119
|
+
collector << " FROM "
|
|
120
|
+
collector = visit o.left, collector
|
|
121
|
+
collector << ")"
|
|
122
|
+
collector
|
|
177
123
|
end
|
|
178
124
|
|
|
179
|
-
def visit_ArelExtensions_Nodes_Rtrim
|
|
125
|
+
def visit_ArelExtensions_Nodes_Rtrim o, collector
|
|
180
126
|
collector << 'TRIM(TRAILING '
|
|
181
127
|
collector = visit o.right, collector
|
|
182
|
-
collector <<
|
|
128
|
+
collector << " FROM "
|
|
183
129
|
collector = visit o.left, collector
|
|
184
|
-
collector <<
|
|
130
|
+
collector << ")"
|
|
185
131
|
collector
|
|
186
132
|
end
|
|
187
133
|
|
|
188
|
-
def visit_ArelExtensions_Nodes_Format
|
|
189
|
-
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
def visit_ArelExtensions_Nodes_FormattedDate(o, collector)
|
|
193
|
-
fmt = ArelExtensions::Visitors.strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
|
|
194
|
-
collector << 'TO_CHAR('
|
|
195
|
-
collector << '(' if o.time_zone
|
|
134
|
+
def visit_ArelExtensions_Nodes_Format o, collector
|
|
135
|
+
collector << "TO_CHAR("
|
|
196
136
|
collector = visit o.left, collector
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
when String
|
|
205
|
-
collector << ") AT TIME ZONE 'UTC' AT TIME ZONE "
|
|
206
|
-
collector = visit Arel.quoted(o.time_zone), collector
|
|
207
|
-
end
|
|
208
|
-
collector << COMMA
|
|
209
|
-
collector = visit Arel.quoted(fmt), collector
|
|
210
|
-
collector << ')'
|
|
137
|
+
collector << Arel::Visitors::PostgreSQL::COMMA
|
|
138
|
+
|
|
139
|
+
f = o.iso_format.dup
|
|
140
|
+
Arel::Visitors::PostgreSQL::DATE_FORMAT_DIRECTIVES.each { |d, r| f.gsub!(d, r) }
|
|
141
|
+
collector = visit Arel::Nodes.build_quoted(f), collector
|
|
142
|
+
|
|
143
|
+
collector << ")"
|
|
211
144
|
collector
|
|
212
145
|
end
|
|
213
146
|
|
|
214
|
-
def visit_ArelExtensions_Nodes_Repeat
|
|
215
|
-
collector <<
|
|
147
|
+
def visit_ArelExtensions_Nodes_Repeat o, collector
|
|
148
|
+
collector << "REPEAT("
|
|
216
149
|
o.expressions.each_with_index { |arg, i|
|
|
217
|
-
collector << COMMA
|
|
150
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
218
151
|
collector = visit arg, collector
|
|
219
152
|
}
|
|
220
|
-
collector <<
|
|
153
|
+
collector << ")"
|
|
221
154
|
collector
|
|
222
155
|
end
|
|
223
156
|
|
|
224
|
-
def visit_ArelExtensions_Nodes_AiMatches
|
|
157
|
+
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
|
225
158
|
collector = visit o.left.ai_collate, collector
|
|
226
159
|
collector << ' LIKE '
|
|
227
160
|
collector = visit o.right.ai_collate, collector
|
|
@@ -233,7 +166,7 @@ module ArelExtensions
|
|
|
233
166
|
end
|
|
234
167
|
end
|
|
235
168
|
|
|
236
|
-
def visit_ArelExtensions_Nodes_AiIMatches
|
|
169
|
+
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
|
237
170
|
collector = visit o.left.ai_collate, collector
|
|
238
171
|
collector << ' ILIKE '
|
|
239
172
|
collector = visit o.right.ai_collate, collector
|
|
@@ -245,7 +178,7 @@ module ArelExtensions
|
|
|
245
178
|
end
|
|
246
179
|
end
|
|
247
180
|
|
|
248
|
-
def visit_ArelExtensions_Nodes_SMatches
|
|
181
|
+
def visit_ArelExtensions_Nodes_SMatches o, collector
|
|
249
182
|
collector = visit o.left, collector
|
|
250
183
|
collector << ' LIKE '
|
|
251
184
|
collector = visit o.right, collector
|
|
@@ -257,11 +190,11 @@ module ArelExtensions
|
|
|
257
190
|
end
|
|
258
191
|
end
|
|
259
192
|
|
|
260
|
-
def visit_ArelExtensions_Nodes_Collate
|
|
193
|
+
def visit_ArelExtensions_Nodes_Collate o, collector
|
|
261
194
|
if o.ai
|
|
262
|
-
collector <<
|
|
195
|
+
collector << "unaccent("
|
|
263
196
|
collector = visit o.expressions.first, collector
|
|
264
|
-
collector <<
|
|
197
|
+
collector << ")"
|
|
265
198
|
elsif o.ci
|
|
266
199
|
collector = visit o.expressions.first, collector
|
|
267
200
|
else
|
|
@@ -270,25 +203,26 @@ module ArelExtensions
|
|
|
270
203
|
collector
|
|
271
204
|
end
|
|
272
205
|
|
|
273
|
-
def visit_ArelExtensions_Nodes_DateAdd
|
|
206
|
+
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
|
274
207
|
collector = visit o.left, collector
|
|
275
|
-
collector << ' + ' #
|
|
276
|
-
visit o.postgresql_value(o.right), collector
|
|
208
|
+
collector << ' + ' #(o.right.value >= 0 ? ' + ' : ' - ')
|
|
209
|
+
collector = visit o.postgresql_value(o.right), collector
|
|
210
|
+
collector
|
|
277
211
|
end
|
|
278
212
|
|
|
279
|
-
def visit_ArelExtensions_Nodes_DateDiff
|
|
280
|
-
if
|
|
281
|
-
collector << if
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
213
|
+
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
|
214
|
+
if o.right_node_type == :ruby_date || o.right_node_type == :ruby_time || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
|
|
215
|
+
collector << if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
|
216
|
+
"DATEDIFF('second', "
|
|
217
|
+
else
|
|
218
|
+
"DATEDIFF('day', "
|
|
219
|
+
end
|
|
286
220
|
collector = visit o.right, collector
|
|
287
221
|
collector << (o.right_node_type == :date ? '::date' : '::timestamp')
|
|
288
|
-
collector << COMMA
|
|
222
|
+
collector << Arel::Visitors::PostgreSQL::COMMA
|
|
289
223
|
collector = visit o.left, collector
|
|
290
224
|
collector << (o.left_node_type == :date ? '::date' : '::timestamp')
|
|
291
|
-
collector <<
|
|
225
|
+
collector << ")"
|
|
292
226
|
else
|
|
293
227
|
collector << '('
|
|
294
228
|
collector = visit o.left, collector
|
|
@@ -302,178 +236,146 @@ module ArelExtensions
|
|
|
302
236
|
collector
|
|
303
237
|
end
|
|
304
238
|
|
|
305
|
-
def visit_ArelExtensions_Nodes_Duration
|
|
239
|
+
def visit_ArelExtensions_Nodes_Duration o, collector
|
|
306
240
|
if o.with_interval
|
|
307
|
-
interval =
|
|
308
|
-
|
|
309
|
-
when 'd', 'm', 'y'
|
|
241
|
+
interval = case o.left
|
|
242
|
+
when 'd','m','y'
|
|
310
243
|
'DAY'
|
|
311
|
-
when 'h',
|
|
244
|
+
when 'h','mn','s'
|
|
312
245
|
'SECOND'
|
|
313
246
|
when /i\z/
|
|
314
|
-
collector <<
|
|
247
|
+
collector << "("
|
|
315
248
|
collector = visit o.right, collector
|
|
316
|
-
collector <<
|
|
317
|
-
collector << " * (INTERVAL '1' #{DATE_MAPPING[o.left[0..-2]]})"
|
|
249
|
+
collector << ")"
|
|
250
|
+
collector << " * (INTERVAL '1' #{Arel::Visitors::PostgreSQL::DATE_MAPPING[o.left[0..-2]]})"
|
|
318
251
|
return collector
|
|
319
252
|
end
|
|
320
253
|
end
|
|
321
|
-
collector << "EXTRACT(#{DATE_MAPPING[o.left]} FROM
|
|
254
|
+
collector << "EXTRACT(#{Arel::Visitors::PostgreSQL::DATE_MAPPING[o.left]} FROM "
|
|
322
255
|
collector = visit o.right, collector
|
|
323
|
-
collector <<
|
|
256
|
+
collector << ")"
|
|
324
257
|
collector << " * (INTERVAL '1' #{interval})" if interval && o.with_interval
|
|
325
258
|
collector
|
|
326
259
|
end
|
|
327
260
|
|
|
328
|
-
def visit_ArelExtensions_Nodes_Locate
|
|
329
|
-
collector <<
|
|
261
|
+
def visit_ArelExtensions_Nodes_Locate o, collector
|
|
262
|
+
collector << "POSITION("
|
|
330
263
|
collector = visit o.right, collector
|
|
331
|
-
collector <<
|
|
264
|
+
collector << " IN "
|
|
332
265
|
collector = visit o.left, collector
|
|
333
|
-
collector <<
|
|
266
|
+
collector << ")"
|
|
334
267
|
collector
|
|
335
268
|
end
|
|
336
269
|
|
|
337
|
-
def visit_ArelExtensions_Nodes_Substring
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
collector << 'SUBSTR('
|
|
270
|
+
def visit_ArelExtensions_Nodes_Substring o, collector
|
|
271
|
+
collector << "SUBSTR("
|
|
341
272
|
o.expressions.each_with_index { |arg, i|
|
|
342
|
-
collector << COMMA
|
|
273
|
+
collector << Arel::Visitors::PostgreSQL::COMMA unless i == 0
|
|
343
274
|
collector = visit arg, collector
|
|
344
275
|
}
|
|
345
|
-
collector <<
|
|
276
|
+
collector << ")"
|
|
346
277
|
collector
|
|
347
278
|
end
|
|
348
279
|
|
|
349
|
-
def
|
|
350
|
-
collector << 'REGEXP_REPLACE('
|
|
351
|
-
visit o.left, collector
|
|
352
|
-
collector << COMMA
|
|
353
|
-
tab = o.pattern.inspect + 'g' # Make it always global
|
|
354
|
-
pattern = tab.split('/')[1..-2].join('/')
|
|
355
|
-
flags = tab.split('/')[-1]
|
|
356
|
-
visit Arel.quoted(pattern), collector
|
|
357
|
-
collector << COMMA
|
|
358
|
-
visit o.substitute, collector
|
|
359
|
-
collector << COMMA
|
|
360
|
-
visit Arel.quoted(flags + 'g'), collector
|
|
361
|
-
collector << ')'
|
|
362
|
-
collector
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
def visit_ArelExtensions_Nodes_IsNull(o, collector)
|
|
280
|
+
def visit_ArelExtensions_Nodes_IsNull o, collector
|
|
366
281
|
collector = visit o.expr, collector
|
|
367
282
|
collector << ' IS NULL'
|
|
368
283
|
collector
|
|
369
284
|
end
|
|
370
285
|
|
|
371
|
-
def visit_ArelExtensions_Nodes_IsNotNull
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
286
|
+
def visit_ArelExtensions_Nodes_IsNotNull o, collector
|
|
287
|
+
collector = visit o.expr, collector
|
|
288
|
+
collector << ' IS NOT NULL'
|
|
289
|
+
collector
|
|
375
290
|
end
|
|
376
291
|
|
|
377
|
-
def visit_ArelExtensions_Nodes_Sum
|
|
378
|
-
collector <<
|
|
292
|
+
def visit_ArelExtensions_Nodes_Sum o, collector
|
|
293
|
+
collector << "sum("
|
|
379
294
|
collector = visit o.expr, collector
|
|
380
|
-
collector <<
|
|
381
|
-
visit_Aggregate_For_AggregateFunction o, collector
|
|
295
|
+
collector << ")"
|
|
382
296
|
collector
|
|
383
297
|
end
|
|
384
298
|
|
|
385
|
-
def visit_ArelExtensions_Nodes_Wday
|
|
386
|
-
collector <<
|
|
299
|
+
def visit_ArelExtensions_Nodes_Wday o, collector
|
|
300
|
+
collector << "EXRTACT(DOW, "
|
|
387
301
|
collector = visit o.date, collector
|
|
388
302
|
collector << ')'
|
|
389
303
|
collector
|
|
390
304
|
end
|
|
391
305
|
|
|
392
|
-
def visit_ArelExtensions_Nodes_Cast
|
|
393
|
-
as_attr =
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
'jsonb'
|
|
416
|
-
else
|
|
417
|
-
o.as_attr.to_s
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
collector << 'CAST('
|
|
306
|
+
def visit_ArelExtensions_Nodes_Cast o, collector
|
|
307
|
+
as_attr = case o.as_attr
|
|
308
|
+
when :string
|
|
309
|
+
Arel::Nodes::SqlLiteral.new('varchar')
|
|
310
|
+
when :time
|
|
311
|
+
Arel::Nodes::SqlLiteral.new('time')
|
|
312
|
+
when :int
|
|
313
|
+
collector << "CAST(CAST("
|
|
314
|
+
collector = visit o.left, collector
|
|
315
|
+
collector << " AS numeric) AS int)"
|
|
316
|
+
return collector
|
|
317
|
+
when :number, :decimal, :float
|
|
318
|
+
Arel::Nodes::SqlLiteral.new('numeric')
|
|
319
|
+
when :datetime
|
|
320
|
+
Arel::Nodes::SqlLiteral.new('timestamp')
|
|
321
|
+
when :date
|
|
322
|
+
Arel::Nodes::SqlLiteral.new('date')
|
|
323
|
+
when :binary
|
|
324
|
+
Arel::Nodes::SqlLiteral.new('binary')
|
|
325
|
+
else
|
|
326
|
+
Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
|
|
327
|
+
end
|
|
328
|
+
collector << "CAST("
|
|
421
329
|
collector = visit o.left, collector
|
|
422
|
-
collector <<
|
|
423
|
-
collector = visit
|
|
424
|
-
collector <<
|
|
330
|
+
collector << " AS "
|
|
331
|
+
collector = visit as_attr, collector
|
|
332
|
+
collector << ")"
|
|
425
333
|
collector
|
|
426
334
|
end
|
|
427
335
|
|
|
428
|
-
def visit_ArelExtensions_Nodes_FormattedNumber
|
|
336
|
+
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
|
429
337
|
col = o.left.coalesce(0)
|
|
430
|
-
comma = o.precision == 0 ? '' : (NUMBER_COMMA_MAPPING[o.locale][0] || '.')
|
|
431
|
-
thousand_separator = NUMBER_COMMA_MAPPING[o.locale][1] || (NUMBER_COMMA_MAPPING[o.locale] ? '' : 'G')
|
|
432
|
-
nines_after = (1..o.precision).map
|
|
433
|
-
nines_before = ("999#{thousand_separator}"
|
|
338
|
+
comma = o.precision == 0 ? '' : (Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale][0] || '.')
|
|
339
|
+
thousand_separator = Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale][1] || (Arel::Visitors::PostgreSQL::NUMBER_COMMA_MAPPING[o.locale] ? '' : 'G')
|
|
340
|
+
nines_after = (1..o.precision).map{'9'}.join('')
|
|
341
|
+
nines_before = ("999#{thousand_separator}"*4+"990")
|
|
434
342
|
|
|
435
|
-
sign =
|
|
343
|
+
sign = ArelExtensions::Nodes::Case.new.when(col<0).
|
|
436
344
|
then('-').
|
|
437
345
|
else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
|
|
438
346
|
sign_length = ArelExtensions::Nodes::Length.new([sign])
|
|
439
347
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
end
|
|
348
|
+
if o.scientific_notation
|
|
349
|
+
number = ArelExtensions::Nodes::Concat.new([
|
|
350
|
+
Arel::Nodes::NamedFunction.new('TRIM',[
|
|
351
|
+
Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
|
352
|
+
col.abs/Arel::Nodes.build_quoted(10).pow(col.abs.log10.floor),
|
|
353
|
+
Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
|
|
354
|
+
])]),
|
|
355
|
+
o.type,
|
|
356
|
+
Arel::Nodes::NamedFunction.new('TRIM',[
|
|
357
|
+
Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
|
358
|
+
col.abs.log10.floor,
|
|
359
|
+
Arel::Nodes.build_quoted('FM'+nines_before)
|
|
360
|
+
])])
|
|
361
|
+
])
|
|
362
|
+
else
|
|
363
|
+
number = Arel::Nodes::NamedFunction.new('TRIM',[
|
|
364
|
+
Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
|
365
|
+
Arel::Nodes.build_quoted(col.abs),
|
|
366
|
+
Arel::Nodes.build_quoted('FM'+nines_before+'"'+comma+'"V'+nines_after)
|
|
367
|
+
])])
|
|
368
|
+
end
|
|
462
369
|
|
|
463
|
-
repeated_char =
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
Arel
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
)
|
|
473
|
-
.else('')
|
|
474
|
-
end
|
|
475
|
-
before = !o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
|
|
476
|
-
middle = o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
|
|
370
|
+
repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
|
|
371
|
+
when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
|
|
372
|
+
then(Arel::Nodes.build_quoted(
|
|
373
|
+
o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
|
|
374
|
+
).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
|
|
375
|
+
).
|
|
376
|
+
else('')
|
|
377
|
+
before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
|
378
|
+
middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
|
477
379
|
after = o.flags.include?('-') ? repeated_char : ''
|
|
478
380
|
full_number = ArelExtensions::Nodes::Concat.new([
|
|
479
381
|
before,
|
|
@@ -482,29 +384,31 @@ module ArelExtensions
|
|
|
482
384
|
number,
|
|
483
385
|
after
|
|
484
386
|
])
|
|
485
|
-
collector = visit ArelExtensions::Nodes::Concat.new([Arel.
|
|
387
|
+
collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
|
|
486
388
|
collector
|
|
487
389
|
end
|
|
488
390
|
|
|
489
|
-
|
|
490
|
-
|
|
391
|
+
|
|
392
|
+
alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
|
|
393
|
+
def visit_Arel_Nodes_SelectStatement o, collector
|
|
394
|
+
|
|
491
395
|
if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
|
|
492
396
|
o = o.dup
|
|
493
397
|
o.orders = []
|
|
494
398
|
end
|
|
495
|
-
old_visit_Arel_Nodes_SelectStatement(o,
|
|
399
|
+
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
|
496
400
|
end
|
|
497
401
|
|
|
498
|
-
|
|
499
|
-
def visit_Arel_Nodes_TableAlias
|
|
402
|
+
alias_method :old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias
|
|
403
|
+
def visit_Arel_Nodes_TableAlias o, collector
|
|
500
404
|
if o.name.length > 63
|
|
501
405
|
o = Arel::Table.new(o.table_name).alias(Arel.shorten(o.name))
|
|
502
406
|
end
|
|
503
|
-
old_visit_Arel_Nodes_TableAlias(o,
|
|
407
|
+
old_visit_Arel_Nodes_TableAlias(o,collector)
|
|
504
408
|
end
|
|
505
409
|
|
|
506
|
-
|
|
507
|
-
def visit_Arel_Attributes_Attribute
|
|
410
|
+
alias_method :old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute
|
|
411
|
+
def visit_Arel_Attributes_Attribute o, collector
|
|
508
412
|
join_name = o.relation.table_alias || o.relation.name
|
|
509
413
|
if join_name.length > 63
|
|
510
414
|
join_name = Arel.shorten(join_name)
|
|
@@ -512,73 +416,58 @@ module ArelExtensions
|
|
|
512
416
|
collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
|
|
513
417
|
end
|
|
514
418
|
|
|
515
|
-
def visit_ArelExtensions_Nodes_Std
|
|
516
|
-
collector << (o.unbiased_estimator ?
|
|
419
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
|
420
|
+
collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
|
|
517
421
|
visit o.left, collector
|
|
518
|
-
collector <<
|
|
519
|
-
visit_Aggregate_For_AggregateFunction o, collector
|
|
422
|
+
collector << ")"
|
|
520
423
|
collector
|
|
521
424
|
end
|
|
522
425
|
|
|
523
|
-
def visit_ArelExtensions_Nodes_Variance
|
|
524
|
-
collector << (o.unbiased_estimator ?
|
|
426
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
|
427
|
+
collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
|
|
525
428
|
visit o.left, collector
|
|
526
|
-
collector <<
|
|
527
|
-
visit_Aggregate_For_AggregateFunction o, collector
|
|
429
|
+
collector << ")"
|
|
528
430
|
collector
|
|
529
431
|
end
|
|
530
432
|
|
|
531
|
-
def visit_ArelExtensions_Nodes_Json
|
|
433
|
+
def visit_ArelExtensions_Nodes_Json o,collector
|
|
532
434
|
case o.dict
|
|
533
435
|
when Array
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
else
|
|
539
|
-
collector << 'to_jsonb(array['
|
|
540
|
-
o.dict.each.with_index do |v, i|
|
|
541
|
-
if i != 0
|
|
542
|
-
collector << COMMA
|
|
543
|
-
end
|
|
544
|
-
collector = visit v, collector
|
|
436
|
+
collector << 'to_jsonb(array['
|
|
437
|
+
o.dict.each.with_index do |v,i|
|
|
438
|
+
if i != 0
|
|
439
|
+
collector << Arel::Visitors::MySQL::COMMA
|
|
545
440
|
end
|
|
546
|
-
collector
|
|
441
|
+
collector = visit v, collector
|
|
547
442
|
end
|
|
443
|
+
collector << '])'
|
|
548
444
|
when Hash
|
|
549
445
|
collector << 'jsonb_build_object('
|
|
550
|
-
o.dict.each.with_index do |(k,
|
|
446
|
+
o.dict.each.with_index do |(k,v),i|
|
|
551
447
|
if i != 0
|
|
552
|
-
collector << COMMA
|
|
448
|
+
collector << Arel::Visitors::MySQL::COMMA
|
|
553
449
|
end
|
|
554
450
|
collector = visit k, collector
|
|
555
|
-
collector << COMMA
|
|
451
|
+
collector << Arel::Visitors::MySQL::COMMA
|
|
556
452
|
collector = visit v, collector
|
|
557
453
|
end
|
|
558
454
|
collector << ')'
|
|
559
|
-
when String,
|
|
560
|
-
collector = visit Arel.
|
|
455
|
+
when String,Numeric,TrueClass,FalseClass
|
|
456
|
+
collector = visit Arel::Nodes.build_quoted("#{o.dict}"), collector
|
|
561
457
|
collector << '::jsonb'
|
|
562
458
|
when NilClass
|
|
563
|
-
collector
|
|
459
|
+
collector << %Q['null'::jsonb]
|
|
460
|
+
when Arel::Attributes::Attribute
|
|
461
|
+
collector = visit o.dict.cast(:jsonb), collector
|
|
564
462
|
else
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
# `to_jsonb(NULL)` would raise a polymorphic-type error.
|
|
568
|
-
collector << %('null'::jsonb)
|
|
569
|
-
else
|
|
570
|
-
# `to_jsonb` rather than `::jsonb` so a non-JSON value (e.g. a text column) is
|
|
571
|
-
# encoded as a JSON string instead of rejected by the server.
|
|
572
|
-
collector << 'to_jsonb('
|
|
573
|
-
collector = visit o.dict, collector
|
|
574
|
-
collector << ')'
|
|
575
|
-
end
|
|
463
|
+
collector = visit o.dict, collector
|
|
464
|
+
collector << '::jsonb'
|
|
576
465
|
end
|
|
577
466
|
collector
|
|
578
467
|
end
|
|
579
468
|
|
|
580
|
-
def visit_ArelExtensions_Nodes_JsonMerge
|
|
581
|
-
o.expressions.each.with_index do |v,
|
|
469
|
+
def visit_ArelExtensions_Nodes_JsonMerge o,collector
|
|
470
|
+
o.expressions.each.with_index do |v,i|
|
|
582
471
|
if i != 0
|
|
583
472
|
collector << ' || '
|
|
584
473
|
end
|
|
@@ -587,29 +476,28 @@ module ArelExtensions
|
|
|
587
476
|
collector
|
|
588
477
|
end
|
|
589
478
|
|
|
590
|
-
def visit_ArelExtensions_Nodes_JsonGet
|
|
479
|
+
def visit_ArelExtensions_Nodes_JsonGet o,collector
|
|
591
480
|
collector = visit o.dict, collector
|
|
592
|
-
collector << '
|
|
593
|
-
visit o.key, collector
|
|
481
|
+
collector << ' -> '
|
|
482
|
+
collector = visit o.key, collector
|
|
483
|
+
collector
|
|
594
484
|
end
|
|
595
485
|
|
|
596
|
-
def visit_ArelExtensions_Nodes_JsonSet
|
|
486
|
+
def visit_ArelExtensions_Nodes_JsonSet o,collector
|
|
597
487
|
collector << 'jsonb_set('
|
|
598
488
|
collector = visit o.dict, collector
|
|
599
|
-
collector << COMMA
|
|
489
|
+
collector << Arel::Visitors::MySQL::COMMA
|
|
600
490
|
collector << 'array['
|
|
601
491
|
collector = visit o.key, collector
|
|
602
492
|
collector << ']'
|
|
603
|
-
collector << COMMA
|
|
604
|
-
collector << 'COALESCE('
|
|
493
|
+
collector << Arel::Visitors::MySQL::COMMA
|
|
605
494
|
collector = visit o.value, collector
|
|
606
|
-
collector <<
|
|
607
|
-
collector << COMMA
|
|
495
|
+
collector << Arel::Visitors::MySQL::COMMA
|
|
608
496
|
collector << 'true)'
|
|
609
497
|
collector
|
|
610
498
|
end
|
|
611
499
|
|
|
612
|
-
def visit_ArelExtensions_Nodes_JsonGroup
|
|
500
|
+
def visit_ArelExtensions_Nodes_JsonGroup o, collector
|
|
613
501
|
if o.as_array
|
|
614
502
|
collector << 'jsonb_agg('
|
|
615
503
|
collector = visit o.dict, collector
|
|
@@ -617,13 +505,13 @@ module ArelExtensions
|
|
|
617
505
|
else
|
|
618
506
|
case o.dict
|
|
619
507
|
when Hash
|
|
620
|
-
o.dict.each.with_index do |(k,
|
|
508
|
+
o.dict.each.with_index do |(k,v),i|
|
|
621
509
|
if i != 0
|
|
622
510
|
collector << ' || '
|
|
623
511
|
end
|
|
624
512
|
collector << 'jsonb_object_agg('
|
|
625
513
|
collector = visit k, collector
|
|
626
|
-
collector << COMMA
|
|
514
|
+
collector << Arel::Visitors::MySQL::COMMA
|
|
627
515
|
collector = visit v, collector
|
|
628
516
|
collector << ')'
|
|
629
517
|
end
|
|
@@ -635,6 +523,7 @@ module ArelExtensions
|
|
|
635
523
|
end
|
|
636
524
|
collector
|
|
637
525
|
end
|
|
526
|
+
|
|
638
527
|
end
|
|
639
528
|
end
|
|
640
529
|
end
|