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,53 +1,39 @@
|
|
|
1
|
-
#
|
|
1
|
+
#require 'oracle_visitor'
|
|
2
2
|
module ArelExtensions
|
|
3
3
|
module Visitors
|
|
4
|
-
|
|
4
|
+
Arel::Visitors::Oracle.class_eval do
|
|
5
|
+
|
|
5
6
|
SPECIAL_CHARS = {"\t" => 'CHR(9)', "\n" => 'CHR(10)', "\r" => 'CHR(13)'}
|
|
6
|
-
DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
|
|
7
|
-
DATE_FORMAT_DIRECTIVES = {
|
|
8
|
-
'%Y' => '
|
|
9
|
-
'%
|
|
10
|
-
'%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%a' => 'Dy', '%A' => 'Day', # day, weekday
|
|
7
|
+
Arel::Visitors::Oracle::DATE_MAPPING = {'d' => 'DAY', 'm' => 'MONTH', 'w' => 'IW', 'y' => 'YEAR', 'wd' => 'D', 'h' => 'HOUR', 'mn' => 'MINUTE', 's' => 'SECOND'}
|
|
8
|
+
Arel::Visitors::Oracle::DATE_FORMAT_DIRECTIVES = {
|
|
9
|
+
'%Y' => 'IYYY', '%C' => 'CC', '%y' => 'YY', '%m' => 'MM', '%B' => 'Month', '%^B' => 'MONTH', '%b' => 'Mon', '%^b' => 'MON',
|
|
10
|
+
'%d' => 'DD', '%e' => 'FMDD', '%j' => 'DDD', '%w' => '', '%A' => 'Day', # day, weekday
|
|
11
11
|
'%H' => 'HH24', '%k' => '', '%I' => 'HH', '%l' => '', '%P' => 'am', '%p' => 'AM', # hours
|
|
12
12
|
'%M' => 'MI', '%S' => 'SS', '%L' => 'MS', '%N' => 'US', '%z' => 'tz' # seconds, subseconds
|
|
13
13
|
}
|
|
14
|
-
NUMBER_COMMA_MAPPING = {'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', '}
|
|
15
|
-
|
|
16
|
-
def visit_ArelExtensions_Nodes_ByteSize(o, collector)
|
|
17
|
-
collector << 'LENGTHB('
|
|
18
|
-
collector = visit o.expr.coalesce(''), collector
|
|
19
|
-
collector << ')'
|
|
20
|
-
collector
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def visit_ArelExtensions_Nodes_CharLength(o, collector)
|
|
24
|
-
collector << 'LENGTH('
|
|
25
|
-
collector = visit o.expr.coalesce(''), collector
|
|
26
|
-
collector << ')'
|
|
27
|
-
collector
|
|
28
|
-
end
|
|
14
|
+
Arel::Visitors::Oracle::NUMBER_COMMA_MAPPING = { 'en_US' => '.,', 'fr_FR' => ',', 'sv_SE' => ', ' }
|
|
29
15
|
|
|
30
|
-
def visit_ArelExtensions_Nodes_Log10
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
16
|
+
def visit_ArelExtensions_Nodes_Log10 o, collector
|
|
17
|
+
collector << "LOG("
|
|
18
|
+
o.expressions.each_with_index { |arg, i|
|
|
19
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
20
|
+
collector = visit arg, collector
|
|
21
|
+
}
|
|
22
|
+
collector << ",10)"
|
|
23
|
+
collector
|
|
38
24
|
end
|
|
39
25
|
|
|
40
|
-
def visit_ArelExtensions_Nodes_Power
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
26
|
+
def visit_ArelExtensions_Nodes_Power o, collector
|
|
27
|
+
collector << "POWER("
|
|
28
|
+
o.expressions.each_with_index { |arg, i|
|
|
29
|
+
collector << Arel::Visitors::ToSql::COMMA unless i == 0
|
|
30
|
+
collector = visit arg, collector
|
|
31
|
+
}
|
|
32
|
+
collector << ")"
|
|
33
|
+
collector
|
|
48
34
|
end
|
|
49
35
|
|
|
50
|
-
def visit_ArelExtensions_Nodes_Concat
|
|
36
|
+
def visit_ArelExtensions_Nodes_Concat o, collector
|
|
51
37
|
collector << '('
|
|
52
38
|
o.expressions.each_with_index { |arg, i|
|
|
53
39
|
collector = visit o.convert_to_string_node(arg), collector
|
|
@@ -57,7 +43,7 @@ module ArelExtensions
|
|
|
57
43
|
collector
|
|
58
44
|
end
|
|
59
45
|
|
|
60
|
-
def visit_ArelExtensions_Nodes_IMatches
|
|
46
|
+
def visit_ArelExtensions_Nodes_IMatches o, collector
|
|
61
47
|
collector << 'LOWER('
|
|
62
48
|
collector = visit o.left, collector
|
|
63
49
|
collector << ') LIKE LOWER('
|
|
@@ -71,7 +57,7 @@ module ArelExtensions
|
|
|
71
57
|
end
|
|
72
58
|
end
|
|
73
59
|
|
|
74
|
-
def visit_ArelExtensions_Nodes_AiMatches
|
|
60
|
+
def visit_ArelExtensions_Nodes_AiMatches o, collector
|
|
75
61
|
collector = visit o.left.ai_collate, collector
|
|
76
62
|
collector << ' LIKE '
|
|
77
63
|
collector = visit o.right.ai_collate, collector
|
|
@@ -83,7 +69,7 @@ module ArelExtensions
|
|
|
83
69
|
end
|
|
84
70
|
end
|
|
85
71
|
|
|
86
|
-
def visit_ArelExtensions_Nodes_AiIMatches
|
|
72
|
+
def visit_ArelExtensions_Nodes_AiIMatches o, collector
|
|
87
73
|
collector = visit o.left.ai_collate, collector
|
|
88
74
|
collector << ' LIKE '
|
|
89
75
|
collector = visit o.right.ai_collate, collector
|
|
@@ -95,7 +81,7 @@ module ArelExtensions
|
|
|
95
81
|
end
|
|
96
82
|
end
|
|
97
83
|
|
|
98
|
-
def visit_ArelExtensions_Nodes_SMatches
|
|
84
|
+
def visit_ArelExtensions_Nodes_SMatches o, collector
|
|
99
85
|
collector = visit o.left, collector
|
|
100
86
|
collector << ' LIKE '
|
|
101
87
|
collector = visit o.right, collector
|
|
@@ -107,7 +93,8 @@ module ArelExtensions
|
|
|
107
93
|
end
|
|
108
94
|
end
|
|
109
95
|
|
|
110
|
-
|
|
96
|
+
|
|
97
|
+
def visit_ArelExtensions_Nodes_IDoesNotMatch o, collector
|
|
111
98
|
collector << 'LOWER('
|
|
112
99
|
collector = visit o.left, collector
|
|
113
100
|
collector << ') NOT LIKE LOWER('
|
|
@@ -121,61 +108,54 @@ module ArelExtensions
|
|
|
121
108
|
end
|
|
122
109
|
end
|
|
123
110
|
|
|
124
|
-
def visit_ArelExtensions_Nodes_Collate
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
end
|
|
140
|
-
collector
|
|
111
|
+
def visit_ArelExtensions_Nodes_Collate o, collector
|
|
112
|
+
if o.ai
|
|
113
|
+
collector << "NLSSORT("
|
|
114
|
+
collector = visit o.expressions.first, collector
|
|
115
|
+
collector << Arel::Visitors::Oracle::COMMA
|
|
116
|
+
collector << "'NLS_SORT = BINARY_AI NLS_COMP = LINGUISTIC'"
|
|
117
|
+
collector << ")"
|
|
118
|
+
elsif o.ci
|
|
119
|
+
collector << "NLSSORT("
|
|
120
|
+
collector = visit o.expressions.first, collector
|
|
121
|
+
collector << Arel::Visitors::Oracle::COMMA
|
|
122
|
+
collector << "'NLS_SORT = BINARY_CI NLS_COMP = LINGUISTIC'"
|
|
123
|
+
collector << ")"
|
|
124
|
+
else
|
|
125
|
+
collector = visit o.expressions.first, collector
|
|
141
126
|
end
|
|
142
|
-
|
|
143
|
-
def visit_Arel_Nodes_RollUp(o, collector)
|
|
144
|
-
collector << 'ROLLUP'
|
|
145
|
-
grouping_array_or_grouping_element o, collector
|
|
127
|
+
collector
|
|
146
128
|
end
|
|
147
129
|
|
|
148
|
-
def visit_ArelExtensions_Nodes_GroupConcat
|
|
149
|
-
collector <<
|
|
130
|
+
def visit_ArelExtensions_Nodes_GroupConcat o, collector
|
|
131
|
+
collector << "(LISTAGG("
|
|
150
132
|
collector = visit o.left, collector
|
|
151
|
-
collector << COMMA
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
if 'NULL' == sep
|
|
155
|
-
visit Arel.quoted(','), collector
|
|
156
|
-
else
|
|
157
|
-
visit o.separator, collector
|
|
158
|
-
end
|
|
159
|
-
collector << ') WITHIN GROUP (ORDER BY '
|
|
160
|
-
if o.order.blank?
|
|
161
|
-
collector = visit o.left, collector
|
|
133
|
+
collector << Arel::Visitors::Oracle::COMMA
|
|
134
|
+
if o.right && o.right != 'NULL'
|
|
135
|
+
collector = visit o.right, collector
|
|
162
136
|
else
|
|
163
|
-
|
|
164
|
-
|
|
137
|
+
collector = visit Arel::Nodes.build_quoted(','), collector
|
|
138
|
+
end
|
|
139
|
+
collector << ") WITHIN GROUP (ORDER BY "
|
|
140
|
+
if !o.orders.blank?
|
|
141
|
+
o.orders.each_with_index do |order,i|
|
|
142
|
+
collector << Arel::Visitors::Oracle::COMMA unless i == 0
|
|
165
143
|
collector = visit order, collector
|
|
166
144
|
end
|
|
145
|
+
else
|
|
146
|
+
collector = visit o.left, collector
|
|
167
147
|
end
|
|
168
|
-
collector <<
|
|
148
|
+
collector << "))"
|
|
169
149
|
collector
|
|
170
150
|
end
|
|
171
151
|
|
|
172
|
-
def visit_ArelExtensions_Nodes_Coalesce
|
|
173
|
-
collector <<
|
|
152
|
+
def visit_ArelExtensions_Nodes_Coalesce o, collector
|
|
153
|
+
collector << "COALESCE("
|
|
174
154
|
o.expressions.each_with_index { |arg, i|
|
|
175
|
-
collector << COMMA
|
|
155
|
+
collector << Arel::Visitors::Oracle::COMMA unless i == 0
|
|
176
156
|
if i > 0 && o.left_node_type == :text
|
|
177
|
-
if arg == ''
|
|
178
|
-
collector <<
|
|
157
|
+
if arg == '' || (arg.is_a?(Arel::Nodes::Quoted) && (arg.expr == ''))
|
|
158
|
+
collector << "NULL"
|
|
179
159
|
else
|
|
180
160
|
collector << 'TO_CLOB('
|
|
181
161
|
collector = visit arg, collector
|
|
@@ -185,37 +165,37 @@ module ArelExtensions
|
|
|
185
165
|
collector = visit arg, collector
|
|
186
166
|
end
|
|
187
167
|
}
|
|
188
|
-
collector <<
|
|
168
|
+
collector << ")"
|
|
189
169
|
collector
|
|
190
170
|
end
|
|
191
171
|
|
|
192
|
-
def visit_ArelExtensions_Nodes_MD5
|
|
193
|
-
collector <<
|
|
172
|
+
def visit_ArelExtensions_Nodes_MD5 o, collector
|
|
173
|
+
collector << "LOWER (RAWTOHEX (DBMS_OBFUSCATION_TOOLKIT.md5(input => UTL_I18N.STRING_TO_RAW("
|
|
194
174
|
collector = visit o.left, collector
|
|
195
175
|
collector << ", 'AL32UTF8'))))"
|
|
196
176
|
collector
|
|
197
177
|
end
|
|
198
178
|
|
|
199
179
|
# :date is not possible in Oracle since this type does not really exist
|
|
200
|
-
def visit_ArelExtensions_Nodes_DateDiff
|
|
201
|
-
lc =
|
|
202
|
-
rc =
|
|
180
|
+
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
|
181
|
+
lc = o.left_node_type == :ruby_date || o.left_node_type == :ruby_time
|
|
182
|
+
rc = o.right_node_type == :ruby_date || o.right_node_type == :ruby_time
|
|
203
183
|
if rc || o.right_node_type == :date || o.right_node_type == :datetime || o.right_node_type == :time
|
|
204
184
|
collector << '('
|
|
205
185
|
collector << 'TO_DATE(' if lc
|
|
206
186
|
collector = visit o.left, collector
|
|
207
187
|
collector << ')' if lc
|
|
208
|
-
collector <<
|
|
188
|
+
collector << " - "
|
|
209
189
|
collector << 'TO_DATE(' if rc
|
|
210
190
|
collector = visit o.right, collector
|
|
211
191
|
collector << ')' if rc
|
|
212
192
|
collector << ')'
|
|
213
|
-
if
|
|
193
|
+
if (o.left_node_type == :ruby_time || o.left_node_type == :datetime || o.left_node_type == :time)
|
|
214
194
|
collector << ' * (CASE WHEN (TRUNC('
|
|
215
195
|
collector << 'TO_DATE(' if lc
|
|
216
196
|
collector = visit o.left, collector
|
|
217
197
|
collector << ')' if lc
|
|
218
|
-
collector << COMMA
|
|
198
|
+
collector << Arel::Visitors::Oracle::COMMA
|
|
219
199
|
collector << "'DDD') = "
|
|
220
200
|
collector << 'TO_DATE(' if lc
|
|
221
201
|
collector = visit o.left, collector
|
|
@@ -236,82 +216,71 @@ module ArelExtensions
|
|
|
236
216
|
collector
|
|
237
217
|
end
|
|
238
218
|
|
|
239
|
-
def visit_ArelExtensions_Nodes_Duration
|
|
219
|
+
def visit_ArelExtensions_Nodes_Duration o, collector
|
|
240
220
|
case o.left
|
|
241
221
|
when 'wd', 'w'
|
|
242
|
-
collector <<
|
|
222
|
+
collector << "TO_CHAR("
|
|
243
223
|
collector = visit o.right, collector
|
|
244
|
-
collector << COMMA
|
|
245
|
-
collector = visit Arel.
|
|
224
|
+
collector << Arel::Visitors::Oracle::COMMA
|
|
225
|
+
collector = visit Arel::Nodes.build_quoted(Arel::Visitors::Oracle::DATE_MAPPING[o.left]), collector
|
|
246
226
|
else
|
|
247
|
-
right =
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
collector << "EXTRACT(#{DATE_MAPPING[o.left]} FROM "
|
|
227
|
+
right = case o.left
|
|
228
|
+
when 'd','m','y'
|
|
229
|
+
interval = 'DAY'
|
|
230
|
+
o.right.cast(:date)
|
|
231
|
+
when 'h','mn','s'
|
|
232
|
+
interval = 'SECOND'
|
|
233
|
+
o.right.cast(:datetime)
|
|
234
|
+
when /i\z/
|
|
235
|
+
interval = Arel::Visitors::Oracle::DATE_MAPPING[o.left[0..-2]]
|
|
236
|
+
collector << '('
|
|
237
|
+
collector = visit o.right, collector
|
|
238
|
+
collector << ") * (INTERVAL '1' #{interval})"
|
|
239
|
+
return collector
|
|
240
|
+
else
|
|
241
|
+
interval = nil
|
|
242
|
+
o.right
|
|
243
|
+
end
|
|
244
|
+
collector << "EXTRACT(#{Arel::Visitors::Oracle::DATE_MAPPING[o.left]} FROM "
|
|
266
245
|
collector = visit right, collector
|
|
267
246
|
end
|
|
268
|
-
collector <<
|
|
247
|
+
collector << ")"
|
|
269
248
|
collector << " * (INTERVAL '1' #{interval})" if interval && o.with_interval
|
|
270
249
|
collector
|
|
271
250
|
end
|
|
272
251
|
|
|
273
|
-
def visit_ArelExtensions_Nodes_Cast
|
|
252
|
+
def visit_ArelExtensions_Nodes_Cast o, collector
|
|
274
253
|
case o.as_attr
|
|
275
254
|
when :string
|
|
276
|
-
collector <<
|
|
255
|
+
collector << "TO_CHAR("
|
|
277
256
|
collector = visit o.left, collector
|
|
278
|
-
collector <<
|
|
279
|
-
return collector
|
|
280
|
-
when :text
|
|
281
|
-
collector << 'TO_CLOB('
|
|
282
|
-
collector = visit o.left, collector
|
|
283
|
-
collector << ')'
|
|
284
|
-
return collector
|
|
285
|
-
when :ntext
|
|
286
|
-
collector << 'TO_NCLOB('
|
|
287
|
-
collector = visit o.left, collector
|
|
288
|
-
collector << ')'
|
|
257
|
+
collector << ")"
|
|
289
258
|
return collector
|
|
290
259
|
when :time
|
|
291
260
|
if (o.left.respond_to?(:return_type) && o.left.return_type == :string) || o.left.is_a?(Arel::Nodes::Quoted)
|
|
292
|
-
collector <<
|
|
261
|
+
collector << "TO_DATE("
|
|
293
262
|
collector = visit o.left, collector
|
|
294
263
|
collector << ",'HH24:MI:SS')"
|
|
295
264
|
else
|
|
296
|
-
collector <<
|
|
265
|
+
collector << "TO_DATE(TO_CHAR("
|
|
297
266
|
collector = visit o.left, collector
|
|
298
267
|
collector << ",'HH24:MI:SS'),'HH24:MI:SS')"
|
|
299
268
|
end
|
|
300
269
|
return collector
|
|
301
270
|
when :number, :decimal
|
|
302
|
-
collector <<
|
|
271
|
+
collector << "TO_NUMBER("
|
|
303
272
|
collector = visit o.left, collector
|
|
304
|
-
collector <<
|
|
273
|
+
collector << ")"
|
|
305
274
|
return collector
|
|
306
275
|
when :datetime
|
|
307
276
|
as_attr = Arel::Nodes::SqlLiteral.new('timestamp')
|
|
308
277
|
when :date
|
|
309
278
|
if (o.left.respond_to?(:return_type) && o.left.return_type == :string) || o.left.is_a?(Arel::Nodes::Quoted)
|
|
310
|
-
collector <<
|
|
279
|
+
collector << "TO_DATE("
|
|
311
280
|
collector = visit o.left, collector
|
|
312
281
|
collector << ",'YYYY-MM-DD')"
|
|
313
282
|
else
|
|
314
|
-
collector <<
|
|
283
|
+
collector << "TO_DATE(TO_CHAR("
|
|
315
284
|
collector = visit o.left, collector
|
|
316
285
|
collector << ",'YYYY-MM-DD'),'YYYY-MM-DD')"
|
|
317
286
|
end
|
|
@@ -321,85 +290,83 @@ module ArelExtensions
|
|
|
321
290
|
else
|
|
322
291
|
as_attr = Arel::Nodes::SqlLiteral.new(o.as_attr.to_s)
|
|
323
292
|
end
|
|
324
|
-
collector <<
|
|
293
|
+
collector << "CAST("
|
|
325
294
|
collector = visit o.left, collector
|
|
326
|
-
collector <<
|
|
295
|
+
collector << " AS "
|
|
327
296
|
collector = visit as_attr, collector
|
|
328
|
-
collector <<
|
|
297
|
+
collector << ")"
|
|
329
298
|
collector
|
|
330
299
|
end
|
|
331
300
|
|
|
332
|
-
def visit_ArelExtensions_Nodes_Length
|
|
333
|
-
collector << "LENGTH
|
|
301
|
+
def visit_ArelExtensions_Nodes_Length o, collector
|
|
302
|
+
collector << "LENGTH("
|
|
334
303
|
collector = visit o.expr, collector
|
|
335
|
-
collector <<
|
|
304
|
+
collector << ")"
|
|
336
305
|
collector
|
|
337
306
|
end
|
|
338
307
|
|
|
339
|
-
def visit_ArelExtensions_Nodes_IsNull
|
|
308
|
+
def visit_ArelExtensions_Nodes_IsNull o, collector
|
|
340
309
|
collector = visit o.expr, collector
|
|
341
310
|
collector << ' IS NULL'
|
|
342
311
|
collector
|
|
343
312
|
end
|
|
344
313
|
|
|
345
|
-
def visit_ArelExtensions_Nodes_IsNotNull
|
|
314
|
+
def visit_ArelExtensions_Nodes_IsNotNull o, collector
|
|
346
315
|
collector = visit o.expr, collector
|
|
347
316
|
collector << ' IS NOT NULL'
|
|
348
317
|
collector
|
|
349
318
|
end
|
|
350
319
|
|
|
351
|
-
def visit_ArelExtensions_Nodes_Rand
|
|
352
|
-
collector <<
|
|
320
|
+
def visit_ArelExtensions_Nodes_Rand o, collector
|
|
321
|
+
collector << "DBMS_RANDOM.VALUE("
|
|
353
322
|
if o.left && o.right
|
|
354
323
|
collector = visit o.left, collector
|
|
355
|
-
collector << COMMA
|
|
324
|
+
collector << Arel::Visitors::Oracle::COMMA
|
|
356
325
|
collector = visit o.right, collector
|
|
357
326
|
end
|
|
358
|
-
collector <<
|
|
327
|
+
collector << ")"
|
|
359
328
|
collector
|
|
360
329
|
end
|
|
361
330
|
|
|
362
|
-
def visit_Arel_Nodes_Regexp
|
|
363
|
-
collector <<
|
|
331
|
+
def visit_Arel_Nodes_Regexp o, collector
|
|
332
|
+
collector << " REGEXP_LIKE("
|
|
364
333
|
collector = visit o.left, collector
|
|
365
|
-
collector << COMMA
|
|
334
|
+
collector << Arel::Visitors::Oracle::COMMA
|
|
366
335
|
collector = visit o.right, collector
|
|
367
336
|
collector << ')'
|
|
368
337
|
collector
|
|
369
338
|
end
|
|
370
339
|
|
|
371
|
-
def visit_Arel_Nodes_NotRegexp
|
|
372
|
-
collector <<
|
|
340
|
+
def visit_Arel_Nodes_NotRegexp o, collector
|
|
341
|
+
collector << " NOT REGEXP_LIKE("
|
|
373
342
|
collector = visit o.left, collector
|
|
374
|
-
collector << COMMA
|
|
343
|
+
collector << Arel::Visitors::Oracle::COMMA
|
|
375
344
|
collector = visit o.right, collector
|
|
376
345
|
collector << ')'
|
|
377
346
|
collector
|
|
378
347
|
end
|
|
379
348
|
|
|
380
|
-
def visit_ArelExtensions_Nodes_Locate
|
|
381
|
-
collector <<
|
|
349
|
+
def visit_ArelExtensions_Nodes_Locate o, collector
|
|
350
|
+
collector << "INSTR("
|
|
382
351
|
o.expressions.each_with_index { |arg, i|
|
|
383
|
-
collector << COMMA
|
|
352
|
+
collector << Arel::Visitors::Oracle::COMMA unless i == 0
|
|
384
353
|
collector = visit arg, collector
|
|
385
354
|
}
|
|
386
|
-
collector <<
|
|
355
|
+
collector << ")"
|
|
387
356
|
collector
|
|
388
357
|
end
|
|
389
358
|
|
|
390
|
-
def visit_ArelExtensions_Nodes_Substring
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
collector << 'SUBSTR('
|
|
359
|
+
def visit_ArelExtensions_Nodes_Substring o, collector
|
|
360
|
+
collector << "SUBSTR("
|
|
394
361
|
o.expressions.each_with_index { |arg, i|
|
|
395
|
-
collector << COMMA
|
|
362
|
+
collector << Arel::Visitors::Oracle::COMMA unless i == 0
|
|
396
363
|
collector = visit arg, collector
|
|
397
364
|
}
|
|
398
|
-
collector <<
|
|
365
|
+
collector << ")"
|
|
399
366
|
collector
|
|
400
367
|
end
|
|
401
368
|
|
|
402
|
-
def visit_ArelExtensions_Nodes_Trim
|
|
369
|
+
def visit_ArelExtensions_Nodes_Trim o, collector
|
|
403
370
|
collector << 'TRIM(' # BOTH
|
|
404
371
|
if o.right.expr && SPECIAL_CHARS[o.right.expr]
|
|
405
372
|
collector << SPECIAL_CHARS[o.right.expr]
|
|
@@ -411,21 +378,21 @@ module ArelExtensions
|
|
|
411
378
|
if o.type_of_attribute(o.left) == :text
|
|
412
379
|
collector << 'dbms_lob.SUBSTR('
|
|
413
380
|
collector = visit o.left, collector
|
|
414
|
-
collector << COMMA
|
|
381
|
+
collector << Arel::Visitors::Oracle::COMMA
|
|
415
382
|
collector << 'COALESCE(dbms_lob.GETLENGTH('
|
|
416
383
|
collector = visit o.left, collector
|
|
417
|
-
collector <<
|
|
418
|
-
collector << COMMA
|
|
384
|
+
collector << "), 0)"
|
|
385
|
+
collector << Arel::Visitors::Oracle::COMMA
|
|
419
386
|
collector << '1)'
|
|
420
387
|
else
|
|
421
388
|
collector = visit o.left, collector
|
|
422
389
|
end
|
|
423
390
|
collector << ')' if o.left.is_a? ArelExtensions::Nodes::Trim
|
|
424
|
-
collector <<
|
|
391
|
+
collector << ")"
|
|
425
392
|
collector
|
|
426
393
|
end
|
|
427
394
|
|
|
428
|
-
def visit_ArelExtensions_Nodes_Ltrim
|
|
395
|
+
def visit_ArelExtensions_Nodes_Ltrim o, collector
|
|
429
396
|
collector << 'TRIM(LEADING '
|
|
430
397
|
if o.right.expr && SPECIAL_CHARS[o.right.expr]
|
|
431
398
|
collector << SPECIAL_CHARS[o.right.expr]
|
|
@@ -434,11 +401,11 @@ module ArelExtensions
|
|
|
434
401
|
end
|
|
435
402
|
collector << ' FROM '
|
|
436
403
|
collector = visit o.left, collector
|
|
437
|
-
collector <<
|
|
404
|
+
collector << ")"
|
|
438
405
|
collector
|
|
439
406
|
end
|
|
440
407
|
|
|
441
|
-
def visit_ArelExtensions_Nodes_Rtrim
|
|
408
|
+
def visit_ArelExtensions_Nodes_Rtrim o, collector
|
|
442
409
|
collector << 'TRIM(TRAILING '
|
|
443
410
|
if o.right.expr && SPECIAL_CHARS[o.right.expr]
|
|
444
411
|
collector << SPECIAL_CHARS[o.right.expr]
|
|
@@ -447,116 +414,105 @@ module ArelExtensions
|
|
|
447
414
|
end
|
|
448
415
|
collector << ' FROM '
|
|
449
416
|
collector = visit o.left, collector
|
|
450
|
-
collector <<
|
|
417
|
+
collector << ")"
|
|
451
418
|
collector
|
|
452
419
|
end
|
|
453
420
|
|
|
454
|
-
def visit_ArelExtensions_Nodes_Blank
|
|
421
|
+
def visit_ArelExtensions_Nodes_Blank o, collector
|
|
455
422
|
visit o.expr.trim.length.coalesce(0).eq(0), collector
|
|
456
423
|
end
|
|
457
424
|
|
|
458
|
-
def visit_ArelExtensions_Nodes_NotBlank
|
|
425
|
+
def visit_ArelExtensions_Nodes_NotBlank o, collector
|
|
459
426
|
visit o.expr.trim.length.coalesce(0).gt(0), collector
|
|
460
427
|
end
|
|
461
428
|
|
|
462
|
-
def visit_ArelExtensions_Nodes_DateAdd
|
|
429
|
+
def visit_ArelExtensions_Nodes_DateAdd o, collector
|
|
463
430
|
collector << '('
|
|
464
431
|
collector = visit o.left, collector
|
|
465
|
-
collector << ' + '
|
|
432
|
+
collector << ' + '# (o.right.value >= 0 ? ' + ' : ' - ')
|
|
466
433
|
collector = visit o.oracle_value(o.right), collector
|
|
467
434
|
collector << ')'
|
|
468
435
|
collector
|
|
469
436
|
end
|
|
470
437
|
|
|
471
|
-
def visit_ArelExtensions_Nodes_Format
|
|
472
|
-
|
|
473
|
-
end
|
|
474
|
-
|
|
475
|
-
def visit_ArelExtensions_Nodes_FormattedDate(o, collector)
|
|
476
|
-
fmt = ArelExtensions::Visitors.strftime_to_format(o.iso_format, DATE_FORMAT_DIRECTIVES)
|
|
477
|
-
collector << 'TO_CHAR('
|
|
478
|
-
collector << 'CAST(' if o.time_zone
|
|
438
|
+
def visit_ArelExtensions_Nodes_Format o, collector
|
|
439
|
+
collector << "TO_CHAR("
|
|
479
440
|
collector = visit o.left, collector
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
when String
|
|
488
|
-
collector << ' as timestamp) at time zone '
|
|
489
|
-
collector = visit Arel.quoted(o.time_zone), collector
|
|
490
|
-
end
|
|
491
|
-
collector << COMMA
|
|
492
|
-
collector = visit Arel.quoted(fmt), collector
|
|
493
|
-
collector << ')'
|
|
441
|
+
collector << Arel::Visitors::Oracle::COMMA
|
|
442
|
+
|
|
443
|
+
f = o.iso_format.gsub(/\ (\w+)/, ' "\1"')
|
|
444
|
+
Arel::Visitors::Oracle::DATE_FORMAT_DIRECTIVES.each { |d, r| f.gsub!(d, r) }
|
|
445
|
+
collector = visit Arel::Nodes.build_quoted(f), collector
|
|
446
|
+
|
|
447
|
+
collector << ")"
|
|
494
448
|
collector
|
|
495
449
|
end
|
|
496
450
|
|
|
497
|
-
def visit_ArelExtensions_Nodes_Repeat
|
|
498
|
-
collector <<
|
|
499
|
-
collector = visit o.expressions[0], collector #
|
|
500
|
-
collector << COMMA
|
|
451
|
+
def visit_ArelExtensions_Nodes_Repeat o, collector
|
|
452
|
+
collector << "LPAD("
|
|
453
|
+
collector = visit o.expressions[0], collector #can't put empty string, otherwise it wouldn't work
|
|
454
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
501
455
|
collector = visit o.expressions[1], collector
|
|
502
|
-
collector << COMMA
|
|
456
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
503
457
|
collector = visit o.expressions[0], collector
|
|
504
|
-
collector <<
|
|
458
|
+
collector << ")"
|
|
505
459
|
collector
|
|
506
460
|
end
|
|
507
461
|
|
|
508
|
-
|
|
509
|
-
if
|
|
510
|
-
def visit_ArelExtensions_InsertManager_BulkValues
|
|
511
|
-
collector <<
|
|
462
|
+
# add primary_key if not present, avoid zip
|
|
463
|
+
if Arel::VERSION.to_i < 7
|
|
464
|
+
def visit_ArelExtensions_InsertManager_BulkValues o, collector
|
|
465
|
+
collector << "("
|
|
512
466
|
o.left.each_with_index do |row, idx| # values
|
|
513
|
-
|
|
514
|
-
collector <<
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
467
|
+
collector << " UNION ALL " if idx != 0
|
|
468
|
+
collector << "(SELECT "
|
|
469
|
+
v = Arel::Nodes::Values.new(row, o.cols)
|
|
470
|
+
len = v.expressions.length - 1
|
|
471
|
+
v.expressions.each_with_index { |value, i|
|
|
472
|
+
case value
|
|
473
|
+
when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
|
|
474
|
+
collector = visit value, collector
|
|
475
|
+
else
|
|
476
|
+
attr = v.columns[i]
|
|
477
|
+
collector << quote(value, attr && column_for(attr)).to_s
|
|
478
|
+
end
|
|
479
|
+
collector << Arel::Visitors::Oracle::COMMA unless i == len
|
|
524
480
|
}
|
|
525
481
|
collector << ' FROM DUAL)'
|
|
526
482
|
end
|
|
527
|
-
collector <<
|
|
483
|
+
collector << ")"
|
|
528
484
|
collector
|
|
529
485
|
end
|
|
530
486
|
else
|
|
531
|
-
def visit_ArelExtensions_InsertManager_BulkValues
|
|
532
|
-
collector <<
|
|
487
|
+
def visit_ArelExtensions_InsertManager_BulkValues o, collector
|
|
488
|
+
collector << "("
|
|
533
489
|
o.left.each_with_index do |row, idx|
|
|
534
|
-
collector <<
|
|
535
|
-
collector <<
|
|
490
|
+
collector << " UNION ALL " if idx != 0
|
|
491
|
+
collector << "(SELECT "
|
|
536
492
|
len = row.length - 1
|
|
537
|
-
row.
|
|
493
|
+
row.each_with_index { |value, i|
|
|
494
|
+
attr = o.cols[i]
|
|
538
495
|
case value
|
|
539
496
|
when Arel::Nodes::SqlLiteral, Arel::Nodes::BindParam
|
|
540
497
|
collector = visit value, collector
|
|
541
|
-
when Integer
|
|
542
|
-
collector << value.to_s
|
|
543
498
|
else
|
|
544
499
|
collector << (attr && attr.able_to_type_cast? ? quote(attr.type_cast_for_database(value)) : quote(value).to_s)
|
|
545
500
|
end
|
|
546
|
-
collector << COMMA unless i == len
|
|
501
|
+
collector << Arel::Visitors::Oracle::COMMA unless i == len
|
|
547
502
|
}
|
|
548
503
|
collector << ' FROM DUAL)'
|
|
549
504
|
end
|
|
550
|
-
collector <<
|
|
505
|
+
collector << ")"
|
|
551
506
|
collector
|
|
552
507
|
end
|
|
553
508
|
end
|
|
554
509
|
|
|
555
|
-
|
|
510
|
+
|
|
511
|
+
def get_time_converted element
|
|
556
512
|
if element.is_a?(Time)
|
|
557
513
|
ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
|
|
558
514
|
elsif element.is_a?(Arel::Attributes::Attribute)
|
|
559
|
-
col = Arel.
|
|
515
|
+
col = Arel::Table.engine.connection.schema_cache.columns_hash(element.relation.table_name)[element.name.to_s]
|
|
560
516
|
if col && (col.type == :time)
|
|
561
517
|
ArelExtensions::Nodes::Format.new [element, '%H:%M:%S']
|
|
562
518
|
else
|
|
@@ -567,53 +523,59 @@ module ArelExtensions
|
|
|
567
523
|
end
|
|
568
524
|
end
|
|
569
525
|
|
|
526
|
+
|
|
570
527
|
remove_method(:visit_Arel_Nodes_GreaterThanOrEqual) rescue nil
|
|
571
|
-
def visit_Arel_Nodes_GreaterThanOrEqual
|
|
528
|
+
def visit_Arel_Nodes_GreaterThanOrEqual o, collector
|
|
572
529
|
collector = visit get_time_converted(o.left), collector
|
|
573
|
-
collector <<
|
|
574
|
-
visit get_time_converted(o.right), collector
|
|
530
|
+
collector << " >= "
|
|
531
|
+
collector = visit get_time_converted(o.right), collector
|
|
532
|
+
collector
|
|
575
533
|
end
|
|
576
534
|
|
|
577
535
|
remove_method(:visit_Arel_Nodes_GreaterThan) rescue nil
|
|
578
|
-
def visit_Arel_Nodes_GreaterThan
|
|
536
|
+
def visit_Arel_Nodes_GreaterThan o, collector
|
|
579
537
|
collector = visit get_time_converted(o.left), collector
|
|
580
|
-
collector <<
|
|
581
|
-
visit get_time_converted(o.right), collector
|
|
538
|
+
collector << " > "
|
|
539
|
+
collector = visit get_time_converted(o.right), collector
|
|
540
|
+
collector
|
|
582
541
|
end
|
|
583
542
|
|
|
584
543
|
remove_method(:visit_Arel_Nodes_LessThanOrEqual) rescue nil
|
|
585
|
-
def visit_Arel_Nodes_LessThanOrEqual
|
|
544
|
+
def visit_Arel_Nodes_LessThanOrEqual o, collector
|
|
586
545
|
collector = visit get_time_converted(o.left), collector
|
|
587
|
-
collector <<
|
|
588
|
-
visit get_time_converted(o.right), collector
|
|
546
|
+
collector << " <= "
|
|
547
|
+
collector = visit get_time_converted(o.right), collector
|
|
548
|
+
collector
|
|
589
549
|
end
|
|
590
550
|
|
|
591
551
|
remove_method(:visit_Arel_Nodes_LessThan) rescue nil
|
|
592
|
-
def visit_Arel_Nodes_LessThan
|
|
552
|
+
def visit_Arel_Nodes_LessThan o, collector
|
|
593
553
|
collector = visit get_time_converted(o.left), collector
|
|
594
|
-
collector <<
|
|
595
|
-
visit get_time_converted(o.right), collector
|
|
554
|
+
collector << " < "
|
|
555
|
+
collector = visit get_time_converted(o.right), collector
|
|
556
|
+
collector
|
|
596
557
|
end
|
|
597
558
|
|
|
598
|
-
|
|
599
|
-
|
|
559
|
+
|
|
560
|
+
alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
|
|
561
|
+
def visit_Arel_Nodes_SelectStatement o, collector
|
|
600
562
|
if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
|
|
601
563
|
o = o.dup
|
|
602
564
|
o.orders = []
|
|
603
565
|
end
|
|
604
|
-
old_visit_Arel_Nodes_SelectStatement(o,
|
|
566
|
+
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
|
605
567
|
end
|
|
606
568
|
|
|
607
|
-
|
|
608
|
-
def visit_Arel_Nodes_TableAlias
|
|
569
|
+
alias_method :old_visit_Arel_Nodes_TableAlias, :visit_Arel_Nodes_TableAlias
|
|
570
|
+
def visit_Arel_Nodes_TableAlias o, collector
|
|
609
571
|
if o.name.length > 30
|
|
610
|
-
o = Arel::Table.new(o.table_name).alias(
|
|
572
|
+
o = Arel::Table.new(o.table_name).alias(Base64.urlsafe_encode64(Digest::MD5.new.digest(o.name)).tr('=', '').tr('-', '_'))
|
|
611
573
|
end
|
|
612
|
-
old_visit_Arel_Nodes_TableAlias(o,
|
|
574
|
+
old_visit_Arel_Nodes_TableAlias(o,collector)
|
|
613
575
|
end
|
|
614
576
|
|
|
615
|
-
|
|
616
|
-
def visit_Arel_Nodes_As
|
|
577
|
+
alias_method :old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As
|
|
578
|
+
def visit_Arel_Nodes_As o, collector
|
|
617
579
|
if o.left.is_a?(Arel::Nodes::Binary)
|
|
618
580
|
collector << '('
|
|
619
581
|
collector = visit o.left, collector
|
|
@@ -621,19 +583,19 @@ module ArelExtensions
|
|
|
621
583
|
else
|
|
622
584
|
collector = visit o.left, collector
|
|
623
585
|
end
|
|
624
|
-
quote = /(\A".*"\z)|\A[a-zA-Z_]*\z
|
|
586
|
+
quote = o.right.to_s =~ /(\A["].*["]\z)|\A[a-zA-Z_]*\z/ ? '' : '"'
|
|
625
587
|
collector << " AS #{quote}"
|
|
626
588
|
collector = visit o.right, collector
|
|
627
589
|
collector << "#{quote}"
|
|
628
590
|
collector
|
|
629
591
|
end
|
|
630
592
|
|
|
631
|
-
def visit_ArelExtensions_Nodes_As
|
|
593
|
+
def visit_ArelExtensions_Nodes_As o, collector
|
|
632
594
|
visit_Arel_Nodes_As o, collector
|
|
633
595
|
end
|
|
634
596
|
|
|
635
|
-
|
|
636
|
-
def visit_Arel_Attributes_Attribute
|
|
597
|
+
alias_method :old_visit_Arel_Attributes_Attribute, :visit_Arel_Attributes_Attribute
|
|
598
|
+
def visit_Arel_Attributes_Attribute o, collector
|
|
637
599
|
join_name = o.relation.table_alias || o.relation.name
|
|
638
600
|
if join_name.length > 30
|
|
639
601
|
join_name = Arel.shorten(join_name)
|
|
@@ -641,56 +603,52 @@ module ArelExtensions
|
|
|
641
603
|
collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
|
|
642
604
|
end
|
|
643
605
|
|
|
644
|
-
|
|
606
|
+
|
|
607
|
+
def visit_ArelExtensions_Nodes_FormattedNumber o, collector
|
|
645
608
|
col = o.left.coalesce(0)
|
|
646
|
-
comma = NUMBER_COMMA_MAPPING[o.locale] || '.,'
|
|
609
|
+
comma = Arel::Visitors::Oracle::NUMBER_COMMA_MAPPING[o.locale] || '.,'
|
|
647
610
|
comma_in_format = o.precision == 0 ? '' : 'D'
|
|
648
|
-
nines_after = (1..o.precision
|
|
611
|
+
nines_after = (1..o.precision-1).map{'9'}.join('')+'0'
|
|
649
612
|
if comma.length == 1
|
|
650
|
-
options = Arel.
|
|
651
|
-
nines_before = (
|
|
613
|
+
options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+" '")
|
|
614
|
+
nines_before = ("999"*4+"990")
|
|
652
615
|
else
|
|
653
|
-
options = Arel.
|
|
654
|
-
nines_before = (
|
|
616
|
+
options = Arel::Nodes.build_quoted("NLS_NUMERIC_CHARACTERS = '"+comma+"'")
|
|
617
|
+
nines_before = ("999G"*4+"990")
|
|
655
618
|
end
|
|
656
|
-
sign =
|
|
619
|
+
sign = ArelExtensions::Nodes::Case.new.when(col<0).
|
|
657
620
|
then('-').
|
|
658
621
|
else(o.flags.include?('+') ? '+' : (o.flags.include?(' ') ? ' ' : ''))
|
|
659
622
|
sign_length = o.flags.include?('+') || o.flags.include?(' ') ?
|
|
660
|
-
Arel.
|
|
661
|
-
|
|
623
|
+
Arel::Nodes.build_quoted(1) :
|
|
624
|
+
ArelExtensions::Nodes::Case.new.when(col<0).then(1).else(0)
|
|
662
625
|
|
|
663
626
|
if o.scientific_notation
|
|
664
|
-
number = Arel::Nodes::NamedFunction.new('TO_CHAR',
|
|
665
|
-
Arel.
|
|
666
|
-
Arel.
|
|
627
|
+
number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
|
628
|
+
Arel::Nodes.build_quoted(col.abs),
|
|
629
|
+
Arel::Nodes.build_quoted('FM'+nines_before+comma_in_format+nines_after+'EEEE'),
|
|
667
630
|
options
|
|
668
631
|
])
|
|
669
632
|
if o.type == 'e'
|
|
670
|
-
number = number.replace('E',
|
|
633
|
+
number = number.replace('E','e')
|
|
671
634
|
end
|
|
672
635
|
else
|
|
673
|
-
number = Arel::Nodes::NamedFunction.new('TO_CHAR',
|
|
674
|
-
Arel.
|
|
675
|
-
Arel.
|
|
636
|
+
number = Arel::Nodes::NamedFunction.new('TO_CHAR',[
|
|
637
|
+
Arel::Nodes.build_quoted(col.abs),
|
|
638
|
+
Arel::Nodes.build_quoted('FM'+nines_before+comma_in_format+nines_after),
|
|
676
639
|
options
|
|
677
640
|
])
|
|
678
641
|
end
|
|
679
642
|
|
|
680
|
-
repeated_char =
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
Arel
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
)
|
|
690
|
-
.else('')
|
|
691
|
-
end
|
|
692
|
-
before = !o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
|
|
693
|
-
middle = o.flags.include?('0') && !o.flags.include?('-') ? repeated_char : ''
|
|
643
|
+
repeated_char = (o.width == 0) ? Arel::Nodes.build_quoted('') : ArelExtensions::Nodes::Case.new().
|
|
644
|
+
when(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length)>0).
|
|
645
|
+
then(Arel::Nodes.build_quoted(
|
|
646
|
+
o.flags.include?('-') ? ' ' : (o.flags.include?('0') ? '0' : ' ')
|
|
647
|
+
).repeat(Arel::Nodes.build_quoted(o.width).abs-(number.length+sign_length))
|
|
648
|
+
).
|
|
649
|
+
else('')
|
|
650
|
+
before = (!o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
|
651
|
+
middle = (o.flags.include?('0'))&&(!o.flags.include?('-')) ? repeated_char : ''
|
|
694
652
|
after = o.flags.include?('-') ? repeated_char : ''
|
|
695
653
|
full_number = ArelExtensions::Nodes::Concat.new([
|
|
696
654
|
before,
|
|
@@ -699,44 +657,33 @@ module ArelExtensions
|
|
|
699
657
|
number,
|
|
700
658
|
after
|
|
701
659
|
])
|
|
702
|
-
collector = visit ArelExtensions::Nodes::Concat.new([Arel.
|
|
660
|
+
collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
|
|
703
661
|
collector
|
|
704
662
|
end
|
|
705
663
|
|
|
706
|
-
def visit_ArelExtensions_Nodes_Std
|
|
707
|
-
collector << (o.unbiased_estimator ?
|
|
664
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
|
665
|
+
collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
|
|
708
666
|
visit o.left, collector
|
|
709
|
-
collector <<
|
|
667
|
+
collector << ")"
|
|
710
668
|
collector
|
|
711
669
|
end
|
|
712
670
|
|
|
713
|
-
def visit_ArelExtensions_Nodes_Variance
|
|
714
|
-
collector << (o.unbiased_estimator ?
|
|
671
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
|
672
|
+
collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
|
|
715
673
|
visit o.left, collector
|
|
716
|
-
collector <<
|
|
674
|
+
collector << ")"
|
|
717
675
|
collector
|
|
718
676
|
end
|
|
719
677
|
|
|
720
|
-
def visit_ArelExtensions_Nodes_LevenshteinDistance
|
|
721
|
-
collector <<
|
|
678
|
+
def visit_ArelExtensions_Nodes_LevenshteinDistance o, collector
|
|
679
|
+
collector << "UTL_MATCH.edit_distance("
|
|
722
680
|
collector = visit o.left, collector
|
|
723
|
-
collector << COMMA
|
|
681
|
+
collector << Arel::Visitors::ToSql::COMMA
|
|
724
682
|
collector = visit o.right, collector
|
|
725
683
|
collector << ')'
|
|
726
684
|
collector
|
|
727
685
|
end
|
|
728
686
|
|
|
729
|
-
# Utilized by GroupingSet, Cube & RollUp visitors to
|
|
730
|
-
# handle grouping aggregation semantics
|
|
731
|
-
def grouping_array_or_grouping_element(o, collector)
|
|
732
|
-
if o.expr.is_a? Array
|
|
733
|
-
collector << '( '
|
|
734
|
-
visit o.expr, collector
|
|
735
|
-
collector << ' )'
|
|
736
|
-
else
|
|
737
|
-
visit o.expr, collector
|
|
738
|
-
end
|
|
739
|
-
end
|
|
740
687
|
end
|
|
741
688
|
end
|
|
742
689
|
end
|