arel_extensions 2.0.13 → 2.0.14
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/Gemfile +10 -10
- data/Rakefile +4 -4
- 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 +2 -2
- data/lib/arel_extensions/attributes.rb +0 -0
- data/lib/arel_extensions/boolean_functions.rb +3 -7
- data/lib/arel_extensions/common_sql_functions.rb +0 -2
- 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 +0 -1
- 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 +4 -5
- 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 +1 -0
- data/lib/arel_extensions/nodes/formatted_number.rb +0 -1
- data/lib/arel_extensions/nodes/function.rb +2 -3
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +0 -6
- 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 +2 -3
- 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 +9 -7
- 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 +48 -44
- data/lib/arel_extensions/visitors/mysql.rb +63 -65
- data/lib/arel_extensions/visitors/oracle.rb +48 -55
- data/lib/arel_extensions/visitors/oracle12.rb +2 -3
- data/lib/arel_extensions/visitors/postgresql.rb +39 -34
- data/lib/arel_extensions/visitors/sqlite.rb +23 -18
- data/lib/arel_extensions/visitors/to_sql.rb +42 -44
- data/test/arelx_test_helper.rb +0 -2
- data/test/real_db_test.rb +26 -41
- 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 +134 -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 +3 -2
@@ -1,7 +1,6 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Nodes
|
3
3
|
class IMatches < Arel::Nodes::Matches
|
4
|
-
|
5
4
|
attr_accessor :case_sensitive if Arel::VERSION.to_i < 7
|
6
5
|
|
7
6
|
def initialize(left, right, escape = nil)
|
@@ -26,6 +25,5 @@ module ArelExtensions
|
|
26
25
|
|
27
26
|
class SMatches < IMatches
|
28
27
|
end
|
29
|
-
|
30
28
|
end
|
31
29
|
end
|
@@ -14,7 +14,6 @@ module ArelExtensions
|
|
14
14
|
def +(other)
|
15
15
|
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
16
16
|
end
|
17
|
-
|
18
17
|
end
|
19
18
|
|
20
19
|
class RegexpReplace < Function
|
@@ -32,6 +31,5 @@ module ArelExtensions
|
|
32
31
|
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
33
32
|
end
|
34
33
|
end
|
35
|
-
|
36
34
|
end
|
37
35
|
end
|
File without changes
|
File without changes
|
@@ -13,7 +13,6 @@ module ArelExtensions
|
|
13
13
|
def +(other)
|
14
14
|
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
15
15
|
end
|
16
|
-
|
17
16
|
end
|
18
17
|
|
19
18
|
class Ltrim < Trim
|
@@ -23,6 +22,5 @@ module ArelExtensions
|
|
23
22
|
class Rtrim < Trim
|
24
23
|
RETURN_TYPE = :string
|
25
24
|
end
|
26
|
-
|
27
25
|
end
|
28
26
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Nodes
|
3
3
|
class Union < Arel::Nodes::Union
|
4
|
-
|
5
4
|
def initialize left,right
|
6
5
|
return super(left,right)
|
7
6
|
end
|
@@ -18,6 +17,5 @@ module ArelExtensions
|
|
18
17
|
Arel::Nodes::TableAlias.new Arel::Nodes::Grouping.new(self), Arel::Nodes::SqlLiteral.new(other.to_s)
|
19
18
|
end
|
20
19
|
end
|
21
|
-
|
22
20
|
end
|
23
21
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Nodes
|
3
3
|
class UnionAll < Arel::Nodes::UnionAll
|
4
|
-
|
5
4
|
def initialize left,right
|
6
5
|
return super(left,right)
|
7
6
|
end
|
@@ -14,6 +13,5 @@ module ArelExtensions
|
|
14
13
|
Arel::Nodes::TableAlias.new Arel::Nodes::Grouping.new(self), Arel::Nodes::SqlLiteral.new(other.to_s)
|
15
14
|
end
|
16
15
|
end
|
17
|
-
|
18
16
|
end
|
19
17
|
end
|
@@ -3,23 +3,21 @@ require 'arel_extensions/nodes/is_null'
|
|
3
3
|
|
4
4
|
module ArelExtensions
|
5
5
|
module NullFunctions
|
6
|
-
|
7
|
-
#ISNULL function lets you return an alternative value when an expression is NULL.
|
6
|
+
# ISNULL function lets you return an alternative value when an expression is NULL.
|
8
7
|
def is_null
|
9
8
|
ArelExtensions::Nodes::IsNull.new [self]
|
10
9
|
end
|
11
10
|
|
12
|
-
#ISNOTNULL function lets you return an alternative value when an expression is NOT NULL.
|
11
|
+
# ISNOTNULL function lets you return an alternative value when an expression is NOT NULL.
|
13
12
|
def is_not_null
|
14
13
|
ArelExtensions::Nodes::IsNotNull.new [self]
|
15
14
|
end
|
16
15
|
|
17
16
|
# returns the first non-null expr in the expression list. You must specify at least two expressions.
|
18
|
-
#If all occurrences of expr evaluate to null, then the function returns null.
|
17
|
+
# If all occurrences of expr evaluate to null, then the function returns null.
|
19
18
|
def coalesce *args
|
20
19
|
args.unshift(self)
|
21
20
|
ArelExtensions::Nodes::Coalesce.new args
|
22
21
|
end
|
23
|
-
|
24
22
|
end
|
25
23
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module ArelExtensions
|
2
2
|
module Predications
|
3
|
-
|
4
3
|
def when right, expression = nil
|
5
4
|
ArelExtensions::Nodes::Case.new(self).when(right,expression)
|
6
5
|
end
|
@@ -21,7 +20,7 @@ module ArelExtensions
|
|
21
20
|
ArelExtensions::Nodes::Cast.new([self,right])
|
22
21
|
end
|
23
22
|
|
24
|
-
def in(*other) #In should handle nil element in the Array
|
23
|
+
def in(*other) # In should handle nil element in the Array
|
25
24
|
other = other.first if other.length <= 1
|
26
25
|
case other
|
27
26
|
when Range
|
@@ -49,7 +48,7 @@ module ArelExtensions
|
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
52
|
-
def not_in(*other) #In should handle nil element in the Array
|
51
|
+
def not_in(*other) # In should handle nil element in the Array
|
53
52
|
other = other.first if other.length <= 1
|
54
53
|
case other
|
55
54
|
when Range
|
@@ -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,3 +1,4 @@
|
|
1
|
+
require 'arel_extensions/visitors/convert_format'
|
1
2
|
require 'arel_extensions/visitors/to_sql'
|
2
3
|
require 'arel_extensions/visitors/mysql'
|
3
4
|
require 'arel_extensions/visitors/oracle'
|
@@ -9,7 +10,7 @@ require 'arel_extensions/visitors/mssql'
|
|
9
10
|
class Arel::Visitors::MSSQL
|
10
11
|
include ArelExtensions::Visitors::MSSQL
|
11
12
|
|
12
|
-
alias_method
|
13
|
+
alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
|
13
14
|
def visit_Arel_Nodes_As o, collector
|
14
15
|
if o.left.is_a?(Arel::Nodes::Binary)
|
15
16
|
collector << '('
|
@@ -24,7 +25,7 @@ class Arel::Visitors::MSSQL
|
|
24
25
|
collector
|
25
26
|
end
|
26
27
|
|
27
|
-
alias_method
|
28
|
+
alias_method(:old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement) rescue nil
|
28
29
|
def visit_Arel_Nodes_SelectStatement o, collector
|
29
30
|
if !collector.value.blank? && o.limit.blank? && o.offset.blank?
|
30
31
|
o = o.dup
|
@@ -41,7 +42,7 @@ begin
|
|
41
42
|
Arel::Visitors::VISITORS['sqlserver'].class_eval do
|
42
43
|
include ArelExtensions::Visitors::MSSQL
|
43
44
|
|
44
|
-
alias_method
|
45
|
+
alias_method(:old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement) rescue nil
|
45
46
|
def visit_Arel_Nodes_SelectStatement o, collector
|
46
47
|
if !collector.value.blank? && o.limit.blank? && o.offset.blank?
|
47
48
|
o = o.dup
|
@@ -50,7 +51,7 @@ begin
|
|
50
51
|
old_visit_Arel_Nodes_SelectStatement(o,collector)
|
51
52
|
end
|
52
53
|
|
53
|
-
alias_method
|
54
|
+
alias_method(:old_visit_Arel_Nodes_As, :visit_Arel_Nodes_As) rescue nil
|
54
55
|
def visit_Arel_Nodes_As o, collector
|
55
56
|
if o.left.is_a?(Arel::Nodes::Binary)
|
56
57
|
collector << '('
|
@@ -65,17 +66,18 @@ begin
|
|
65
66
|
collector
|
66
67
|
end
|
67
68
|
|
68
|
-
alias_method
|
69
|
+
alias_method(:old_primary_Key_From_Table, :primary_Key_From_Table) rescue nil
|
69
70
|
def primary_Key_From_Table t
|
70
71
|
return unless t
|
72
|
+
|
71
73
|
column_name = @connection.schema_cache.primary_keys(t.name) ||
|
72
|
-
|
74
|
+
@connection.schema_cache.columns_hash(t.name).first.try(:second).try(:name)
|
73
75
|
column_name ? t[column_name] : nil
|
74
76
|
end
|
75
77
|
end
|
76
78
|
end
|
77
79
|
end
|
78
|
-
|
80
|
+
rescue LoadError
|
79
81
|
rescue => e
|
80
82
|
e
|
81
83
|
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
|