arel_extensions 1.5.3 → 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 +90 -239
- 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 +10 -10
- 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 -48
- 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 +7 -5
- 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 +43 -44
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +36 -82
- 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 +192 -423
- data/lib/arel_extensions/visitors/mysql.rb +212 -354
- data/lib/arel_extensions/visitors/oracle.rb +178 -221
- data/lib/arel_extensions/visitors/oracle12.rb +31 -18
- data/lib/arel_extensions/visitors/postgresql.rb +173 -257
- data/lib/arel_extensions/visitors/sqlite.rb +126 -140
- data/lib/arel_extensions/visitors/to_sql.rb +237 -299
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +31 -226
- data/test/database.yml +7 -15
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +117 -120
- data/test/support/fake_record.rb +3 -9
- data/test/test_comparators.rb +17 -14
- data/test/visitors/test_bulk_insert_oracle.rb +11 -11
- data/test/visitors/test_bulk_insert_sqlite.rb +13 -12
- 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 +366 -721
- data/test/with_ar/insert_agnostic_test.rb +21 -27
- data/test/with_ar/test_bulk_sqlite.rb +16 -17
- data/test/with_ar/test_math_sqlite.rb +26 -26
- data/test/with_ar/test_string_mysql.rb +33 -31
- data/test/with_ar/test_string_sqlite.rb +34 -30
- metadata +37 -47
- data/.github/workflows/publish.yml +0 -30
- data/.github/workflows/release.yml +0 -30
- data/.github/workflows/ruby.yml +0 -403
- data/CONTRIBUTING.md +0 -102
- data/NEWS.md +0 -109
- data/bin/build +0 -15
- data/bin/compose +0 -6
- data/bin/publish +0 -8
- data/dev/arelx.dockerfile +0 -44
- data/dev/compose.yaml +0 -71
- data/dev/postgres.dockerfile +0 -5
- data/dev/rbenv +0 -189
- data/gemfiles/rails4_2.gemfile +0 -38
- 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/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/helpers.rb +0 -62
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- 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 -92
- data/version_v1.rb +0 -3
- data/version_v2.rb +0 -3
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
2
|
+
module Nodes
|
|
3
|
+
class FormattedNumber < Function
|
|
4
|
+
RETURN_TYPE = :string
|
|
5
|
+
|
|
6
|
+
attr_accessor :locale, :prefix, :suffix, :flags, :scientific_notation, :width,:precision, :type, :original_string
|
|
7
|
+
|
|
8
|
+
def initialize expr
|
|
9
|
+
# expr[1] = {:locale => 'fr_FR', :type => "e"/"f"/"d", :prefix => "$ ", :suffix => " %", :flags => " +-#0", :width => 5, :precision => 6}
|
|
10
|
+
col = expr.first
|
|
11
|
+
@locale = expr[1][:locale]
|
|
12
|
+
@prefix = expr[1][:prefix]
|
|
13
|
+
@suffix = expr[1][:suffix]
|
|
14
|
+
@width = expr[1][:width]
|
|
15
|
+
@precision = expr[1][:precision]
|
|
16
|
+
@type = expr[1][:type]
|
|
17
|
+
@flags = expr[1][:flags]
|
|
18
|
+
@scientific_notation = /[eE]/.match(expr[1][:type]) || false
|
|
19
|
+
@original_string = expr[1][:original_string]
|
|
20
|
+
super [col]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
24
25
|
end
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
require 'arel_extensions/predications'
|
|
2
2
|
|
|
3
|
-
# This is required for rails 6.1
|
|
4
|
-
# See https://github.com/thoughtbot/shoulda-matchers/issues/335
|
|
5
|
-
if !Array.respond_to?(:wrap)
|
|
6
|
-
require 'active_support/core_ext/array/wrap'
|
|
7
|
-
end
|
|
8
|
-
|
|
9
3
|
module ArelExtensions
|
|
10
4
|
module Nodes
|
|
11
5
|
class Function < Arel::Nodes::Function
|
|
@@ -16,10 +10,6 @@ module ArelExtensions
|
|
|
16
10
|
|
|
17
11
|
RETURN_TYPE = :string # by default...
|
|
18
12
|
|
|
19
|
-
# Support multibyte string if they are available.
|
|
20
|
-
MBSTRING =
|
|
21
|
-
defined?(ActiveSupport::Multibyte::Chars) ? ActiveSupport::Multibyte::Chars : String
|
|
22
|
-
|
|
23
13
|
# overrides as to make new Node like AliasPredication
|
|
24
14
|
|
|
25
15
|
def return_type
|
|
@@ -27,15 +17,11 @@ module ArelExtensions
|
|
|
27
17
|
end
|
|
28
18
|
|
|
29
19
|
def as other
|
|
30
|
-
|
|
31
|
-
if Gem::Version.new(Arel::VERSION) >= Gem::Version.new('9.0.0')
|
|
32
|
-
self.alias = Arel.sql(other)
|
|
33
|
-
end
|
|
34
|
-
res
|
|
20
|
+
Arel::Nodes::As.new(self, Arel.sql(other))
|
|
35
21
|
end
|
|
36
22
|
|
|
37
23
|
def expr
|
|
38
|
-
|
|
24
|
+
@expressions.first
|
|
39
25
|
end
|
|
40
26
|
|
|
41
27
|
def left
|
|
@@ -47,21 +33,25 @@ module ArelExtensions
|
|
|
47
33
|
end
|
|
48
34
|
|
|
49
35
|
def ==(other)
|
|
50
|
-
Arel::Nodes::Equality.new self, Arel.
|
|
36
|
+
Arel::Nodes::Equality.new self, Arel::Nodes.build_quoted(other, self)
|
|
51
37
|
end
|
|
52
38
|
|
|
53
39
|
def !=(other)
|
|
54
|
-
Arel::Nodes::NotEqual.new self, Arel.
|
|
40
|
+
Arel::Nodes::NotEqual.new self, Arel::Nodes.build_quoted(other, self)
|
|
55
41
|
end
|
|
56
42
|
|
|
57
43
|
def type_of_attribute(att)
|
|
58
44
|
case att
|
|
59
45
|
when Arel::Attributes::Attribute
|
|
60
|
-
|
|
46
|
+
begin
|
|
47
|
+
Arel::Table.engine.connection.schema_cache.columns_hash(att.relation.table_name)[att.name.to_s].type
|
|
48
|
+
rescue
|
|
49
|
+
att
|
|
50
|
+
end
|
|
61
51
|
when ArelExtensions::Nodes::Function
|
|
62
52
|
att.return_type
|
|
63
|
-
|
|
64
|
-
|
|
53
|
+
# else
|
|
54
|
+
# nil
|
|
65
55
|
end
|
|
66
56
|
end
|
|
67
57
|
|
|
@@ -70,21 +60,19 @@ module ArelExtensions
|
|
|
70
60
|
when Arel::Attributes::Attribute, Arel::Nodes::Node, Integer
|
|
71
61
|
object
|
|
72
62
|
when DateTime
|
|
73
|
-
Arel.
|
|
63
|
+
Arel::Nodes.build_quoted(object, self)
|
|
74
64
|
when Time
|
|
75
|
-
Arel.
|
|
76
|
-
when
|
|
77
|
-
Arel.
|
|
65
|
+
Arel::Nodes.build_quoted(object.strftime('%H:%M:%S'), self)
|
|
66
|
+
when String, Symbol
|
|
67
|
+
Arel::Nodes.build_quoted(object.to_s)
|
|
78
68
|
when Date
|
|
79
|
-
Arel.
|
|
69
|
+
Arel::Nodes.build_quoted(object.to_s, self)
|
|
80
70
|
when NilClass
|
|
81
71
|
Arel.sql('NULL')
|
|
82
72
|
when ActiveSupport::Duration
|
|
83
73
|
Arel.sql(object.to_i)
|
|
84
|
-
when Array
|
|
85
|
-
Arel.grouping(object.map{|e| convert_to_node(e)})
|
|
86
74
|
else
|
|
87
|
-
raise(ArgumentError, "#{object.class}
|
|
75
|
+
raise(ArgumentError, "#{object.class} can not be converted to CONCAT arg")
|
|
88
76
|
end
|
|
89
77
|
end
|
|
90
78
|
|
|
@@ -93,7 +81,7 @@ module ArelExtensions
|
|
|
93
81
|
when Arel::Nodes::Node
|
|
94
82
|
object
|
|
95
83
|
when Integer
|
|
96
|
-
Arel.
|
|
84
|
+
Arel::Nodes.build_quoted(object.to_s)
|
|
97
85
|
when Arel::Attributes::Attribute
|
|
98
86
|
case self.type_of_attribute(object)
|
|
99
87
|
when :date
|
|
@@ -104,19 +92,19 @@ module ArelExtensions
|
|
|
104
92
|
object
|
|
105
93
|
end
|
|
106
94
|
when DateTime
|
|
107
|
-
Arel.
|
|
95
|
+
Arel::Nodes.build_quoted(object, self)
|
|
108
96
|
when Time
|
|
109
|
-
Arel.
|
|
110
|
-
when
|
|
111
|
-
Arel.
|
|
97
|
+
Arel::Nodes.build_quoted(object.strftime('%H:%M:%S'), self)
|
|
98
|
+
when String
|
|
99
|
+
Arel::Nodes.build_quoted(object)
|
|
112
100
|
when Date
|
|
113
|
-
Arel.
|
|
101
|
+
Arel::Nodes.build_quoted(object, self)
|
|
114
102
|
when NilClass
|
|
115
103
|
Arel.sql(nil)
|
|
116
104
|
when ActiveSupport::Duration
|
|
117
|
-
Arel.
|
|
105
|
+
Arel::Nodes.build_quoted(object.to_i.to_s)
|
|
118
106
|
else
|
|
119
|
-
raise(ArgumentError, "#{object.class}
|
|
107
|
+
raise(ArgumentError, "#{object.class} can not be converted to CONCAT arg")
|
|
120
108
|
end
|
|
121
109
|
end
|
|
122
110
|
|
|
@@ -125,13 +113,13 @@ module ArelExtensions
|
|
|
125
113
|
when Arel::Attributes::Attribute, Arel::Nodes::Node
|
|
126
114
|
object
|
|
127
115
|
when DateTime, Time
|
|
128
|
-
Arel.
|
|
129
|
-
when
|
|
130
|
-
Arel.
|
|
116
|
+
Arel::Nodes.build_quoted(Date.new(object.year, object.month, object.day), self)
|
|
117
|
+
when String
|
|
118
|
+
Arel::Nodes.build_quoted(Date.parse(object), self)
|
|
131
119
|
when Date
|
|
132
|
-
Arel.
|
|
120
|
+
Arel::Nodes.build_quoted(object, self)
|
|
133
121
|
else
|
|
134
|
-
raise(ArgumentError, "#{object.class}
|
|
122
|
+
raise(ArgumentError, "#{object.class} can not be converted to Date")
|
|
135
123
|
end
|
|
136
124
|
end
|
|
137
125
|
|
|
@@ -140,13 +128,13 @@ module ArelExtensions
|
|
|
140
128
|
when Arel::Attributes::Attribute, Arel::Nodes::Node
|
|
141
129
|
object
|
|
142
130
|
when DateTime, Time
|
|
143
|
-
Arel.
|
|
144
|
-
when
|
|
145
|
-
Arel.
|
|
131
|
+
Arel::Nodes.build_quoted(object, self)
|
|
132
|
+
when String
|
|
133
|
+
Arel::Nodes.build_quoted(Time.parse(object), self)
|
|
146
134
|
when Date
|
|
147
|
-
Arel.
|
|
135
|
+
Arel::Nodes.build_quoted(Time.utc(object.year, object.month, object.day, 0, 0, 0), self)
|
|
148
136
|
else
|
|
149
|
-
raise(ArgumentError, "#{object.class}
|
|
137
|
+
raise(ArgumentError, "#{object.class} can not be converted to Datetime")
|
|
150
138
|
end
|
|
151
139
|
end
|
|
152
140
|
|
|
@@ -164,9 +152,10 @@ module ArelExtensions
|
|
|
164
152
|
when NilClass
|
|
165
153
|
0
|
|
166
154
|
else
|
|
167
|
-
raise(ArgumentError, "#{object.class}
|
|
155
|
+
raise(ArgumentError, "#{object.class} can not be converted to NUMBER arg")
|
|
168
156
|
end
|
|
169
157
|
end
|
|
158
|
+
|
|
170
159
|
end
|
|
171
160
|
end
|
|
172
161
|
end
|
|
File without changes
|
|
@@ -11,76 +11,56 @@ module ArelExtensions
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def get key
|
|
14
|
-
JsonGet.new(self,
|
|
14
|
+
JsonGet.new(self,key)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def set key, value
|
|
18
|
-
JsonSet.new(self,
|
|
18
|
+
JsonSet.new(self,key,value)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
def group as_array = true, orders
|
|
22
|
-
|
|
23
|
-
JsonGroup.new(Arel::Nodes::NamedFunction.new('DISTINCT', [self]), as_array, orders)
|
|
24
|
-
else
|
|
25
|
-
JsonGroup.new(self, as_array, orders)
|
|
26
|
-
end
|
|
21
|
+
def group as_array = true, orders= nil
|
|
22
|
+
JsonGroup.new(self,as_array, orders)
|
|
27
23
|
end
|
|
28
24
|
|
|
29
25
|
def hash
|
|
30
26
|
[@dict].hash
|
|
31
27
|
end
|
|
32
28
|
|
|
33
|
-
def convert_to_json_node(n)
|
|
34
|
-
case n
|
|
35
|
-
when JsonNode
|
|
36
|
-
n.dict
|
|
37
|
-
when Array
|
|
38
|
-
n.map{|e|
|
|
39
|
-
(e.is_a?(Array) || e.is_a?(Hash)) ? Json.new(e) : convert_to_json_node(e)
|
|
40
|
-
}
|
|
41
|
-
when Hash
|
|
42
|
-
n.reduce({}){|acc, v|
|
|
43
|
-
acc[convert_to_json_node(v[0])] = (v[1].is_a?(Array) || v[1].is_a?(Hash)) ? Json.new(v[1]) : convert_to_json_node(v[1])
|
|
44
|
-
acc
|
|
45
|
-
}
|
|
46
|
-
when String, Numeric, TrueClass, FalseClass
|
|
47
|
-
convert_to_node(n)
|
|
48
|
-
when Date
|
|
49
|
-
convert_to_node(n.strftime('%Y-%m-%d'))
|
|
50
|
-
when DateTime, Time
|
|
51
|
-
convert_to_node(n.strftime('%Y-%m-%dT%H:%M:%S.%L%:z'))
|
|
52
|
-
when NilClass
|
|
53
|
-
Arel.null
|
|
54
|
-
when Arel::SelectManager
|
|
55
|
-
Arel.grouping(n)
|
|
56
|
-
else
|
|
57
|
-
convert_to_node(n)
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def type_of_node(v)
|
|
62
|
-
if v.is_a?(Arel::Attributes::Attribute)
|
|
63
|
-
self.type_of_attribute(v)
|
|
64
|
-
elsif v.respond_to?(:return_type)
|
|
65
|
-
v.return_type
|
|
66
|
-
elsif v.nil?
|
|
67
|
-
:nil
|
|
68
|
-
else
|
|
69
|
-
:string
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
29
|
end
|
|
73
30
|
|
|
74
31
|
class Json < JsonNode
|
|
32
|
+
|
|
75
33
|
def initialize *expr
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
34
|
+
if expr.length == 1
|
|
35
|
+
case expr.first
|
|
36
|
+
when JsonNode
|
|
37
|
+
@dict = expr.first.dict
|
|
38
|
+
when Array
|
|
39
|
+
@dict = expr.first.map{|e|
|
|
40
|
+
(e.is_a?(Array) || e.is_a?(Hash)) ? Json.new(e) : convert_to_node(e)
|
|
41
|
+
}
|
|
42
|
+
when Hash
|
|
43
|
+
@dict = expr.first.inject({}){|acc,v|
|
|
44
|
+
acc[convert_to_node(v[0])] = (v[1].is_a?(Array) || v[1].is_a?(Hash)) ? Json.new(v[1]) : convert_to_node(v[1])
|
|
45
|
+
acc
|
|
46
|
+
}
|
|
47
|
+
when String, Numeric, TrueClass, FalseClass
|
|
48
|
+
@dict = convert_to_node(expr.first)
|
|
49
|
+
when NilClass
|
|
50
|
+
@dict = Arel.sql('null')
|
|
79
51
|
else
|
|
80
|
-
expr.
|
|
52
|
+
if expr.first.is_a?(String) || (expr.first.is_a?(Arel::Attributes::Attribute) && type_of_attribute(expr.first) == :string) || (expr.first.return_type == :string)
|
|
53
|
+
@dict = convert_to_node(expr.first)
|
|
54
|
+
else
|
|
55
|
+
@dict = [convert_to_node(expr.first)]
|
|
56
|
+
end
|
|
81
57
|
end
|
|
58
|
+
else
|
|
59
|
+
@dict = expr.map{|e| (e.is_a?(Array) || e.is_a?(Hash)) ? Json.new(e) : convert_to_node(e) }
|
|
60
|
+
end
|
|
82
61
|
super
|
|
83
62
|
end
|
|
63
|
+
|
|
84
64
|
end
|
|
85
65
|
|
|
86
66
|
class JsonMerge < JsonNode
|
|
@@ -93,7 +73,11 @@ module ArelExtensions
|
|
|
93
73
|
@dict = as_array ? json : json.dict
|
|
94
74
|
@as_array = as_array
|
|
95
75
|
if orders
|
|
96
|
-
|
|
76
|
+
if orders.is_a?(Array)
|
|
77
|
+
@orders = orders
|
|
78
|
+
else
|
|
79
|
+
@orders = [orders]
|
|
80
|
+
end
|
|
97
81
|
end
|
|
98
82
|
end
|
|
99
83
|
end
|
|
@@ -105,6 +89,7 @@ module ArelExtensions
|
|
|
105
89
|
@dict = json
|
|
106
90
|
@key = convert_to_node(key)
|
|
107
91
|
end
|
|
92
|
+
|
|
108
93
|
end
|
|
109
94
|
|
|
110
95
|
class JsonSet < JsonNode
|
|
@@ -115,6 +100,8 @@ module ArelExtensions
|
|
|
115
100
|
@key = convert_to_node(key)
|
|
116
101
|
@value = Json.new(value)
|
|
117
102
|
end
|
|
103
|
+
|
|
118
104
|
end
|
|
105
|
+
|
|
119
106
|
end
|
|
120
107
|
end
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
2
|
module Nodes
|
|
3
3
|
class IMatches < Arel::Nodes::Matches
|
|
4
|
-
attr_accessor :case_sensitive if Arel::VERSION.to_i < 7
|
|
5
4
|
|
|
5
|
+
attr_accessor :case_sensitive if Arel::VERSION.to_i < 7
|
|
6
|
+
|
|
6
7
|
def initialize(left, right, escape = nil)
|
|
7
|
-
r = Arel.
|
|
8
|
+
r = Arel::Nodes.build_quoted(right)
|
|
8
9
|
if Arel::VERSION.to_i < 7 # managed by default in version 7+ (rails 5), so useful for rails 3 & 4
|
|
9
10
|
super(left, r, escape)
|
|
10
11
|
@case_sensitive = false
|
|
@@ -16,14 +17,15 @@ module ArelExtensions
|
|
|
16
17
|
|
|
17
18
|
class IDoesNotMatch < IMatches
|
|
18
19
|
end
|
|
19
|
-
|
|
20
|
+
|
|
20
21
|
class AiMatches < IMatches
|
|
21
22
|
end
|
|
22
|
-
|
|
23
|
+
|
|
23
24
|
class AiIMatches < IMatches
|
|
24
25
|
end
|
|
25
|
-
|
|
26
|
+
|
|
26
27
|
class SMatches < IMatches
|
|
27
28
|
end
|
|
29
|
+
|
|
28
30
|
end
|
|
29
31
|
end
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
2
|
module Nodes
|
|
3
3
|
class Power < Function
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
RETURN_TYPE = :number
|
|
5
|
+
|
|
6
|
+
def initialize expr
|
|
7
|
+
super [convert_to_node(expr.first), convert_to_number(expr[1])]
|
|
8
|
+
end
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
end
|
|
@@ -2,17 +2,19 @@ module ArelExtensions
|
|
|
2
2
|
module Nodes
|
|
3
3
|
class Repeat < Function
|
|
4
4
|
RETURN_TYPE = :string
|
|
5
|
-
|
|
5
|
+
|
|
6
6
|
def initialize expr
|
|
7
7
|
tab = expr.map { |arg|
|
|
8
8
|
convert_to_node(arg)
|
|
9
9
|
}
|
|
10
|
-
super(tab)
|
|
10
|
+
return super(tab)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def +(other)
|
|
14
|
-
ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
|
14
|
+
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
|
15
15
|
end
|
|
16
|
+
|
|
16
17
|
end
|
|
18
|
+
|
|
17
19
|
end
|
|
18
20
|
end
|
|
@@ -2,26 +2,18 @@ module ArelExtensions
|
|
|
2
2
|
module Nodes
|
|
3
3
|
class Replace < Function
|
|
4
4
|
RETURN_TYPE = :string
|
|
5
|
-
attr_accessor :left, :pattern, :substitute
|
|
6
5
|
|
|
7
|
-
def initialize
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
super(
|
|
6
|
+
def initialize expr
|
|
7
|
+
tab = expr.map { |arg|
|
|
8
|
+
convert_to_node(arg)
|
|
9
|
+
}
|
|
10
|
+
return super(tab)
|
|
12
11
|
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
class RegexpReplace < Function
|
|
16
|
-
RETURN_TYPE = :string
|
|
17
|
-
attr_accessor :left, :pattern, :substitute
|
|
18
12
|
|
|
19
|
-
def
|
|
20
|
-
|
|
21
|
-
@pattern = (pattern.is_a?(Regexp) ? pattern : %r[#{pattern}])
|
|
22
|
-
@substitute = convert_to_node(substitute)
|
|
23
|
-
super([@left, @pattern, @substitute])
|
|
13
|
+
def +(other)
|
|
14
|
+
return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
|
24
15
|
end
|
|
16
|
+
|
|
25
17
|
end
|
|
26
18
|
end
|
|
27
19
|
end
|
|
@@ -4,12 +4,13 @@ module ArelExtensions
|
|
|
4
4
|
RETURN_TYPE = :number
|
|
5
5
|
|
|
6
6
|
def initialize expr
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
if expr && expr.length == 1
|
|
8
|
+
super [convert_to_node(expr.first)]
|
|
9
|
+
else
|
|
10
|
+
super [convert_to_node(expr.first), convert_to_number(expr[1])]
|
|
11
|
+
end
|
|
12
12
|
end
|
|
13
|
+
|
|
13
14
|
end
|
|
14
15
|
end
|
|
15
16
|
end
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
module Nodes
|
|
3
|
+
class Soundex < Function
|
|
4
|
+
include Arel::Expressions
|
|
5
|
+
include ArelExtensions::Comparators
|
|
6
|
+
|
|
7
|
+
RETURN_TYPE = :string
|
|
8
|
+
|
|
9
|
+
def ==(other)
|
|
10
|
+
Arel::Nodes::Equality.new self, Arel::Nodes.build_quoted(other, self)
|
|
11
|
+
end
|
|
6
12
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def !=(other)
|
|
14
|
-
Arel::Nodes::NotEqual.new self, Arel.quoted(other, self)
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
13
|
+
def !=(other)
|
|
14
|
+
Arel::Nodes::NotEqual.new self, Arel::Nodes.build_quoted(other, self)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
18
|
end
|
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
2
|
module Nodes
|
|
3
|
-
class Std <
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class Variance < AggregateFunction
|
|
14
|
-
RETURN_TYPE = :number
|
|
15
|
-
attr_accessor :unbiased_estimator
|
|
16
|
-
|
|
17
|
-
def initialize node, **opts
|
|
18
|
-
@unbiased_estimator = opts[:unbiased] ? true : false
|
|
19
|
-
super node, **opts
|
|
20
|
-
end
|
|
3
|
+
class Std < Function
|
|
4
|
+
RETURN_TYPE = :number
|
|
5
|
+
|
|
6
|
+
attr_accessor :unbiased_estimator
|
|
7
|
+
def initialize expr
|
|
8
|
+
col = expr.first
|
|
9
|
+
@unbiased_estimator = expr[1]
|
|
10
|
+
super [col]
|
|
11
|
+
end
|
|
21
12
|
end
|
|
13
|
+
|
|
14
|
+
class Variance < Function
|
|
15
|
+
RETURN_TYPE = :number
|
|
16
|
+
|
|
17
|
+
attr_accessor :unbiased_estimator
|
|
18
|
+
def initialize expr
|
|
19
|
+
col = expr.first
|
|
20
|
+
@unbiased_estimator = expr[1]
|
|
21
|
+
super [col]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
22
25
|
end
|
|
23
26
|
end
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
2
|
module Nodes
|
|
3
3
|
class Substring < Function
|
|
4
|
-
|
|
4
|
+
RETURN_TYPE = :string
|
|
5
|
+
|
|
6
|
+
def initialize expr
|
|
7
|
+
tab = [convert_to_node(expr[0]), convert_to_node(expr[1])]
|
|
8
|
+
if expr[2]
|
|
9
|
+
tab << convert_to_node(expr[2])
|
|
10
|
+
# else
|
|
11
|
+
# tab << expr[0].length
|
|
12
|
+
end
|
|
13
|
+
return super(tab)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# def +(other)
|
|
17
|
+
# puts "[Substring] : #{other.inspect} (#{self.expressions.inspect})"
|
|
18
|
+
# return ArelExtensions::Nodes::Concat.new(self.expressions + [other])
|
|
19
|
+
# end
|
|
5
20
|
|
|
6
|
-
def initialize expr
|
|
7
|
-
tab = [convert_to_node(expr[0]), convert_to_node(expr[1])]
|
|
8
|
-
if expr[2]
|
|
9
|
-
tab << convert_to_node(expr[2])
|
|
10
|
-
end
|
|
11
|
-
super(tab)
|
|
12
|
-
end
|
|
13
21
|
end
|
|
14
22
|
end
|
|
15
23
|
end
|