arel_extensions 1.6.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 -7
- data/.rubocop.yml +3 -67
- 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 +91 -258
- data/Rakefile +30 -48
- data/TODO +1 -0
- data/appveyor.yml +22 -60
- data/arel_extensions.gemspec +14 -13
- 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 +14 -14
- data/gemfiles/rails5_2.gemfile +14 -16
- 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 -7
- data/lib/arel_extensions/boolean_functions.rb +14 -53
- data/lib/arel_extensions/common_sql_functions.rb +17 -16
- data/lib/arel_extensions/comparators.rb +28 -29
- data/lib/arel_extensions/date_duration.rb +13 -17
- data/lib/arel_extensions/insert_manager.rb +15 -18
- data/lib/arel_extensions/math.rb +53 -55
- data/lib/arel_extensions/math_functions.rb +39 -46
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +2 -1
- data/lib/arel_extensions/nodes/case.rb +19 -20
- data/lib/arel_extensions/nodes/cast.rb +8 -10
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/coalesce.rb +4 -3
- data/lib/arel_extensions/nodes/collate.rb +10 -9
- data/lib/arel_extensions/nodes/concat.rb +18 -9
- data/lib/arel_extensions/nodes/date_diff.rb +26 -42
- data/lib/arel_extensions/nodes/duration.rb +3 -0
- 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 +37 -46
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +39 -52
- data/lib/arel_extensions/nodes/length.rb +0 -5
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +2 -1
- 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 +1 -0
- data/lib/arel_extensions/nodes/repeat.rb +5 -3
- data/lib/arel_extensions/nodes/replace.rb +8 -16
- data/lib/arel_extensions/nodes/round.rb +6 -5
- 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 -8
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +6 -4
- data/lib/arel_extensions/nodes/union.rb +8 -5
- data/lib/arel_extensions/nodes/union_all.rb +7 -4
- data/lib/arel_extensions/nodes/wday.rb +4 -0
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +5 -19
- data/lib/arel_extensions/predications.rb +44 -45
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +35 -91
- data/lib/arel_extensions/tasks.rb +6 -6
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
- data/lib/arel_extensions/visitors/mssql.rb +194 -440
- data/lib/arel_extensions/visitors/mysql.rb +212 -368
- data/lib/arel_extensions/visitors/oracle.rb +179 -236
- data/lib/arel_extensions/visitors/oracle12.rb +31 -18
- data/lib/arel_extensions/visitors/postgresql.rb +173 -271
- data/lib/arel_extensions/visitors/sqlite.rb +127 -157
- data/lib/arel_extensions/visitors/to_sql.rb +238 -300
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +31 -235
- data/test/database.yml +10 -20
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +118 -121
- 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 +370 -773
- 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 +38 -52
- 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 -18
- data/NEWS.md +0 -116
- 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 -29
- data/gemfiles/rails6.gemfile +0 -34
- data/gemfiles/rails6_1.gemfile +0 -42
- data/gemfiles/rails7.gemfile +0 -42
- data/gemfiles/rails7_1.gemfile +0 -41
- data/gemfiles/rails7_2.gemfile +0 -41
- data/gemfiles/rails8.gemfile +0 -40
- data/gemfiles/rails8_1.gemfile +0 -41
- data/gemspecs/arel_extensions-v1.gemspec +0 -27
- data/gemspecs/arel_extensions-v2.gemspec +0 -27
- 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 -3
- data/version_v2.rb +0 -3
|
@@ -1,383 +1,324 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
2
|
module Visitors
|
|
3
|
-
|
|
4
|
-
COMMA =
|
|
5
|
-
|
|
6
|
-
# Escape properly the string expression expr.
|
|
7
|
-
# Take care of escaping.
|
|
8
|
-
def make_json_string expr
|
|
9
|
-
Arel.quoted('"') \
|
|
10
|
-
+ expr
|
|
11
|
-
.coalesce('')
|
|
12
|
-
.replace('\\', '\\\\')
|
|
13
|
-
.replace('"', '\"')
|
|
14
|
-
.replace("\b", '\b')
|
|
15
|
-
.replace("\f", '\f')
|
|
16
|
-
.replace("\n", '\n')
|
|
17
|
-
.replace("\r", '\r')
|
|
18
|
-
.replace("\t", '\t') \
|
|
19
|
-
+ '"'
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def make_json_null
|
|
23
|
-
Arel.quoted('null')
|
|
24
|
-
end
|
|
3
|
+
Arel::Visitors::ToSql.class_eval do
|
|
4
|
+
Arel::Visitors::ToSql::COMMA = ", "
|
|
25
5
|
|
|
26
6
|
# Math Functions
|
|
27
7
|
def visit_ArelExtensions_Nodes_Abs o, collector
|
|
28
|
-
collector <<
|
|
8
|
+
collector << "ABS("
|
|
29
9
|
o.expressions.each_with_index { |arg, i|
|
|
30
|
-
collector << COMMA
|
|
10
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
31
11
|
collector = visit arg, collector
|
|
32
12
|
}
|
|
33
|
-
collector <<
|
|
13
|
+
collector << ")"
|
|
34
14
|
collector
|
|
35
15
|
end
|
|
36
16
|
|
|
37
17
|
def visit_ArelExtensions_Nodes_Ceil o, collector
|
|
38
|
-
collector <<
|
|
18
|
+
collector << "CEIL("
|
|
39
19
|
o.expressions.each_with_index { |arg, i|
|
|
40
|
-
collector << COMMA
|
|
20
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
41
21
|
collector = visit arg, collector
|
|
42
22
|
}
|
|
43
|
-
collector <<
|
|
23
|
+
collector << ")"
|
|
44
24
|
collector
|
|
45
25
|
end
|
|
46
26
|
|
|
47
27
|
def visit_ArelExtensions_Nodes_Floor o, collector
|
|
48
|
-
collector <<
|
|
28
|
+
collector << "FLOOR("
|
|
49
29
|
o.expressions.each_with_index { |arg, i|
|
|
50
|
-
collector << COMMA
|
|
30
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
51
31
|
collector = visit arg, collector
|
|
52
32
|
}
|
|
53
|
-
collector <<
|
|
33
|
+
collector << ")"
|
|
54
34
|
collector
|
|
55
35
|
end
|
|
56
36
|
|
|
57
37
|
def visit_ArelExtensions_Nodes_Rand o, collector
|
|
58
|
-
collector <<
|
|
38
|
+
collector << "RAND("
|
|
59
39
|
o.expressions.each_with_index { |arg, i|
|
|
60
|
-
collector << COMMA
|
|
40
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
61
41
|
collector = visit arg, collector
|
|
62
42
|
}
|
|
63
|
-
collector <<
|
|
43
|
+
collector << ")"
|
|
64
44
|
collector
|
|
65
45
|
end
|
|
66
46
|
|
|
67
47
|
def visit_ArelExtensions_Nodes_Round o, collector
|
|
68
|
-
collector <<
|
|
48
|
+
collector << "ROUND("
|
|
69
49
|
o.expressions.each_with_index { |arg, i|
|
|
70
|
-
collector << COMMA
|
|
50
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
71
51
|
collector = visit arg, collector
|
|
72
52
|
}
|
|
73
|
-
collector <<
|
|
53
|
+
collector << ")"
|
|
74
54
|
collector
|
|
75
55
|
end
|
|
76
|
-
|
|
56
|
+
|
|
77
57
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
|
78
|
-
collector <<
|
|
58
|
+
collector << "LOG10("
|
|
79
59
|
collector = visit o.left, collector
|
|
80
|
-
collector <<
|
|
60
|
+
collector << ")"
|
|
81
61
|
collector
|
|
82
62
|
end
|
|
83
|
-
|
|
63
|
+
|
|
84
64
|
def visit_ArelExtensions_Nodes_Power o, collector
|
|
85
|
-
collector <<
|
|
65
|
+
collector << "POW("
|
|
86
66
|
o.expressions.each_with_index { |arg, i|
|
|
87
|
-
collector << COMMA
|
|
67
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
88
68
|
collector = visit arg, collector
|
|
89
69
|
}
|
|
90
|
-
collector <<
|
|
91
|
-
collector
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def visit_ArelExtensions_Nodes_Sum o, collector
|
|
95
|
-
collector << 'SUM('
|
|
96
|
-
collector = visit o.expr, collector
|
|
97
|
-
collector << ')'
|
|
70
|
+
collector << ")"
|
|
98
71
|
collector
|
|
99
72
|
end
|
|
100
73
|
|
|
101
74
|
# String functions
|
|
102
75
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
|
103
|
-
collector <<
|
|
104
|
-
|
|
105
|
-
collector << COMMA
|
|
76
|
+
collector << "CONCAT("
|
|
77
|
+
o.expressions.each_with_index { |arg, i|
|
|
78
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
106
79
|
collector = visit arg, collector
|
|
107
80
|
}
|
|
108
|
-
collector <<
|
|
81
|
+
collector << ")"
|
|
109
82
|
collector
|
|
110
83
|
end
|
|
111
84
|
|
|
112
85
|
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
|
113
|
-
collector <<
|
|
86
|
+
collector << "GROUP_CONCAT("
|
|
114
87
|
collector = visit o.left, collector
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
collector
|
|
118
|
-
collector = visit o.separator, collector
|
|
88
|
+
if o.right && o.right != 'NULL'
|
|
89
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
90
|
+
collector = visit o.right, collector
|
|
119
91
|
end
|
|
120
|
-
collector <<
|
|
92
|
+
collector << ")"
|
|
121
93
|
collector
|
|
122
94
|
end
|
|
123
95
|
|
|
124
96
|
def visit_ArelExtensions_Nodes_MD5 o, collector
|
|
125
|
-
collector <<
|
|
97
|
+
collector << "MD5("
|
|
126
98
|
collector = visit o.left, collector
|
|
127
|
-
collector <<
|
|
99
|
+
collector << ")"
|
|
128
100
|
collector
|
|
129
101
|
end
|
|
130
102
|
|
|
131
103
|
def visit_ArelExtensions_Nodes_Length o, collector
|
|
132
|
-
collector << "
|
|
104
|
+
collector << "LENGTH("
|
|
133
105
|
collector = visit o.left, collector
|
|
134
|
-
collector <<
|
|
106
|
+
collector << ")"
|
|
135
107
|
collector
|
|
136
108
|
end
|
|
137
109
|
|
|
138
110
|
def visit_ArelExtensions_Nodes_Locate o, collector
|
|
139
|
-
collector <<
|
|
111
|
+
collector << "LOCATE("
|
|
140
112
|
collector = visit o.right, collector
|
|
141
|
-
collector << COMMA
|
|
113
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
142
114
|
collector = visit o.left, collector
|
|
143
|
-
collector <<
|
|
115
|
+
collector << ")"
|
|
144
116
|
collector
|
|
145
117
|
end
|
|
146
118
|
|
|
147
119
|
def visit_ArelExtensions_Nodes_Substring o, collector
|
|
148
|
-
collector <<
|
|
120
|
+
collector << "SUBSTRING("
|
|
149
121
|
o.expressions.each_with_index { |arg, i|
|
|
150
|
-
collector << COMMA
|
|
122
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
151
123
|
collector = visit arg, collector
|
|
152
124
|
}
|
|
153
|
-
collector <<
|
|
125
|
+
collector << ")"
|
|
154
126
|
collector
|
|
155
127
|
end
|
|
156
128
|
|
|
157
129
|
def visit_ArelExtensions_Nodes_Replace o, collector
|
|
158
|
-
collector <<
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
collector << ')'
|
|
165
|
-
collector
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
def visit_ArelExtensions_Nodes_RegexpReplace o, collector
|
|
169
|
-
collector << 'REGEXP_REPLACE('
|
|
170
|
-
visit o.left, collector
|
|
171
|
-
collector << COMMA
|
|
172
|
-
visit Arel.quoted(o.pattern.to_s), collector
|
|
173
|
-
collector << COMMA
|
|
174
|
-
visit o.substitute, collector
|
|
175
|
-
collector << ')'
|
|
130
|
+
collector << "REPLACE("
|
|
131
|
+
o.expressions.each_with_index { |arg, i|
|
|
132
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
133
|
+
collector = visit arg, collector
|
|
134
|
+
}
|
|
135
|
+
collector << ")"
|
|
176
136
|
collector
|
|
177
137
|
end
|
|
178
|
-
|
|
138
|
+
|
|
179
139
|
def visit_ArelExtensions_Nodes_Repeat o, collector
|
|
180
|
-
collector <<
|
|
140
|
+
collector << "REPEAT("
|
|
181
141
|
o.expressions.each_with_index { |arg, i|
|
|
182
|
-
collector << COMMA
|
|
142
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
183
143
|
collector = visit arg, collector
|
|
184
144
|
}
|
|
185
|
-
collector <<
|
|
145
|
+
collector << ")"
|
|
186
146
|
collector
|
|
187
147
|
end
|
|
188
148
|
|
|
189
149
|
def visit_ArelExtensions_Nodes_FindInSet o, collector
|
|
190
|
-
collector <<
|
|
150
|
+
collector << "FIND_IN_SET("
|
|
191
151
|
o.expressions.each_with_index { |arg, i|
|
|
192
|
-
collector << COMMA
|
|
152
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
193
153
|
collector = visit arg, collector
|
|
194
154
|
}
|
|
195
|
-
collector <<
|
|
155
|
+
collector << ")"
|
|
196
156
|
collector
|
|
197
157
|
end
|
|
198
158
|
|
|
199
159
|
def visit_ArelExtensions_Nodes_Soundex o, collector
|
|
200
|
-
collector <<
|
|
160
|
+
collector << "SOUNDEX("
|
|
201
161
|
o.expressions.each_with_index { |arg, i|
|
|
202
|
-
collector << COMMA
|
|
162
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
203
163
|
collector = visit arg, collector
|
|
204
164
|
}
|
|
205
|
-
collector <<
|
|
165
|
+
collector << ")"
|
|
206
166
|
collector
|
|
207
167
|
end
|
|
208
168
|
|
|
209
169
|
def visit_ArelExtensions_Nodes_Downcase o, collector
|
|
210
|
-
collector <<
|
|
170
|
+
collector << "LOWER("
|
|
211
171
|
o.expressions.each_with_index { |arg, i|
|
|
212
|
-
collector << COMMA
|
|
172
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
213
173
|
collector = visit arg, collector
|
|
214
174
|
}
|
|
215
|
-
collector <<
|
|
175
|
+
collector << ")"
|
|
216
176
|
collector
|
|
217
177
|
end
|
|
218
178
|
|
|
219
179
|
def visit_ArelExtensions_Nodes_Upcase o, collector
|
|
220
|
-
collector <<
|
|
180
|
+
collector << "UPPER("
|
|
221
181
|
o.expressions.each_with_index { |arg, i|
|
|
222
|
-
collector << COMMA
|
|
182
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
223
183
|
collector = visit arg, collector
|
|
224
184
|
}
|
|
225
|
-
collector <<
|
|
185
|
+
collector << ")"
|
|
226
186
|
collector
|
|
227
187
|
end
|
|
228
188
|
|
|
229
189
|
def visit_ArelExtensions_Nodes_Trim o, collector
|
|
230
|
-
collector <<
|
|
190
|
+
collector << "TRIM("
|
|
231
191
|
o.expressions.each_with_index { |arg, i|
|
|
232
|
-
collector << COMMA
|
|
192
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
233
193
|
collector = visit arg, collector
|
|
234
194
|
}
|
|
235
|
-
collector <<
|
|
195
|
+
collector << ")"
|
|
236
196
|
collector
|
|
237
197
|
end
|
|
238
198
|
|
|
239
199
|
def visit_ArelExtensions_Nodes_Ltrim o, collector
|
|
240
|
-
collector <<
|
|
200
|
+
collector << "LTRIM("
|
|
241
201
|
o.expressions.each_with_index { |arg, i|
|
|
242
|
-
collector << COMMA
|
|
202
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
243
203
|
collector = visit arg, collector
|
|
244
204
|
}
|
|
245
|
-
collector <<
|
|
205
|
+
collector << ")"
|
|
246
206
|
collector
|
|
247
207
|
end
|
|
248
208
|
|
|
249
209
|
def visit_ArelExtensions_Nodes_Rtrim o, collector
|
|
250
|
-
collector <<
|
|
210
|
+
collector << "RTRIM("
|
|
251
211
|
o.expressions.each_with_index { |arg, i|
|
|
252
|
-
collector << COMMA
|
|
212
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
253
213
|
collector = visit arg, collector
|
|
254
214
|
}
|
|
255
|
-
collector <<
|
|
215
|
+
collector << ")"
|
|
256
216
|
collector
|
|
257
217
|
end
|
|
258
218
|
|
|
259
219
|
def visit_ArelExtensions_Nodes_Blank o, collector
|
|
260
|
-
|
|
220
|
+
#visit o.left.coalesce('').trim.length.eq(0), collector
|
|
261
221
|
collector << 'LENGTH(TRIM(COALESCE('
|
|
262
222
|
collector = visit o.expr, collector
|
|
263
|
-
collector << COMMA
|
|
264
|
-
collector = visit Arel.
|
|
265
|
-
collector <<
|
|
223
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
224
|
+
collector = visit Arel::Nodes.build_quoted(''), collector
|
|
225
|
+
collector << "))) = 0"
|
|
266
226
|
collector
|
|
267
227
|
end
|
|
268
228
|
|
|
229
|
+
|
|
269
230
|
def visit_ArelExtensions_Nodes_NotBlank o, collector
|
|
270
|
-
|
|
231
|
+
#visit o.left.coalesce('').trim.length.gt(0), collector
|
|
271
232
|
collector << 'LENGTH(TRIM(COALESCE('
|
|
272
233
|
collector = visit o.expr, collector
|
|
273
|
-
collector << COMMA
|
|
274
|
-
collector = visit Arel.
|
|
275
|
-
collector <<
|
|
234
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
235
|
+
collector = visit Arel::Nodes.build_quoted(''), collector
|
|
236
|
+
collector << "))) > 0"
|
|
276
237
|
collector
|
|
277
238
|
end
|
|
278
239
|
|
|
279
240
|
def visit_ArelExtensions_Nodes_Format o, collector
|
|
280
241
|
case o.col_type
|
|
281
242
|
when :date, :datetime, :time
|
|
282
|
-
collector <<
|
|
243
|
+
collector << "STRFTIME("
|
|
283
244
|
collector = visit o.right, collector
|
|
284
|
-
collector << COMMA
|
|
245
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
285
246
|
collector = visit o.left, collector
|
|
286
|
-
collector <<
|
|
247
|
+
collector << ")"
|
|
287
248
|
when :integer, :float, :decimal
|
|
288
|
-
collector <<
|
|
249
|
+
collector << "FORMAT("
|
|
289
250
|
collector = visit o.left, collector
|
|
290
|
-
collector << COMMA
|
|
251
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
291
252
|
collector = visit o.right, collector
|
|
292
|
-
collector <<
|
|
253
|
+
collector << ")"
|
|
293
254
|
else
|
|
294
255
|
collector = visit o.left, collector
|
|
295
256
|
end
|
|
296
257
|
collector
|
|
297
258
|
end
|
|
298
259
|
|
|
299
|
-
|
|
300
|
-
case o.col_type
|
|
301
|
-
when :date, :datetime, :time
|
|
302
|
-
collector << 'STRFTIME('
|
|
303
|
-
collector = visit o.right, collector
|
|
304
|
-
collector << COMMA
|
|
305
|
-
collector = visit o.left, collector
|
|
306
|
-
collector << ')'
|
|
307
|
-
when :integer, :float, :decimal
|
|
308
|
-
collector << 'FORMAT('
|
|
309
|
-
collector = visit o.left, collector
|
|
310
|
-
collector << COMMA
|
|
311
|
-
collector = visit o.right, collector
|
|
312
|
-
collector << ')'
|
|
313
|
-
else
|
|
314
|
-
collector = visit o.left, collector
|
|
315
|
-
end
|
|
316
|
-
collector
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
# comparators
|
|
260
|
+
#comparators
|
|
320
261
|
|
|
321
262
|
def visit_ArelExtensions_Nodes_Cast o, collector
|
|
322
|
-
|
|
323
|
-
case o.as_attr
|
|
324
|
-
when :binary then 'binary'
|
|
325
|
-
when :datetime then 'datetime'
|
|
326
|
-
when :decimal, :float, :number then 'float'
|
|
327
|
-
when :int then 'int'
|
|
328
|
-
when :string then 'char'
|
|
329
|
-
when :text, :ntext then 'text'
|
|
330
|
-
when :time then 'time'
|
|
331
|
-
else o.as_attr.to_s
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
collector << 'CAST('
|
|
263
|
+
collector << "CAST("
|
|
335
264
|
collector = visit o.left, collector
|
|
336
|
-
collector <<
|
|
337
|
-
|
|
338
|
-
|
|
265
|
+
collector << " AS "
|
|
266
|
+
case o.as_attr
|
|
267
|
+
when :string
|
|
268
|
+
as_attr = Arel::Nodes::SqlLiteral.new('char')
|
|
269
|
+
when :int
|
|
270
|
+
as_attr = Arel::Nodes::SqlLiteral.new('int')
|
|
271
|
+
when :decimal, :float, :number
|
|
272
|
+
as_attr = Arel::Nodes::SqlLiteral.new('float')
|
|
273
|
+
when :datetime
|
|
274
|
+
as_attr = Arel::Nodes::SqlLiteral.new('datetime')
|
|
275
|
+
when :time
|
|
276
|
+
as_attr = Arel::Nodes::SqlLiteral.new('time')
|
|
277
|
+
when :binary
|
|
278
|
+
as_attr = Arel::Nodes::SqlLiteral.new('binary')
|
|
279
|
+
else
|
|
280
|
+
as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
|
|
281
|
+
end
|
|
282
|
+
collector = visit as_attr, collector
|
|
283
|
+
collector << ")"
|
|
339
284
|
collector
|
|
340
285
|
end
|
|
341
286
|
|
|
342
287
|
def visit_ArelExtensions_Nodes_Coalesce o, collector
|
|
343
|
-
collector <<
|
|
288
|
+
collector << "COALESCE("
|
|
344
289
|
o.expressions.each_with_index { |arg, i|
|
|
345
|
-
collector << COMMA
|
|
290
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
346
291
|
collector = visit arg, collector
|
|
347
292
|
}
|
|
348
|
-
collector <<
|
|
293
|
+
collector << ")"
|
|
349
294
|
collector
|
|
350
295
|
end
|
|
351
296
|
|
|
352
297
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
|
353
|
-
collector <<
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
end
|
|
298
|
+
collector << if o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time
|
|
299
|
+
'TIMEDIFF('
|
|
300
|
+
else
|
|
301
|
+
'DATEDIFF('
|
|
302
|
+
end
|
|
359
303
|
collector = visit o.left, collector
|
|
360
|
-
collector << COMMA
|
|
304
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
361
305
|
collector = visit o.right, collector
|
|
362
|
-
collector <<
|
|
306
|
+
collector << ")"
|
|
363
307
|
collector
|
|
364
308
|
end
|
|
365
|
-
|
|
309
|
+
|
|
366
310
|
def visit_ArelExtensions_Nodes_DateSub o, collector
|
|
367
|
-
collector <<
|
|
311
|
+
collector << "DATE_SUB("
|
|
368
312
|
collector = visit o.left, collector
|
|
369
|
-
collector << COMMA
|
|
313
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
370
314
|
collector = visit o.right, collector
|
|
371
|
-
collector <<
|
|
315
|
+
collector << ")"
|
|
372
316
|
collector
|
|
373
317
|
end
|
|
374
318
|
|
|
375
|
-
|
|
319
|
+
# override
|
|
376
320
|
remove_method(:visit_Arel_Nodes_As) rescue nil # if Arel::Visitors::ToSql.method_defined?(:visit_Arel_Nodes_As)
|
|
377
321
|
def visit_Arel_Nodes_As o, collector
|
|
378
|
-
if o.left.respond_to?(:alias)
|
|
379
|
-
o.left.alias = nil
|
|
380
|
-
end
|
|
381
322
|
if o.left.is_a?(Arel::Nodes::Binary)
|
|
382
323
|
collector << '('
|
|
383
324
|
collector = visit o.left, collector
|
|
@@ -385,7 +326,7 @@ module ArelExtensions
|
|
|
385
326
|
else
|
|
386
327
|
collector = visit o.left, collector
|
|
387
328
|
end
|
|
388
|
-
collector <<
|
|
329
|
+
collector << " AS "
|
|
389
330
|
collector = visit o.right, collector
|
|
390
331
|
collector
|
|
391
332
|
end
|
|
@@ -393,7 +334,7 @@ module ArelExtensions
|
|
|
393
334
|
remove_method(:visit_Arel_Nodes_Regexp) rescue nil # if Arel::Visitors::ToSql.method_defined?(:visit_Arel_Nodes_Regexp)
|
|
394
335
|
def visit_Arel_Nodes_Regexp o, collector
|
|
395
336
|
collector = visit o.left, collector
|
|
396
|
-
collector <<
|
|
337
|
+
collector << " REGEXP "
|
|
397
338
|
collector = visit o.right, collector
|
|
398
339
|
collector
|
|
399
340
|
end
|
|
@@ -401,7 +342,7 @@ module ArelExtensions
|
|
|
401
342
|
remove_method(:visit_Arel_Nodes_NotRegexp) rescue nil # if Arel::Visitors::ToSql.method_defined?(:visit_Arel_Nodes_NotRegexp)
|
|
402
343
|
def visit_Arel_Nodes_NotRegexp o, collector
|
|
403
344
|
collector = visit o.left, collector
|
|
404
|
-
collector <<
|
|
345
|
+
collector << " NOT REGEXP "
|
|
405
346
|
collector = visit o.right, collector
|
|
406
347
|
collector
|
|
407
348
|
end
|
|
@@ -426,59 +367,60 @@ module ArelExtensions
|
|
|
426
367
|
end
|
|
427
368
|
|
|
428
369
|
def visit_ArelExtensions_Nodes_IsNull o, collector
|
|
429
|
-
collector <<
|
|
370
|
+
collector << "ISNULL("
|
|
430
371
|
collector = visit o.expr, collector
|
|
431
|
-
collector <<
|
|
372
|
+
collector << ")"
|
|
432
373
|
collector
|
|
433
374
|
end
|
|
434
375
|
|
|
435
376
|
def visit_ArelExtensions_Nodes_IsNotNull o, collector
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
377
|
+
collector << "NOT ISNULL("
|
|
378
|
+
collector = visit o.expr, collector
|
|
379
|
+
collector << ")"
|
|
380
|
+
collector
|
|
440
381
|
end
|
|
441
382
|
|
|
442
383
|
def visit_ArelExtensions_Nodes_Then o, collector
|
|
443
|
-
collector <<
|
|
384
|
+
collector << "CASE WHEN ("
|
|
444
385
|
collector = visit o.left, collector
|
|
445
|
-
collector <<
|
|
386
|
+
collector << ") THEN "
|
|
446
387
|
collector = visit o.right, collector
|
|
447
|
-
if o.expressions[2]
|
|
448
|
-
collector <<
|
|
388
|
+
if o.expressions[2]
|
|
389
|
+
collector << " ELSE "
|
|
449
390
|
collector = visit o.expressions[2], collector
|
|
450
391
|
end
|
|
451
|
-
collector <<
|
|
392
|
+
collector << " END"
|
|
452
393
|
collector
|
|
453
394
|
end
|
|
454
395
|
|
|
455
396
|
# Date operations
|
|
456
397
|
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
|
457
|
-
collector <<
|
|
398
|
+
collector << "DATE_ADD("
|
|
458
399
|
collector = visit o.left, collector
|
|
459
|
-
collector << COMMA
|
|
400
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
460
401
|
collector = visit o.sqlite_value(o.right), collector
|
|
461
402
|
collector << ')'
|
|
462
403
|
collector
|
|
463
404
|
end
|
|
464
405
|
|
|
465
|
-
if
|
|
406
|
+
if Arel::VERSION.to_i < 7
|
|
466
407
|
def visit_ArelExtensions_InsertManager_BulkValues o, collector
|
|
467
408
|
collector << 'VALUES '
|
|
468
409
|
row_nb = o.left.length
|
|
469
410
|
o.left.each_with_index do |row, idx|
|
|
470
411
|
collector << '('
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
412
|
+
v = Arel::Nodes::Values.new(row, o.cols)
|
|
413
|
+
len = v.expressions.length - 1
|
|
414
|
+
v.expressions.zip(v.columns).each_with_index { |(value, attr), i|
|
|
415
|
+
case value
|
|
416
|
+
when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
|
|
417
|
+
collector = visit value, collector
|
|
418
|
+
else
|
|
419
|
+
collector << quote(value, attr && column_for(attr)).to_s
|
|
420
|
+
end
|
|
421
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == len
|
|
480
422
|
}
|
|
481
|
-
collector << (idx == row_nb
|
|
423
|
+
collector << (idx == row_nb-1 ? ')' : '), ')
|
|
482
424
|
end
|
|
483
425
|
collector
|
|
484
426
|
end
|
|
@@ -489,18 +431,17 @@ module ArelExtensions
|
|
|
489
431
|
o.left.each_with_index do |row, idx|
|
|
490
432
|
collector << '('
|
|
491
433
|
len = row.length - 1
|
|
492
|
-
row.
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
collector << COMMA unless i == len
|
|
434
|
+
row.each_with_index { |value, i|
|
|
435
|
+
attr = o.cols[i]
|
|
436
|
+
case value
|
|
437
|
+
when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
|
|
438
|
+
collector = visit value, collector
|
|
439
|
+
else
|
|
440
|
+
collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
|
|
441
|
+
end
|
|
442
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == len
|
|
502
443
|
}
|
|
503
|
-
collector << (idx == row_nb
|
|
444
|
+
collector << (idx == row_nb-1 ? ')' : '), ')
|
|
504
445
|
end
|
|
505
446
|
collector
|
|
506
447
|
end
|
|
@@ -508,88 +449,86 @@ module ArelExtensions
|
|
|
508
449
|
|
|
509
450
|
def visit_ArelExtensions_Nodes_Union o, collector
|
|
510
451
|
collector = visit o.left, collector
|
|
511
|
-
collector <<
|
|
452
|
+
collector << " UNION "
|
|
512
453
|
collector = visit o.right, collector
|
|
513
454
|
collector
|
|
514
455
|
end
|
|
515
|
-
|
|
456
|
+
|
|
516
457
|
def visit_ArelExtensions_Nodes_UnionAll o, collector
|
|
517
458
|
collector = visit o.left, collector
|
|
518
|
-
collector <<
|
|
459
|
+
collector << " UNION ALL "
|
|
519
460
|
collector = visit o.right, collector
|
|
520
461
|
collector
|
|
521
462
|
end
|
|
522
463
|
|
|
523
464
|
def visit_ArelExtensions_Nodes_Case o, collector
|
|
524
|
-
collector <<
|
|
465
|
+
collector << "CASE "
|
|
525
466
|
if o.case
|
|
526
467
|
visit o.case, collector
|
|
527
|
-
collector <<
|
|
468
|
+
collector << " "
|
|
528
469
|
end
|
|
529
470
|
o.conditions.each do |condition|
|
|
530
471
|
visit condition, collector
|
|
531
|
-
collector <<
|
|
472
|
+
collector << " "
|
|
532
473
|
end
|
|
533
474
|
if o.default
|
|
534
475
|
visit o.default, collector
|
|
535
|
-
collector <<
|
|
476
|
+
collector << " "
|
|
536
477
|
end
|
|
537
|
-
collector <<
|
|
478
|
+
collector << "END"
|
|
538
479
|
end
|
|
539
480
|
|
|
540
481
|
def visit_ArelExtensions_Nodes_Case_When o, collector
|
|
541
|
-
collector <<
|
|
542
|
-
visit Arel.
|
|
543
|
-
collector <<
|
|
544
|
-
visit Arel.
|
|
482
|
+
collector << "WHEN "
|
|
483
|
+
visit Arel::Nodes.build_quoted(o.left), collector
|
|
484
|
+
collector << " THEN "
|
|
485
|
+
visit Arel::Nodes.build_quoted(o.right), collector
|
|
545
486
|
end
|
|
546
487
|
|
|
547
488
|
def visit_ArelExtensions_Nodes_Case_Else o, collector
|
|
548
|
-
collector <<
|
|
549
|
-
visit Arel.
|
|
489
|
+
collector << "ELSE "
|
|
490
|
+
visit Arel::Nodes.build_quoted(o.expr), collector
|
|
550
491
|
end
|
|
551
492
|
|
|
552
|
-
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
|
493
|
+
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
|
553
494
|
visit o.left, collector
|
|
554
495
|
end
|
|
555
|
-
|
|
556
|
-
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
|
496
|
+
|
|
497
|
+
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
|
557
498
|
def visit_Arel_Nodes_LessThan o, collector
|
|
558
499
|
collector = visit o.left, collector
|
|
559
|
-
collector <<
|
|
500
|
+
collector << " < "
|
|
560
501
|
visit o.right, collector
|
|
561
502
|
end
|
|
562
|
-
|
|
563
|
-
def visit_ArelExtensions_Nodes_Std o, collector
|
|
564
|
-
collector <<
|
|
503
|
+
|
|
504
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
|
505
|
+
collector << "STD("
|
|
565
506
|
visit o.left, collector
|
|
566
|
-
collector <<
|
|
507
|
+
collector << ")"
|
|
567
508
|
collector
|
|
568
509
|
end
|
|
569
|
-
|
|
570
|
-
def visit_ArelExtensions_Nodes_Variance o, collector
|
|
571
|
-
collector <<
|
|
510
|
+
|
|
511
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
|
512
|
+
collector << "VARIANCE("
|
|
572
513
|
visit o.left, collector
|
|
573
|
-
collector <<
|
|
514
|
+
collector << ")"
|
|
574
515
|
collector
|
|
575
516
|
end
|
|
576
517
|
|
|
577
518
|
def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
|
|
578
|
-
collector <<
|
|
519
|
+
collector << "LEVENSHTEIN_DISTANCE("
|
|
579
520
|
collector = visit o.left, collector
|
|
580
|
-
collector << COMMA
|
|
521
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
581
522
|
collector = visit o.right, collector
|
|
582
523
|
collector << ')'
|
|
583
524
|
collector
|
|
584
525
|
end
|
|
585
526
|
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
alias_method(:old_visit_Arel_Nodes_And, :visit_Arel_Nodes_And) rescue nil
|
|
527
|
+
alias_method :old_visit_Arel_Nodes_And, :visit_Arel_Nodes_And
|
|
589
528
|
def visit_Arel_Nodes_And o, collector
|
|
590
529
|
case o.children.length
|
|
591
530
|
when 0
|
|
592
|
-
collector << '1
|
|
531
|
+
collector << '1=1' # but this should not happen
|
|
593
532
|
when 1
|
|
594
533
|
collector = visit o.children[0], collector
|
|
595
534
|
else
|
|
@@ -605,66 +544,63 @@ module ArelExtensions
|
|
|
605
544
|
collector
|
|
606
545
|
end
|
|
607
546
|
|
|
608
|
-
|
|
609
|
-
def visit_Arel_Nodes_Or o, collector
|
|
547
|
+
def visit_ArelExtensions_Nodes_Or o, collector
|
|
610
548
|
case o.children.length
|
|
611
549
|
when 0
|
|
612
|
-
collector << '1
|
|
550
|
+
collector << '0=1' # but this should not happen
|
|
613
551
|
when 1
|
|
614
552
|
collector = visit o.children[0], collector
|
|
615
553
|
else
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
554
|
+
collector << '('
|
|
555
|
+
o.children.each_with_index { |arg, i|
|
|
556
|
+
if i != 0
|
|
557
|
+
collector << ') OR ('
|
|
558
|
+
end
|
|
559
|
+
collector = visit arg, collector
|
|
560
|
+
}
|
|
561
|
+
collector << ')'
|
|
624
562
|
end
|
|
625
563
|
collector
|
|
626
564
|
end
|
|
627
565
|
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
s = v.format('%Y-%m-%dT%H:%M:%S')
|
|
637
|
-
Arel.when(s.is_null).then(make_json_null).else(make_json_string(s))
|
|
638
|
-
when :time
|
|
639
|
-
s = v.format('%H:%M:%S')
|
|
640
|
-
Arel.when(s.is_null).then(make_json_null).else(make_json_string(s))
|
|
641
|
-
when :nil
|
|
642
|
-
make_json_null
|
|
643
|
-
else
|
|
644
|
-
ArelExtensions::Nodes::Cast.new([v, :string]).coalesce(make_json_null)
|
|
645
|
-
end
|
|
566
|
+
alias_method :old_visit_Arel_Nodes_Or, :visit_Arel_Nodes_Or
|
|
567
|
+
def visit_Arel_Nodes_Or o, collector
|
|
568
|
+
collector << '('
|
|
569
|
+
collector = visit o.left, collector
|
|
570
|
+
collector << ') OR ('
|
|
571
|
+
collector = visit o.right, collector
|
|
572
|
+
collector << ')'
|
|
573
|
+
collector
|
|
646
574
|
end
|
|
647
575
|
|
|
648
|
-
def visit_ArelExtensions_Nodes_Json o,
|
|
576
|
+
def visit_ArelExtensions_Nodes_Json o,collector
|
|
649
577
|
case o.dict
|
|
650
578
|
when Array
|
|
651
|
-
res = Arel.
|
|
652
|
-
o.dict.each.with_index do |v,
|
|
579
|
+
res = Arel::Nodes.build_quoted('[')
|
|
580
|
+
o.dict.each.with_index do |v,i|
|
|
653
581
|
if i != 0
|
|
654
582
|
res += ', '
|
|
655
583
|
end
|
|
656
|
-
|
|
584
|
+
if (v.is_a?(Arel::Attributes::Attribute) && o.type_of_attribute(v) == :string) || (v.return_type == :string)
|
|
585
|
+
res = res + '"' + v + '"'
|
|
586
|
+
else
|
|
587
|
+
res += v
|
|
588
|
+
end
|
|
657
589
|
end
|
|
658
590
|
res += ']'
|
|
659
591
|
collector = visit res, collector
|
|
660
592
|
when Hash
|
|
661
|
-
res = Arel.
|
|
662
|
-
o.dict.each.with_index do |(k,
|
|
593
|
+
res = Arel::Nodes.build_quoted('{')
|
|
594
|
+
o.dict.each.with_index do |(k,v),i|
|
|
663
595
|
if i != 0
|
|
664
596
|
res += ', '
|
|
665
597
|
end
|
|
666
|
-
res +=
|
|
667
|
-
|
|
598
|
+
res += Arel::Nodes.build_quoted('"')+k + '": '
|
|
599
|
+
if (v.is_a?(Arel::Attributes::Attribute) && o.type_of_attribute(v) == :string) || (v.respond_to?(:return_type) && v.return_type == :string)
|
|
600
|
+
res = res + '"' + v + '"'
|
|
601
|
+
else
|
|
602
|
+
res += v
|
|
603
|
+
end
|
|
668
604
|
end
|
|
669
605
|
res += '}'
|
|
670
606
|
collector = visit res, collector
|
|
@@ -676,27 +612,29 @@ module ArelExtensions
|
|
|
676
612
|
|
|
677
613
|
def visit_ArelExtensions_Nodes_JsonGroup o, collector
|
|
678
614
|
if o.as_array
|
|
679
|
-
res =
|
|
680
|
-
Arel.quoted('[') \
|
|
681
|
-
+ (o.orders ? o.dict.group_concat(', ', order: Array(o.orders)) : o.dict.group_concat(', ')).coalesce('') \
|
|
682
|
-
+ ']'
|
|
615
|
+
res = Arel::Nodes.build_quoted('[') + (o.orders ? o.dict.group_concat(', ',o.orders) : o.dict.group_concat(', ')) + ']'
|
|
683
616
|
collector = visit res, collector
|
|
684
617
|
else
|
|
685
|
-
res = Arel.
|
|
618
|
+
res = Arel::Nodes.build_quoted('{')
|
|
686
619
|
orders = o.orders || o.dict.keys
|
|
687
|
-
o.dict.each.with_index do |(k,
|
|
620
|
+
o.dict.each.with_index do |(k,v),i|
|
|
688
621
|
if i != 0
|
|
689
622
|
res = res + ', '
|
|
690
623
|
end
|
|
691
|
-
kv =
|
|
692
|
-
|
|
693
|
-
|
|
624
|
+
kv = Arel::Nodes.build_quoted('"')+k + '": '
|
|
625
|
+
if (v.is_a?(Arel::Attributes::Attribute) && o.type_of_attribute(v) == :string) || (v.respond_to?(:return_type) && v.return_type == :string)
|
|
626
|
+
kv = kv + '"' + v + '"'
|
|
627
|
+
else
|
|
628
|
+
kv += v
|
|
629
|
+
end
|
|
630
|
+
res = res + kv.group_concat(', ',orders)
|
|
694
631
|
end
|
|
695
632
|
res = res + '}'
|
|
696
633
|
collector = visit res, collector
|
|
697
634
|
end
|
|
698
635
|
collector
|
|
699
636
|
end
|
|
637
|
+
|
|
700
638
|
end
|
|
701
639
|
end
|
|
702
640
|
end
|