arel_extensions 1.6.0 → 2.0.0.rc3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.codeclimate.yml +2 -1
- data/.gitignore +6 -7
- data/.rubocop.yml +3 -67
- data/.travis/oracle/download.js +152 -0
- data/.travis/oracle/download.sh +30 -0
- data/.travis/oracle/download_ojdbc.js +116 -0
- data/.travis/oracle/install.sh +34 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis/sqlite3/extension-functions.sh +6 -0
- data/.travis.yml +223 -0
- data/Gemfile +28 -2
- data/README.md +91 -258
- data/Rakefile +30 -48
- data/TODO +1 -0
- data/appveyor.yml +22 -60
- data/arel_extensions.gemspec +14 -13
- data/functions.html +3 -3
- data/gemfiles/rails3.gemfile +20 -0
- data/gemfiles/rails4.gemfile +29 -0
- data/gemfiles/rails5_0.gemfile +29 -0
- data/gemfiles/rails5_1_4.gemfile +14 -14
- data/gemfiles/rails5_2.gemfile +14 -16
- data/init/mssql.sql +4 -4
- data/init/mysql.sql +38 -38
- data/init/oracle.sql +0 -0
- data/init/postgresql.sql +25 -24
- data/init/sqlite.sql +0 -0
- data/lib/arel_extensions/attributes.rb +3 -7
- data/lib/arel_extensions/boolean_functions.rb +14 -53
- data/lib/arel_extensions/common_sql_functions.rb +17 -16
- data/lib/arel_extensions/comparators.rb +28 -29
- data/lib/arel_extensions/date_duration.rb +13 -17
- data/lib/arel_extensions/insert_manager.rb +15 -18
- data/lib/arel_extensions/math.rb +53 -55
- data/lib/arel_extensions/math_functions.rb +39 -46
- data/lib/arel_extensions/nodes/abs.rb +1 -0
- data/lib/arel_extensions/nodes/blank.rb +2 -1
- data/lib/arel_extensions/nodes/case.rb +19 -20
- data/lib/arel_extensions/nodes/cast.rb +8 -10
- data/lib/arel_extensions/nodes/ceil.rb +1 -1
- data/lib/arel_extensions/nodes/coalesce.rb +4 -3
- data/lib/arel_extensions/nodes/collate.rb +10 -9
- data/lib/arel_extensions/nodes/concat.rb +18 -9
- data/lib/arel_extensions/nodes/date_diff.rb +26 -42
- data/lib/arel_extensions/nodes/duration.rb +3 -0
- data/lib/arel_extensions/nodes/find_in_set.rb +1 -0
- data/lib/arel_extensions/nodes/floor.rb +1 -1
- data/lib/arel_extensions/nodes/format.rb +8 -35
- data/lib/arel_extensions/nodes/formatted_number.rb +23 -22
- data/lib/arel_extensions/nodes/function.rb +37 -46
- data/lib/arel_extensions/nodes/is_null.rb +0 -0
- data/lib/arel_extensions/nodes/json.rb +39 -52
- data/lib/arel_extensions/nodes/length.rb +0 -5
- data/lib/arel_extensions/nodes/levenshtein_distance.rb +1 -1
- data/lib/arel_extensions/nodes/locate.rb +2 -1
- data/lib/arel_extensions/nodes/log10.rb +2 -1
- data/lib/arel_extensions/nodes/matches.rb +8 -6
- data/lib/arel_extensions/nodes/md5.rb +1 -0
- data/lib/arel_extensions/nodes/power.rb +5 -5
- data/lib/arel_extensions/nodes/rand.rb +1 -0
- data/lib/arel_extensions/nodes/repeat.rb +5 -3
- data/lib/arel_extensions/nodes/replace.rb +8 -16
- data/lib/arel_extensions/nodes/round.rb +6 -5
- data/lib/arel_extensions/nodes/soundex.rb +15 -15
- data/lib/arel_extensions/nodes/std.rb +21 -18
- data/lib/arel_extensions/nodes/substring.rb +16 -8
- data/lib/arel_extensions/nodes/then.rb +1 -1
- data/lib/arel_extensions/nodes/trim.rb +6 -4
- data/lib/arel_extensions/nodes/union.rb +8 -5
- data/lib/arel_extensions/nodes/union_all.rb +7 -4
- data/lib/arel_extensions/nodes/wday.rb +4 -0
- data/lib/arel_extensions/nodes.rb +1 -1
- data/lib/arel_extensions/null_functions.rb +5 -19
- data/lib/arel_extensions/predications.rb +44 -45
- data/lib/arel_extensions/railtie.rb +5 -5
- data/lib/arel_extensions/set_functions.rb +7 -5
- data/lib/arel_extensions/string_functions.rb +35 -91
- data/lib/arel_extensions/tasks.rb +6 -6
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/ibm_db.rb +31 -24
- data/lib/arel_extensions/visitors/mssql.rb +194 -440
- data/lib/arel_extensions/visitors/mysql.rb +212 -368
- data/lib/arel_extensions/visitors/oracle.rb +179 -236
- data/lib/arel_extensions/visitors/oracle12.rb +31 -18
- data/lib/arel_extensions/visitors/postgresql.rb +173 -271
- data/lib/arel_extensions/visitors/sqlite.rb +127 -157
- data/lib/arel_extensions/visitors/to_sql.rb +238 -300
- data/lib/arel_extensions/visitors.rb +62 -83
- data/lib/arel_extensions.rb +31 -235
- data/test/database.yml +10 -20
- data/test/helper.rb +18 -0
- data/test/real_db_test.rb +118 -121
- data/test/support/fake_record.rb +3 -11
- data/test/test_comparators.rb +17 -14
- data/test/visitors/test_bulk_insert_oracle.rb +12 -12
- data/test/visitors/test_bulk_insert_sqlite.rb +14 -13
- data/test/visitors/test_bulk_insert_to_sql.rb +13 -11
- data/test/visitors/test_oracle.rb +55 -55
- data/test/visitors/test_to_sql.rb +226 -419
- data/test/with_ar/all_agnostic_test.rb +370 -773
- data/test/with_ar/insert_agnostic_test.rb +22 -28
- data/test/with_ar/test_bulk_sqlite.rb +17 -18
- data/test/with_ar/test_math_sqlite.rb +27 -27
- data/test/with_ar/test_string_mysql.rb +34 -32
- data/test/with_ar/test_string_sqlite.rb +35 -31
- metadata +38 -52
- data/.github/workflows/publish.yml +0 -30
- data/.github/workflows/release.yml +0 -30
- data/.github/workflows/ruby.yml +0 -452
- data/CONTRIBUTING.md +0 -102
- data/Makefile +0 -18
- data/NEWS.md +0 -116
- data/bin/build +0 -15
- data/bin/publish +0 -8
- data/dev/arelx.dockerfile +0 -41
- data/dev/compose.yaml +0 -69
- data/dev/postgres.dockerfile +0 -5
- data/dev/rbenv +0 -189
- data/gemfiles/rails5.gemfile +0 -29
- data/gemfiles/rails6.gemfile +0 -34
- data/gemfiles/rails6_1.gemfile +0 -42
- data/gemfiles/rails7.gemfile +0 -42
- data/gemfiles/rails7_1.gemfile +0 -41
- data/gemfiles/rails7_2.gemfile +0 -41
- data/gemfiles/rails8.gemfile +0 -40
- data/gemfiles/rails8_1.gemfile +0 -41
- data/gemspecs/arel_extensions-v1.gemspec +0 -27
- data/gemspecs/arel_extensions-v2.gemspec +0 -27
- data/generate_gems.sh +0 -15
- data/lib/arel_extensions/aliases.rb +0 -14
- data/lib/arel_extensions/constants.rb +0 -13
- data/lib/arel_extensions/helpers.rb +0 -61
- data/lib/arel_extensions/nodes/aggregate_function.rb +0 -13
- data/lib/arel_extensions/nodes/byte_size.rb +0 -11
- data/lib/arel_extensions/nodes/char_length.rb +0 -11
- data/lib/arel_extensions/nodes/formatted_date.rb +0 -42
- data/lib/arel_extensions/nodes/rollup.rb +0 -36
- data/lib/arel_extensions/nodes/select.rb +0 -10
- data/lib/arel_extensions/nodes/sum.rb +0 -7
- data/lib/arel_extensions/visitors/convert_format.rb +0 -37
- data/lib/arel_extensions/warning.rb +0 -42
- data/test/arelx_test_helper.rb +0 -94
- data/test/config_loader.rb +0 -9
- data/version_v1.rb +0 -3
- data/version_v2.rb +0 -3
|
@@ -1,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,13 +17,11 @@ module ArelExtensions
|
|
|
27
17
|
end
|
|
28
18
|
|
|
29
19
|
def as other
|
|
30
|
-
|
|
31
|
-
self.alias = Arel.sql(other)
|
|
32
|
-
res
|
|
20
|
+
Arel::Nodes::As.new(self, Arel.sql(other))
|
|
33
21
|
end
|
|
34
22
|
|
|
35
23
|
def expr
|
|
36
|
-
|
|
24
|
+
@expressions.first
|
|
37
25
|
end
|
|
38
26
|
|
|
39
27
|
def left
|
|
@@ -45,21 +33,25 @@ module ArelExtensions
|
|
|
45
33
|
end
|
|
46
34
|
|
|
47
35
|
def ==(other)
|
|
48
|
-
Arel::Nodes::Equality.new self, Arel.
|
|
36
|
+
Arel::Nodes::Equality.new self, Arel::Nodes.build_quoted(other, self)
|
|
49
37
|
end
|
|
50
38
|
|
|
51
39
|
def !=(other)
|
|
52
|
-
Arel::Nodes::NotEqual.new self, Arel.
|
|
40
|
+
Arel::Nodes::NotEqual.new self, Arel::Nodes.build_quoted(other, self)
|
|
53
41
|
end
|
|
54
42
|
|
|
55
43
|
def type_of_attribute(att)
|
|
56
44
|
case att
|
|
57
45
|
when Arel::Attributes::Attribute
|
|
58
|
-
|
|
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
|
|
59
51
|
when ArelExtensions::Nodes::Function
|
|
60
52
|
att.return_type
|
|
61
|
-
|
|
62
|
-
|
|
53
|
+
# else
|
|
54
|
+
# nil
|
|
63
55
|
end
|
|
64
56
|
end
|
|
65
57
|
|
|
@@ -68,21 +60,19 @@ module ArelExtensions
|
|
|
68
60
|
when Arel::Attributes::Attribute, Arel::Nodes::Node, Integer
|
|
69
61
|
object
|
|
70
62
|
when DateTime
|
|
71
|
-
Arel.
|
|
63
|
+
Arel::Nodes.build_quoted(object, self)
|
|
72
64
|
when Time
|
|
73
|
-
Arel.
|
|
74
|
-
when
|
|
75
|
-
Arel.
|
|
65
|
+
Arel::Nodes.build_quoted(object.strftime('%H:%M:%S'), self)
|
|
66
|
+
when String, Symbol
|
|
67
|
+
Arel::Nodes.build_quoted(object.to_s)
|
|
76
68
|
when Date
|
|
77
|
-
Arel.
|
|
69
|
+
Arel::Nodes.build_quoted(object.to_s, self)
|
|
78
70
|
when NilClass
|
|
79
71
|
Arel.sql('NULL')
|
|
80
72
|
when ActiveSupport::Duration
|
|
81
73
|
Arel.sql(object.to_i)
|
|
82
|
-
when Array
|
|
83
|
-
Arel.grouping(object.map{|e| convert_to_node(e)})
|
|
84
74
|
else
|
|
85
|
-
raise(ArgumentError, "#{object.class}
|
|
75
|
+
raise(ArgumentError, "#{object.class} can not be converted to CONCAT arg")
|
|
86
76
|
end
|
|
87
77
|
end
|
|
88
78
|
|
|
@@ -91,7 +81,7 @@ module ArelExtensions
|
|
|
91
81
|
when Arel::Nodes::Node
|
|
92
82
|
object
|
|
93
83
|
when Integer
|
|
94
|
-
Arel.
|
|
84
|
+
Arel::Nodes.build_quoted(object.to_s)
|
|
95
85
|
when Arel::Attributes::Attribute
|
|
96
86
|
case self.type_of_attribute(object)
|
|
97
87
|
when :date
|
|
@@ -102,19 +92,19 @@ module ArelExtensions
|
|
|
102
92
|
object
|
|
103
93
|
end
|
|
104
94
|
when DateTime
|
|
105
|
-
Arel.
|
|
95
|
+
Arel::Nodes.build_quoted(object, self)
|
|
106
96
|
when Time
|
|
107
|
-
Arel.
|
|
108
|
-
when
|
|
109
|
-
Arel.
|
|
97
|
+
Arel::Nodes.build_quoted(object.strftime('%H:%M:%S'), self)
|
|
98
|
+
when String
|
|
99
|
+
Arel::Nodes.build_quoted(object)
|
|
110
100
|
when Date
|
|
111
|
-
Arel.
|
|
101
|
+
Arel::Nodes.build_quoted(object, self)
|
|
112
102
|
when NilClass
|
|
113
103
|
Arel.sql(nil)
|
|
114
104
|
when ActiveSupport::Duration
|
|
115
|
-
Arel.
|
|
105
|
+
Arel::Nodes.build_quoted(object.to_i.to_s)
|
|
116
106
|
else
|
|
117
|
-
raise(ArgumentError, "#{object.class}
|
|
107
|
+
raise(ArgumentError, "#{object.class} can not be converted to CONCAT arg")
|
|
118
108
|
end
|
|
119
109
|
end
|
|
120
110
|
|
|
@@ -123,13 +113,13 @@ module ArelExtensions
|
|
|
123
113
|
when Arel::Attributes::Attribute, Arel::Nodes::Node
|
|
124
114
|
object
|
|
125
115
|
when DateTime, Time
|
|
126
|
-
Arel.
|
|
127
|
-
when
|
|
128
|
-
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)
|
|
129
119
|
when Date
|
|
130
|
-
Arel.
|
|
120
|
+
Arel::Nodes.build_quoted(object, self)
|
|
131
121
|
else
|
|
132
|
-
raise(ArgumentError, "#{object.class}
|
|
122
|
+
raise(ArgumentError, "#{object.class} can not be converted to Date")
|
|
133
123
|
end
|
|
134
124
|
end
|
|
135
125
|
|
|
@@ -138,13 +128,13 @@ module ArelExtensions
|
|
|
138
128
|
when Arel::Attributes::Attribute, Arel::Nodes::Node
|
|
139
129
|
object
|
|
140
130
|
when DateTime, Time
|
|
141
|
-
Arel.
|
|
142
|
-
when
|
|
143
|
-
Arel.
|
|
131
|
+
Arel::Nodes.build_quoted(object, self)
|
|
132
|
+
when String
|
|
133
|
+
Arel::Nodes.build_quoted(Time.parse(object), self)
|
|
144
134
|
when Date
|
|
145
|
-
Arel.
|
|
135
|
+
Arel::Nodes.build_quoted(Time.utc(object.year, object.month, object.day, 0, 0, 0), self)
|
|
146
136
|
else
|
|
147
|
-
raise(ArgumentError, "#{object.class}
|
|
137
|
+
raise(ArgumentError, "#{object.class} can not be converted to Datetime")
|
|
148
138
|
end
|
|
149
139
|
end
|
|
150
140
|
|
|
@@ -162,9 +152,10 @@ module ArelExtensions
|
|
|
162
152
|
when NilClass
|
|
163
153
|
0
|
|
164
154
|
else
|
|
165
|
-
raise(ArgumentError, "#{object.class}
|
|
155
|
+
raise(ArgumentError, "#{object.class} can not be converted to NUMBER arg")
|
|
166
156
|
end
|
|
167
157
|
end
|
|
158
|
+
|
|
168
159
|
end
|
|
169
160
|
end
|
|
170
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,11 +1,12 @@
|
|
|
1
1
|
module ArelExtensions
|
|
2
2
|
module Nodes
|
|
3
3
|
class IMatches < Arel::Nodes::Matches
|
|
4
|
-
attr_accessor :case_sensitive if AREL_VERSION < V7
|
|
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
|
-
if
|
|
8
|
+
r = Arel::Nodes.build_quoted(right)
|
|
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
|
|
11
12
|
else
|
|
@@ -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
|