arel_extensions 1.2.13 → 1.2.18
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/.travis.yml +2 -0
- data/Gemfile +10 -10
- data/Rakefile +4 -4
- data/arel_extensions.gemspec +1 -1
- data/gemfiles/rails3.gemfile +9 -9
- data/gemfiles/rails4.gemfile +13 -13
- data/gemfiles/rails5_0.gemfile +13 -13
- data/gemfiles/rails5_1_4.gemfile +13 -13
- data/gemfiles/rails5_2.gemfile +13 -13
- data/gemfiles/rails6.gemfile +13 -13
- data/lib/arel_extensions.rb +3 -3
- data/lib/arel_extensions/attributes.rb +0 -0
- data/lib/arel_extensions/boolean_functions.rb +21 -5
- data/lib/arel_extensions/common_sql_functions.rb +2 -4
- data/lib/arel_extensions/comparators.rb +11 -14
- data/lib/arel_extensions/date_duration.rb +4 -5
- data/lib/arel_extensions/insert_manager.rb +16 -17
- data/lib/arel_extensions/math.rb +8 -9
- data/lib/arel_extensions/math_functions.rb +15 -17
- data/lib/arel_extensions/nodes/abs.rb +0 -1
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -1
- data/lib/arel_extensions/nodes/blank.rb +0 -1
- data/lib/arel_extensions/nodes/case.rb +3 -4
- data/lib/arel_extensions/nodes/cast.rb +4 -2
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/change_case.rb +0 -0
- data/lib/arel_extensions/nodes/coalesce.rb +0 -1
- data/lib/arel_extensions/nodes/collate.rb +0 -1
- data/lib/arel_extensions/nodes/concat.rb +1 -3
- data/lib/arel_extensions/nodes/date_diff.rb +7 -8
- data/lib/arel_extensions/nodes/duration.rb +0 -1
- data/lib/arel_extensions/nodes/find_in_set.rb +0 -1
- data/lib/arel_extensions/nodes/floor.rb +1 -1
- data/lib/arel_extensions/nodes/format.rb +27 -1
- data/lib/arel_extensions/nodes/formatted_number.rb +0 -1
- data/lib/arel_extensions/nodes/function.rb +18 -15
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +39 -30
- data/lib/arel_extensions/nodes/length.rb +0 -1
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +0 -0
- data/lib/arel_extensions/nodes/locate.rb +0 -1
- data/lib/arel_extensions/nodes/log10.rb +1 -2
- data/lib/arel_extensions/nodes/matches.rb +0 -2
- data/lib/arel_extensions/nodes/md5.rb +0 -1
- data/lib/arel_extensions/nodes/power.rb +0 -1
- data/lib/arel_extensions/nodes/rand.rb +0 -1
- data/lib/arel_extensions/nodes/repeat.rb +0 -2
- data/lib/arel_extensions/nodes/replace.rb +0 -2
- data/lib/arel_extensions/nodes/round.rb +0 -1
- data/lib/arel_extensions/nodes/soundex.rb +0 -1
- data/lib/arel_extensions/nodes/std.rb +0 -1
- data/lib/arel_extensions/nodes/substring.rb +0 -1
- data/lib/arel_extensions/nodes/sum.rb +0 -0
- data/lib/arel_extensions/nodes/then.rb +0 -0
- data/lib/arel_extensions/nodes/trim.rb +0 -2
- data/lib/arel_extensions/nodes/union.rb +0 -2
- data/lib/arel_extensions/nodes/union_all.rb +0 -2
- data/lib/arel_extensions/nodes/wday.rb +0 -4
- data/lib/arel_extensions/null_functions.rb +3 -5
- data/lib/arel_extensions/predications.rb +5 -6
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +0 -2
- data/lib/arel_extensions/string_functions.rb +21 -22
- data/lib/arel_extensions/tasks.rb +1 -1
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors.rb +68 -60
- data/lib/arel_extensions/visitors/convert_format.rb +37 -0
- data/lib/arel_extensions/visitors/ibm_db.rb +4 -11
- data/lib/arel_extensions/visitors/mssql.rb +49 -44
- data/lib/arel_extensions/visitors/mysql.rb +65 -67
- data/lib/arel_extensions/visitors/oracle.rb +58 -55
- data/lib/arel_extensions/visitors/oracle12.rb +2 -3
- data/lib/arel_extensions/visitors/postgresql.rb +41 -34
- data/lib/arel_extensions/visitors/sqlite.rb +23 -18
- data/lib/arel_extensions/visitors/to_sql.rb +69 -61
- data/test/arelx_test_helper.rb +0 -2
- data/test/real_db_test.rb +27 -42
- data/test/support/fake_record.rb +1 -1
- data/test/test_comparators.rb +0 -4
- data/test/visitors/test_bulk_insert_oracle.rb +0 -1
- data/test/visitors/test_bulk_insert_sqlite.rb +0 -2
- data/test/visitors/test_oracle.rb +1 -2
- data/test/visitors/test_to_sql.rb +16 -25
- data/test/with_ar/all_agnostic_test.rb +135 -139
- data/test/with_ar/insert_agnostic_test.rb +0 -2
- data/test/with_ar/test_bulk_sqlite.rb +0 -4
- data/test/with_ar/test_math_sqlite.rb +4 -8
- data/test/with_ar/test_string_mysql.rb +1 -5
- data/test/with_ar/test_string_sqlite.rb +1 -5
- data/version_v1.rb +1 -1
- data/version_v2.rb +1 -1
- metadata +4 -3
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'arel_extensions/nodes/concat' #if Arel::VERSION.to_i < 7
|
1
|
+
require 'arel_extensions/nodes/concat' # if Arel::VERSION.to_i < 7
|
2
2
|
require 'arel_extensions/nodes/length'
|
3
3
|
require 'arel_extensions/nodes/locate'
|
4
4
|
require 'arel_extensions/nodes/substring'
|
@@ -19,19 +19,18 @@ require 'arel_extensions/nodes/md5'
|
|
19
19
|
|
20
20
|
module ArelExtensions
|
21
21
|
module StringFunctions
|
22
|
-
|
23
|
-
#*FindInSet function .......
|
22
|
+
# *FindInSet function .......
|
24
23
|
def &(other)
|
25
24
|
ArelExtensions::Nodes::FindInSet.new [other, self]
|
26
25
|
end
|
27
26
|
|
28
|
-
#LENGTH function returns the length of the value in a text field.
|
27
|
+
# LENGTH function returns the length of the value in a text field.
|
29
28
|
def length
|
30
29
|
ArelExtensions::Nodes::Length.new [self]
|
31
30
|
end
|
32
31
|
|
33
|
-
#LOCATE function returns the first starting position of a string in another string.
|
34
|
-
#If string1 or string2 is NULL then it returns NULL. If string1 not found in string2 then it returns 0.
|
32
|
+
# LOCATE function returns the first starting position of a string in another string.
|
33
|
+
# If string1 or string2 is NULL then it returns NULL. If string1 not found in string2 then it returns 0.
|
35
34
|
def locate val
|
36
35
|
ArelExtensions::Nodes::Locate.new [self, val]
|
37
36
|
end
|
@@ -51,7 +50,7 @@ module ArelExtensions
|
|
51
50
|
end
|
52
51
|
end
|
53
52
|
|
54
|
-
#SOUNDEX function returns a character string containing the phonetic representation of char.
|
53
|
+
# SOUNDEX function returns a character string containing the phonetic representation of char.
|
55
54
|
def soundex
|
56
55
|
ArelExtensions::Nodes::Soundex.new [self]
|
57
56
|
end
|
@@ -64,18 +63,18 @@ module ArelExtensions
|
|
64
63
|
grouping_any :imatches, others, escape
|
65
64
|
end
|
66
65
|
|
67
|
-
# def grouping_any method, others, *extra
|
68
|
-
# puts "*******************"
|
69
|
-
# puts method
|
70
|
-
# puts others.inspect
|
71
|
-
# puts extra.inspect
|
72
|
-
# puts "-------------------"
|
73
|
-
# res = super(method,others,*extra)
|
74
|
-
# puts res.to_sql
|
75
|
-
# puts res.inspect
|
76
|
-
# puts "*******************"
|
77
|
-
# res
|
78
|
-
# end
|
66
|
+
# def grouping_any method, others, *extra
|
67
|
+
# puts "*******************"
|
68
|
+
# puts method
|
69
|
+
# puts others.inspect
|
70
|
+
# puts extra.inspect
|
71
|
+
# puts "-------------------"
|
72
|
+
# res = super(method,others,*extra)
|
73
|
+
# puts res.to_sql
|
74
|
+
# puts res.inspect
|
75
|
+
# puts "*******************"
|
76
|
+
# res
|
77
|
+
# end
|
79
78
|
|
80
79
|
def imatches_all others, escape = nil
|
81
80
|
grouping_all :imatches, others, escape, escape
|
@@ -117,7 +116,7 @@ module ArelExtensions
|
|
117
116
|
ArelExtensions::Nodes::Collate.new(self,option,ai,ci)
|
118
117
|
end
|
119
118
|
|
120
|
-
#REPLACE function replaces a sequence of characters in a string with another set of characters, not case-sensitive.
|
119
|
+
# REPLACE function replaces a sequence of characters in a string with another set of characters, not case-sensitive.
|
121
120
|
def replace pattern, substitute
|
122
121
|
if pattern.is_a? Regexp
|
123
122
|
ArelExtensions::Nodes::RegexpReplace.new self, pattern, substitute
|
@@ -134,7 +133,7 @@ module ArelExtensions
|
|
134
133
|
ArelExtensions::Nodes::Concat.new [self, other]
|
135
134
|
end
|
136
135
|
|
137
|
-
#concat elements of a group, separated by sep and ordered by a list of Ascending or Descending
|
136
|
+
# concat elements of a group, separated by sep and ordered by a list of Ascending or Descending
|
138
137
|
def group_concat(sep = nil, *orders, group: nil, order: nil)
|
139
138
|
if orders.present?
|
140
139
|
warn("Warning : ArelExtensions: group_concat: you should now use the kwarg 'order' to specify an order in the group_concat.")
|
@@ -149,7 +148,7 @@ module ArelExtensions
|
|
149
148
|
ArelExtensions::Nodes::GroupConcat.new(self, sep, group: group, order: (order || order_tabs))
|
150
149
|
end
|
151
150
|
|
152
|
-
#Function returns a string after removing left, right or the both prefixes or suffixes int argument
|
151
|
+
# Function returns a string after removing left, right or the both prefixes or suffixes int argument
|
153
152
|
def trim other = ' '
|
154
153
|
ArelExtensions::Nodes::Trim.new [self, other]
|
155
154
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
namespace :arel_extensions do
|
2
2
|
desc 'Install DB functions into current DB'
|
3
|
-
task :
|
3
|
+
task install_functions: :environment do
|
4
4
|
@env_db = if ENV['DB'] == 'oracle' && ((defined?(RUBY_ENGINE) && RUBY_ENGINE == "rbx") || (RUBY_PLATFORM == 'java')) # not supported
|
5
5
|
(RUBY_PLATFORM == 'java' ? "jdbc-sqlite" : 'sqlite')
|
6
6
|
else
|
@@ -1,81 +1,89 @@
|
|
1
|
+
require 'arel_extensions/visitors/convert_format'
|
1
2
|
require 'arel_extensions/visitors/to_sql'
|
2
3
|
require 'arel_extensions/visitors/mysql'
|
3
|
-
require 'arel_extensions/visitors/oracle'
|
4
|
-
require 'arel_extensions/visitors/oracle12'
|
5
4
|
require 'arel_extensions/visitors/postgresql'
|
6
5
|
require 'arel_extensions/visitors/sqlite'
|
7
|
-
require 'arel_extensions/visitors/mssql'
|
8
6
|
|
9
|
-
|
10
|
-
|
7
|
+
if defined?(Arel::Visitors::Oracle)
|
8
|
+
require 'arel_extensions/visitors/oracle'
|
9
|
+
require 'arel_extensions/visitors/oracle12'
|
10
|
+
end
|
11
|
+
|
12
|
+
if defined?(Arel::Visitors::MSSQL)
|
13
|
+
require 'arel_extensions/visitors/mssql'
|
11
14
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
class Arel::Visitors::MSSQL
|
16
|
+
include ArelExtensions::Visitors::MSSQL
|
17
|
+
|
18
|
+
alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
|
19
|
+
def visit_Arel_Nodes_As o, collector
|
20
|
+
if o.left.is_a?(Arel::Nodes::Binary)
|
21
|
+
collector << '('
|
22
|
+
collector = visit o.left, collector
|
23
|
+
collector << ')'
|
24
|
+
else
|
25
|
+
collector = visit o.left, collector
|
26
|
+
end
|
27
|
+
collector << " AS ["
|
28
|
+
collector = visit o.right, collector
|
29
|
+
collector << "]"
|
30
|
+
collector
|
20
31
|
end
|
21
|
-
collector << " AS ["
|
22
|
-
collector = visit o.right, collector
|
23
|
-
collector << "]"
|
24
|
-
collector
|
25
|
-
end
|
26
32
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
alias_method(:old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement) rescue nil
|
34
|
+
def visit_Arel_Nodes_SelectStatement o, collector
|
35
|
+
if !collector.value.blank? && o.limit.blank? && o.offset.blank?
|
36
|
+
o = o.dup
|
37
|
+
o.orders = []
|
38
|
+
end
|
39
|
+
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
32
40
|
end
|
33
|
-
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
34
41
|
end
|
35
|
-
end
|
36
42
|
|
37
|
-
begin
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
+
begin
|
44
|
+
require 'arel_sqlserver'
|
45
|
+
if Arel::VERSION.to_i == 6
|
46
|
+
if Arel::Visitors::VISITORS['sqlserver'] && Arel::Visitors::VISITORS['sqlserver'] != Arel::Visitors::MSSQL
|
47
|
+
Arel::Visitors::VISITORS['sqlserver'].class_eval do
|
48
|
+
include ArelExtensions::Visitors::MSSQL
|
43
49
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
50
|
+
alias_method(:old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement) rescue nil
|
51
|
+
def visit_Arel_Nodes_SelectStatement o, collector
|
52
|
+
if !collector.value.blank? && o.limit.blank? && o.offset.blank?
|
53
|
+
o = o.dup
|
54
|
+
o.orders = []
|
55
|
+
end
|
56
|
+
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
49
57
|
end
|
50
|
-
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
51
|
-
end
|
52
58
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
59
|
+
alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
|
60
|
+
def visit_Arel_Nodes_As o, collector
|
61
|
+
if o.left.is_a?(Arel::Nodes::Binary)
|
62
|
+
collector << '('
|
63
|
+
collector = visit o.left, collector
|
64
|
+
collector << ')'
|
65
|
+
else
|
66
|
+
collector = visit o.left, collector
|
67
|
+
end
|
68
|
+
collector << " AS ["
|
69
|
+
collector = visit o.right, collector
|
70
|
+
collector << "]"
|
71
|
+
collector
|
61
72
|
end
|
62
|
-
collector << " AS ["
|
63
|
-
collector = visit o.right, collector
|
64
|
-
collector << "]"
|
65
|
-
collector
|
66
|
-
end
|
67
73
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
@connection.schema_cache.
|
73
|
-
|
74
|
+
alias_method(:old_primary_Key_From_Table, :primary_Key_From_Table) rescue nil
|
75
|
+
def primary_Key_From_Table t
|
76
|
+
return unless t
|
77
|
+
|
78
|
+
column_name = @connection.schema_cache.primary_keys(t.name) ||
|
79
|
+
@connection.schema_cache.columns_hash(t.name).first.try(:second).try(:name)
|
80
|
+
column_name ? t[column_name] : nil
|
81
|
+
end
|
74
82
|
end
|
75
83
|
end
|
76
84
|
end
|
77
|
-
end
|
78
85
|
rescue LoadError
|
79
|
-
rescue => e
|
80
|
-
|
86
|
+
rescue => e
|
87
|
+
e
|
88
|
+
end
|
81
89
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module ArelExtensions
|
2
|
+
module Visitors
|
3
|
+
# Convert date format in strftime syntax to whatever the RDBMs
|
4
|
+
# wants, based on the table of conversion +mapping+.
|
5
|
+
def self.strftime_to_format format, mapping
|
6
|
+
@mapping_regexps ||= {}
|
7
|
+
@mapping_regexps[mapping] ||=
|
8
|
+
Regexp.new(
|
9
|
+
mapping
|
10
|
+
.keys
|
11
|
+
.map{|k| Regexp.escape(k)}
|
12
|
+
.join('|')
|
13
|
+
)
|
14
|
+
|
15
|
+
regexp = @mapping_regexps[mapping]
|
16
|
+
s = StringScanner.new format
|
17
|
+
res = StringIO.new
|
18
|
+
while !s.eos?
|
19
|
+
res <<
|
20
|
+
case
|
21
|
+
when s.scan(regexp)
|
22
|
+
if v = mapping[s.matched]
|
23
|
+
v
|
24
|
+
else
|
25
|
+
# Should never happen.
|
26
|
+
s.matched
|
27
|
+
end
|
28
|
+
when s.scan(/[^%]+/)
|
29
|
+
s.matched
|
30
|
+
when s.scan(/./)
|
31
|
+
s.matched
|
32
|
+
end
|
33
|
+
end
|
34
|
+
res.string
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
3
|
class Arel::Visitors::IBM_DB
|
4
|
-
|
5
4
|
def visit_ArelExtensions_Nodes_Ceil o, collector
|
6
5
|
collector << "CEILING("
|
7
6
|
collector = visit o.expr, collector
|
@@ -12,14 +11,13 @@ module ArelExtensions
|
|
12
11
|
def visit_ArelExtensions_Nodes_Trim o, collector
|
13
12
|
collector << "LTRIM(RTRIM("
|
14
13
|
o.expressions.each_with_index { |arg, i|
|
15
|
-
collector <<
|
14
|
+
collector << COMMA if i != 0
|
16
15
|
collector = visit arg, collector
|
17
16
|
}
|
18
17
|
collector << "))"
|
19
18
|
collector
|
20
19
|
end
|
21
20
|
|
22
|
-
|
23
21
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
24
22
|
collector << "DAY("
|
25
23
|
collector = visit o.left, collector
|
@@ -33,9 +31,8 @@ module ArelExtensions
|
|
33
31
|
collector
|
34
32
|
end
|
35
33
|
|
36
|
-
|
37
34
|
def visit_ArelExtensions_Nodes_Duration o, collector
|
38
|
-
#visit left for period
|
35
|
+
# visit left for period
|
39
36
|
if o.left == "d"
|
40
37
|
collector << "DAY("
|
41
38
|
elsif o.left == "m"
|
@@ -45,7 +42,7 @@ module ArelExtensions
|
|
45
42
|
elsif o.left == "y"
|
46
43
|
collector << "YEAR("
|
47
44
|
end
|
48
|
-
#visit right
|
45
|
+
# visit right
|
49
46
|
if o.right.is_a?(Arel::Attributes::Attribute)
|
50
47
|
collector = visit o.right, collector
|
51
48
|
else
|
@@ -55,12 +52,11 @@ module ArelExtensions
|
|
55
52
|
collector
|
56
53
|
end
|
57
54
|
|
58
|
-
|
59
55
|
def visit_ArelExtensions_Nodes_IsNull o, collector
|
60
56
|
collector << "COALESCE("
|
61
57
|
collector = visit o.left, collector
|
62
58
|
collector << ","
|
63
|
-
if(o.right.is_a?(Arel::Attributes::Attribute))
|
59
|
+
if (o.right.is_a?(Arel::Attributes::Attribute))
|
64
60
|
collector = visit o.right, collector
|
65
61
|
else
|
66
62
|
collector << "'#{o.right}'"
|
@@ -68,9 +64,6 @@ module ArelExtensions
|
|
68
64
|
collector << ")"
|
69
65
|
collector
|
70
66
|
end
|
71
|
-
|
72
|
-
|
73
|
-
|
74
67
|
end
|
75
68
|
end
|
76
69
|
end
|
@@ -1,13 +1,26 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Visitors
|
3
3
|
module MSSQL
|
4
|
-
|
4
|
+
|
5
|
+
Arel::Visitors::MSSQL::DATE_MAPPING = {
|
6
|
+
'd' => 'day', 'm' => 'month', 'y' => 'year', 'wd' => 'weekday', 'w' => 'week', 'h' => 'hour', 'mn' => 'minute', 's' => 'second'
|
7
|
+
}.freeze
|
8
|
+
|
5
9
|
Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES = {
|
6
10
|
'%Y' => 'YYYY', '%C' => '', '%y' => 'YY', '%m' => 'MM', '%B' => '', '%b' => '', '%^b' => '', # year, month
|
7
11
|
'%d' => 'DD', '%e' => '', '%j' => '', '%w' => 'dw', '%A' => '', # day, weekday
|
8
12
|
'%H' => 'hh', '%k' => '', '%I' => '', '%l' => '', '%P' => '', '%p' => '', # hours
|
9
13
|
'%M' => 'mi', '%S' => 'ss', '%L' => 'ms', '%N' => 'ns', '%z' => 'tz'
|
10
|
-
}
|
14
|
+
}.freeze
|
15
|
+
|
16
|
+
Arel::Visitors::MSSQL::DATE_FORMAT_REGEX =
|
17
|
+
Regexp.new(
|
18
|
+
Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES
|
19
|
+
.keys
|
20
|
+
.map{|k| Regexp.escape(k)}
|
21
|
+
.join('|')
|
22
|
+
).freeze
|
23
|
+
|
11
24
|
# TODO; all others... http://www.sql-server-helper.com/tips/date-formats.aspx
|
12
25
|
Arel::Visitors::MSSQL::DATE_CONVERT_FORMATS = {
|
13
26
|
'YYYY-MM-DD' => 120,
|
@@ -19,7 +32,7 @@ module ArelExtensions
|
|
19
32
|
'DD-MM-YY' => 5,
|
20
33
|
'DD.MM.YYYY' => 104,
|
21
34
|
'YYYY-MM-DDTHH:MM:SS:MMM' => 126
|
22
|
-
}
|
35
|
+
}.freeze
|
23
36
|
|
24
37
|
# Math Functions
|
25
38
|
def visit_ArelExtensions_Nodes_Ceil o, collector
|
@@ -32,7 +45,7 @@ module ArelExtensions
|
|
32
45
|
def visit_ArelExtensions_Nodes_Log10 o, collector
|
33
46
|
collector << "LOG10("
|
34
47
|
o.expressions.each_with_index { |arg, i|
|
35
|
-
collector << Arel::Visitors::ToSql::COMMA
|
48
|
+
collector << Arel::Visitors::ToSql::COMMA if i != 0
|
36
49
|
collector = visit arg, collector
|
37
50
|
}
|
38
51
|
collector << ")"
|
@@ -42,7 +55,7 @@ module ArelExtensions
|
|
42
55
|
def visit_ArelExtensions_Nodes_Power o, collector
|
43
56
|
collector << "POWER("
|
44
57
|
o.expressions.each_with_index { |arg, i|
|
45
|
-
collector << Arel::Visitors::ToSql::COMMA
|
58
|
+
collector << Arel::Visitors::ToSql::COMMA if i != 0
|
46
59
|
collector = visit arg, collector
|
47
60
|
}
|
48
61
|
collector << ")"
|
@@ -66,7 +79,7 @@ module ArelExtensions
|
|
66
79
|
def visit_ArelExtensions_Nodes_Concat o, collector
|
67
80
|
collector << "CONCAT("
|
68
81
|
o.expressions.each_with_index { |arg, i|
|
69
|
-
collector << Arel::Visitors::MSSQL::COMMA
|
82
|
+
collector << Arel::Visitors::MSSQL::COMMA if i != 0
|
70
83
|
collector = visit arg, collector
|
71
84
|
}
|
72
85
|
collector << ")"
|
@@ -76,7 +89,7 @@ module ArelExtensions
|
|
76
89
|
def visit_ArelExtensions_Nodes_Repeat o, collector
|
77
90
|
collector << "REPLICATE("
|
78
91
|
o.expressions.each_with_index { |arg, i|
|
79
|
-
collector << Arel::Visitors::ToSql::COMMA
|
92
|
+
collector << Arel::Visitors::ToSql::COMMA if i != 0
|
80
93
|
collector = visit arg, collector
|
81
94
|
}
|
82
95
|
collector << ")"
|
@@ -86,12 +99,12 @@ module ArelExtensions
|
|
86
99
|
|
87
100
|
|
88
101
|
def visit_ArelExtensions_Nodes_DateDiff o, collector
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
102
|
+
case o.right_node_type
|
103
|
+
when :ruby_date, :ruby_time, :date, :datetime, :time
|
104
|
+
collector << case o.left_node_type
|
105
|
+
when :ruby_time, :datetime, :time then 'DATEDIFF(second'
|
106
|
+
else 'DATEDIFF(day'
|
107
|
+
end
|
95
108
|
collector << Arel::Visitors::MSSQL::COMMA
|
96
109
|
collector = visit o.right, collector
|
97
110
|
collector << Arel::Visitors::MSSQL::COMMA
|
@@ -151,7 +164,7 @@ module ArelExtensions
|
|
151
164
|
def visit_ArelExtensions_Nodes_Round o, collector
|
152
165
|
collector << "ROUND("
|
153
166
|
o.expressions.each_with_index { |arg, i|
|
154
|
-
collector << Arel::Visitors::MSSQL::COMMA
|
167
|
+
collector << Arel::Visitors::MSSQL::COMMA if i != 0
|
155
168
|
collector = visit arg, collector
|
156
169
|
}
|
157
170
|
if o.expressions.length == 1
|
@@ -242,42 +255,34 @@ module ArelExtensions
|
|
242
255
|
end
|
243
256
|
|
244
257
|
def visit_ArelExtensions_Nodes_Format o, collector
|
245
|
-
f = o.iso_format
|
246
|
-
Arel::Visitors::MSSQL::
|
247
|
-
if Arel::Visitors::MSSQL::DATE_CONVERT_FORMATS[f]
|
258
|
+
f = ArelExtensions::Visitors::strftime_to_format(o.iso_format, Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES)
|
259
|
+
if fmt = Arel::Visitors::MSSQL::DATE_CONVERT_FORMATS[f]
|
248
260
|
collector << "CONVERT(VARCHAR(#{f.length})"
|
249
261
|
collector << Arel::Visitors::MSSQL::COMMA
|
250
262
|
collector = visit o.left, collector
|
251
263
|
collector << Arel::Visitors::MSSQL::COMMA
|
252
|
-
collector <<
|
264
|
+
collector << fmt.to_s
|
253
265
|
collector << ')'
|
254
266
|
collector
|
255
267
|
else
|
268
|
+
s = StringScanner.new o.iso_format
|
256
269
|
collector << "("
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
collector << ')))'
|
272
|
-
if str.length > 1
|
273
|
-
collector << ' + '
|
274
|
-
collector = visit Arel::Nodes.build_quoted(str.sub(/\A./, '')), collector
|
275
|
-
end
|
276
|
-
end
|
270
|
+
sep = ''
|
271
|
+
while !s.eos?
|
272
|
+
collector << sep
|
273
|
+
sep = ' + '
|
274
|
+
case
|
275
|
+
when s.scan(Arel::Visitors::MSSQL::DATE_FORMAT_REGEX)
|
276
|
+
dir = Arel::Visitors::MSSQL::DATE_FORMAT_DIRECTIVES[s.matched]
|
277
|
+
collector << 'LTRIM(STR(DATEPART('
|
278
|
+
collector << dir
|
279
|
+
collector << Arel::Visitors::MSSQL::COMMA
|
280
|
+
collector = visit o.left, collector
|
281
|
+
collector << ')))'
|
282
|
+
when s.scan(/[^%]+|./)
|
283
|
+
collector = visit Arel::Nodes.build_quoted(s.matched), collector
|
277
284
|
end
|
278
|
-
|
279
|
-
}
|
280
|
-
|
285
|
+
end
|
281
286
|
collector << ')'
|
282
287
|
collector
|
283
288
|
end
|
@@ -286,7 +291,7 @@ module ArelExtensions
|
|
286
291
|
def visit_ArelExtensions_Nodes_Replace o, collector
|
287
292
|
collector << "REPLACE("
|
288
293
|
o.expressions.each_with_index { |arg, i|
|
289
|
-
collector << Arel::Visitors::MSSQL::COMMA
|
294
|
+
collector << Arel::Visitors::MSSQL::COMMA if i != 0
|
290
295
|
collector = visit arg, collector
|
291
296
|
}
|
292
297
|
collector << ")"
|
@@ -296,7 +301,7 @@ module ArelExtensions
|
|
296
301
|
def visit_ArelExtensions_Nodes_FindInSet o, collector
|
297
302
|
collector << "dbo.FIND_IN_SET("
|
298
303
|
o.expressions.each_with_index { |arg, i|
|
299
|
-
collector << Arel::Visitors::MSSQL::COMMA
|
304
|
+
collector << Arel::Visitors::MSSQL::COMMA if i != 0
|
300
305
|
collector = visit arg, collector
|
301
306
|
}
|
302
307
|
collector << ")"
|
@@ -409,7 +414,7 @@ module ArelExtensions
|
|
409
414
|
collector << ") WITHIN GROUP (ORDER BY "
|
410
415
|
if o.order.present?
|
411
416
|
o.order.each_with_index do |order,i|
|
412
|
-
collector << Arel::Visitors::Oracle::COMMA
|
417
|
+
collector << Arel::Visitors::Oracle::COMMA if i != 0
|
413
418
|
collector = visit order, collector
|
414
419
|
end
|
415
420
|
else
|