arel_extensions 1.1.0 → 1.1.1
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 +98 -39
- data/README.md +2 -3
- data/gemfiles/rails5_2.gemfile +1 -1
- data/lib/arel_extensions/math.rb +63 -45
- data/lib/arel_extensions/math_functions.rb +11 -1
- data/lib/arel_extensions/nodes/std.rb +26 -0
- data/lib/arel_extensions/predications.rb +6 -2
- data/lib/arel_extensions/string_functions.rb +8 -8
- data/lib/arel_extensions/version.rb +1 -1
- data/lib/arel_extensions/visitors/mssql.rb +15 -0
- data/lib/arel_extensions/visitors/mysql.rb +15 -1
- data/lib/arel_extensions/visitors/oracle.rb +14 -1
- data/lib/arel_extensions/visitors/postgresql.rb +15 -1
- data/lib/arel_extensions/visitors/sqlite.rb +1 -0
- data/lib/arel_extensions/visitors/to_sql.rb +13 -0
- data/test/visitors/test_to_sql.rb +13 -0
- data/test/with_ar/all_agnostic_test.rb +16 -2
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2d8dec1f213ad0c9708bec8dba67bf1f1e69a08c
|
|
4
|
+
data.tar.gz: 0d14b1fab3067c427d370cf0e7b005f3ff285349
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0af7b4d42096aebda99cf375a2757275dfe04820ebc9d54916018eb335b22e086d23a17e0b9e48559add9bc49830c60001e96a9e68aaf84ad17eb8f750b4800d
|
|
7
|
+
data.tar.gz: 4b747e27a9d89aef3fa764625f19210f166bf8bcd81996728e4818fb62a3fb154322159494e90ca67dccc386fa5c13ebeee2b94957146c65f2f3aab7974e2773
|
data/.travis.yml
CHANGED
|
@@ -6,14 +6,14 @@ cache:
|
|
|
6
6
|
- $ORACLE_HOME
|
|
7
7
|
before_install:
|
|
8
8
|
- chmod +x .travis/sqlite3/extension-functions.sh
|
|
9
|
-
- chmod +x .travis/oracle/download.sh
|
|
10
|
-
- chmod +x .travis/oracle/install.sh
|
|
11
|
-
- chmod +x .travis/setup_accounts.sh
|
|
9
|
+
# - chmod +x .travis/oracle/download.sh
|
|
10
|
+
# - chmod +x .travis/oracle/install.sh
|
|
11
|
+
# - chmod +x .travis/setup_accounts.sh
|
|
12
12
|
- sudo apt-get install -y sqlite3-pcre curl
|
|
13
13
|
- .travis/sqlite3/extension-functions.sh
|
|
14
|
-
- .travis/oracle/download.sh
|
|
15
|
-
- sh -ex .travis/oracle/install.sh
|
|
16
|
-
- .travis/setup_accounts.sh
|
|
14
|
+
# - .travis/oracle/download.sh
|
|
15
|
+
# - sh -ex .travis/oracle/install.sh
|
|
16
|
+
# - .travis/setup_accounts.sh
|
|
17
17
|
install:
|
|
18
18
|
- gem install bundler
|
|
19
19
|
- bundle install
|
|
@@ -34,17 +34,17 @@ script:
|
|
|
34
34
|
- bundle exec rake test:sqlite
|
|
35
35
|
- bundle exec rake test:mysql
|
|
36
36
|
- bundle exec rake test:postgresql
|
|
37
|
-
|
|
37
|
+
#- bundle exec rake test:oracle # service unavailable
|
|
38
38
|
env:
|
|
39
39
|
global:
|
|
40
40
|
- JRUBY_OPTS='--dev -J-Xmx1024M'
|
|
41
|
-
- ORACLE_COOKIE=sqldev
|
|
42
|
-
- ORACLE_FILE=oracle11g/xe/oracle-xe-11.2.0-1.0.x86_64.rpm.zip
|
|
43
|
-
- ORACLE_OJDBC_URL=http://download.oracle.com/otn/utilities_drivers/jdbc/11204/ojdbc6.jar
|
|
41
|
+
# - ORACLE_COOKIE=sqldev
|
|
42
|
+
# - ORACLE_FILE=oracle11g/xe/oracle-xe-11.2.0-1.0.x86_64.rpm.zip
|
|
43
|
+
# - ORACLE_OJDBC_URL=http://download.oracle.com/otn/utilities_drivers/jdbc/11204/ojdbc6.jar
|
|
44
44
|
- TNS_ADMIN=$ORACLE_HOME/network/admin
|
|
45
|
-
- ORACLE_BASE=/u01/app/oracle
|
|
46
|
-
- ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
|
|
47
|
-
- ORACLE_SID=XE
|
|
45
|
+
# - ORACLE_BASE=/u01/app/oracle
|
|
46
|
+
# - ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
|
|
47
|
+
# - ORACLE_SID=XE
|
|
48
48
|
- DATABASE_NAME=XE
|
|
49
49
|
- NLS_LANG=AMERICAN_AMERICA.AL32UTF8
|
|
50
50
|
- secure: 0RUuF4l0e3J8UIIMlgb8x/aYy2pH6Wb+EWylOr2W1EQechivoFw6IEYD1EZWIOZ/uNpkQ2h/urbUqW3/HpKhZn+NYP2sQI41Xyu1TD+6HPWAHpEvLzemhQSJV6eIeLRQoVDLUmqF23nUZDtKQAwOOyJVMeqHMahJi5K7N/cfQmifs2QcBnMxPnANIcrSXxOCBoqCl6BERG9JTeKERG/lWG1I9vRIe9ISNyOPUQVVI6SfTJwhJP5NLkxSJG1q2PLPK7p6zQ684sS4zSnS5oV23yDsQWWIwxk78CVu1jnFBu8Qq3ngWsInlkHrPotjtaxmTxM8JQd4fgE5NMO2Pjnj8w7zg+sbl+3OVtareX+M9+OLdUD5xBQhecPpzflMqib2qZ0fr9tdoT8kAZJTiXtQrptZfaXleZlH74l2dO/PYxkoWMusYQnSbQl0G3AoyYH+l7YpefL4arm0s5IIiOK+ZiCoZ14pl26rYAA1iPUe5AT+hecKi+fwqhyFE7fMX+zC+AvzsQL8jrP0CXL/hmPkoFYxvcDgUoYhvOq+mmQHdOfU7ny4hH5z5d9691qceduHFvF7fNZ4pSofj03eGqfTTk+SDNeZIo6NXNlayayjV2L/DxL6d7vetxkWwipx47PI76gBAqJlxgODJuzoOtyQkPyIVsDlzI1UPoS+UbrU51w=
|
|
@@ -57,12 +57,17 @@ rvm:
|
|
|
57
57
|
- 2.5.0
|
|
58
58
|
- rbx-2
|
|
59
59
|
- jruby-9.0.5.0
|
|
60
|
+
- jruby-9.2.0.0
|
|
60
61
|
- jruby-head
|
|
61
62
|
- ruby-head
|
|
62
63
|
jdk:
|
|
63
64
|
- openjdk7
|
|
64
65
|
- oraclejdk8
|
|
65
66
|
- oraclejdk9
|
|
67
|
+
- openjdk10
|
|
68
|
+
- oraclejdk10
|
|
69
|
+
- openjdk11
|
|
70
|
+
- oraclejdk11
|
|
66
71
|
matrix:
|
|
67
72
|
fast_finish: true
|
|
68
73
|
exclude:
|
|
@@ -97,7 +102,73 @@ matrix:
|
|
|
97
102
|
- rvm: 2.5.0
|
|
98
103
|
jdk: oraclejdk8
|
|
99
104
|
- rvm: ruby-head
|
|
100
|
-
jdk: oraclejdk8
|
|
105
|
+
jdk: oraclejdk8
|
|
106
|
+
- rvm: rbx-2
|
|
107
|
+
jdk: oraclejdk10
|
|
108
|
+
- rvm: 2.0.0
|
|
109
|
+
jdk: oraclejdk10
|
|
110
|
+
- rvm: 2.1
|
|
111
|
+
jdk: oraclejdk10
|
|
112
|
+
- rvm: 2.2.5
|
|
113
|
+
jdk: oraclejdk10
|
|
114
|
+
- rvm: 2.3.1
|
|
115
|
+
jdk: oraclejdk10
|
|
116
|
+
- rvm: 2.4.0
|
|
117
|
+
jdk: oraclejdk10
|
|
118
|
+
- rvm: 2.5.0
|
|
119
|
+
jdk: oraclejdk10
|
|
120
|
+
- rvm: ruby-head
|
|
121
|
+
jdk: oraclejdk10
|
|
122
|
+
- rvm: rbx-2
|
|
123
|
+
jdk: openjdk10
|
|
124
|
+
- rvm: 2.0.0
|
|
125
|
+
jdk: openjdk10
|
|
126
|
+
- rvm: 2.1
|
|
127
|
+
jdk: openjdk10
|
|
128
|
+
- rvm: 2.2.5
|
|
129
|
+
jdk: openjdk10
|
|
130
|
+
- rvm: 2.3.1
|
|
131
|
+
jdk: openjdk10
|
|
132
|
+
- rvm: 2.4.0
|
|
133
|
+
jdk: openjdk10
|
|
134
|
+
- rvm: 2.5.0
|
|
135
|
+
jdk: openjdk10
|
|
136
|
+
- rvm: ruby-head
|
|
137
|
+
jdk: openjdk10
|
|
138
|
+
- rvm: rbx-2
|
|
139
|
+
jdk: oraclejdk11
|
|
140
|
+
- rvm: 2.0.0
|
|
141
|
+
jdk: oraclejdk11
|
|
142
|
+
- rvm: 2.1
|
|
143
|
+
jdk: oraclejdk11
|
|
144
|
+
- rvm: 2.2.5
|
|
145
|
+
jdk: oraclejdk11
|
|
146
|
+
- rvm: 2.3.1
|
|
147
|
+
jdk: oraclejdk11
|
|
148
|
+
- rvm: 2.4.0
|
|
149
|
+
jdk: oraclejdk11
|
|
150
|
+
- rvm: 2.5.0
|
|
151
|
+
jdk: oraclejdk11
|
|
152
|
+
- rvm: ruby-head
|
|
153
|
+
jdk: oraclejdk11
|
|
154
|
+
- rvm: rbx-2
|
|
155
|
+
jdk: openjdk11
|
|
156
|
+
- rvm: 2.0.0
|
|
157
|
+
jdk: openjdk11
|
|
158
|
+
- rvm: 2.1
|
|
159
|
+
jdk: openjdk11
|
|
160
|
+
- rvm: 2.2.5
|
|
161
|
+
jdk: openjdk11
|
|
162
|
+
- rvm: 2.3.1
|
|
163
|
+
jdk: openjdk11
|
|
164
|
+
- rvm: 2.4.0
|
|
165
|
+
jdk: openjdk11
|
|
166
|
+
- rvm: 2.5.0
|
|
167
|
+
jdk: openjdk11
|
|
168
|
+
- rvm: ruby-head
|
|
169
|
+
jdk: openjdk11
|
|
170
|
+
- rvm: jruby-9.2.0.0
|
|
171
|
+
jdk: openjdk7
|
|
101
172
|
- rvm: jruby-head
|
|
102
173
|
jdk: openjdk7
|
|
103
174
|
- rvm: 2.0.0
|
|
@@ -116,18 +187,6 @@ matrix:
|
|
|
116
187
|
gemfile: gemfiles/rails5_2.gemfile
|
|
117
188
|
- rvm: 2.1
|
|
118
189
|
gemfile: gemfiles/rails5_2.gemfile
|
|
119
|
-
- rvm: jruby-9.0.5.0
|
|
120
|
-
gemfile: gemfiles/rails5_2.gemfile
|
|
121
|
-
jdk: openjdk7
|
|
122
|
-
- rvm: jruby-head
|
|
123
|
-
gemfile: gemfiles/rails5_2.gemfile
|
|
124
|
-
jdk: openjdk7
|
|
125
|
-
- rvm: jruby-9.0.5.0
|
|
126
|
-
gemfile: gemfiles/rails5_2.gemfile
|
|
127
|
-
jdk: oraclejdk8
|
|
128
|
-
- rvm: jruby-head
|
|
129
|
-
gemfile: gemfiles/rails5_2.gemfile
|
|
130
|
-
jdk: oraclejdk8
|
|
131
190
|
allow_failures:
|
|
132
191
|
- rvm: rbx-2
|
|
133
192
|
gemfile: gemfiles/rails4.gemfile
|
|
@@ -137,23 +196,23 @@ matrix:
|
|
|
137
196
|
gemfile: gemfiles/rails5_1_4.gemfile
|
|
138
197
|
- rvm: rbx-2
|
|
139
198
|
gemfile: gemfiles/rails5_2.gemfile
|
|
140
|
-
- rvm: jruby-head
|
|
141
|
-
gemfile: gemfiles/rails4.gemfile
|
|
142
|
-
jdk: oraclejdk9
|
|
143
|
-
- rvm: jruby-head
|
|
144
|
-
gemfile: gemfiles/rails5_0.gemfile
|
|
145
|
-
jdk: oraclejdk9
|
|
146
199
|
- rvm: rbx-2
|
|
147
200
|
gemfile: gemfiles/rails5_1_4.gemfile
|
|
148
|
-
- rvm: jruby-head
|
|
149
|
-
gemfile: gemfiles/rails5_1_4.gemfile
|
|
150
|
-
jdk: oraclejdk9
|
|
151
201
|
- rvm: jruby-9.0.5.0
|
|
202
|
+
gemfile: gemfiles/rails5_2.gemfile
|
|
203
|
+
- rvm: jruby-9.2.0.0
|
|
204
|
+
jdk: oraclejdk9
|
|
152
205
|
gemfile: gemfiles/rails5_2.gemfile
|
|
153
|
-
|
|
154
|
-
-
|
|
155
|
-
|
|
156
|
-
|
|
206
|
+
- jdk: openjdk10
|
|
207
|
+
- jdk: oraclejdk10
|
|
208
|
+
- jdk: openjdk11
|
|
209
|
+
- jdk: oraclejdk11
|
|
210
|
+
- rvm: ruby-head
|
|
211
|
+
- rvm: jruby-head
|
|
212
|
+
- rvm: jruby-9.2.0.0
|
|
213
|
+
jdk: oraclejdk9
|
|
214
|
+
- rvm: jruby-9.0.5.0
|
|
215
|
+
jdk: oraclejdk9
|
|
157
216
|
bundler_args: "--jobs 3 --retry 2"
|
|
158
217
|
notifications:
|
|
159
218
|
email:
|
data/README.md
CHANGED
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
[](http://travis-ci.org/Faveod/arel-extensions)
|
|
4
4
|
[](https://ci.appveyor.com/project/yazfav/arel-extensions)
|
|
5
|
-
[](https://codeclimate.com/github/Faveod/arel-extensions)
|
|
6
|
-
[](https://gemnasium.com/github.com/Faveod/arel-extensions)
|
|
7
5
|
[](https://hakiri.io/github/Faveod/arel-extensions/master)
|
|
8
6
|

|
|
9
7
|
|
|
@@ -72,7 +70,8 @@ With Arel Extensions:
|
|
|
72
70
|
```
|
|
73
71
|
|
|
74
72
|
Other functions : ABS, RAND, ROUND, FLOOR, CEIL, FORMAT
|
|
75
|
-
|
|
73
|
+
|
|
74
|
+
For Example:
|
|
76
75
|
```ruby
|
|
77
76
|
t[:price].format_number("%07.2f €","fr_FR")
|
|
78
77
|
# equivalent to 'sprintf("%07.2f €",price)' plus locale management
|
data/gemfiles/rails5_2.gemfile
CHANGED
|
@@ -19,7 +19,7 @@ group :development, :test do
|
|
|
19
19
|
gem 'activerecord-oracle_enhanced-adapter', '~> 5.2.0' if ENV.has_key? 'ORACLE_HOME'
|
|
20
20
|
|
|
21
21
|
# for JRuby
|
|
22
|
-
gem 'activerecord-jdbc-adapter', :github => 'jruby/activerecord-jdbc-adapter', :tag => '
|
|
22
|
+
gem 'activerecord-jdbc-adapter', :github => 'jruby/activerecord-jdbc-adapter', :tag => 'v52.0', :platforms => :jruby
|
|
23
23
|
gem "jdbc-sqlite3", :platforms => :jruby
|
|
24
24
|
gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
|
|
25
25
|
gem "activerecord-jdbcmysql-adapter", :platforms => :jruby
|
data/lib/arel_extensions/math.rb
CHANGED
|
@@ -24,7 +24,7 @@ module ArelExtensions
|
|
|
24
24
|
else
|
|
25
25
|
return Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
|
|
26
26
|
end
|
|
27
|
-
when
|
|
27
|
+
when ArelExtensions::Nodes::Function
|
|
28
28
|
return case self.return_type
|
|
29
29
|
when :string, :text
|
|
30
30
|
self.concat(other)
|
|
@@ -35,10 +35,14 @@ module ArelExtensions
|
|
|
35
35
|
else
|
|
36
36
|
self.concat(other)
|
|
37
37
|
end
|
|
38
|
-
when
|
|
39
|
-
|
|
40
|
-
else
|
|
41
|
-
|
|
38
|
+
when Arel::Nodes::Function
|
|
39
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
|
|
40
|
+
else
|
|
41
|
+
begin
|
|
42
|
+
col = Arel::Table.engine.connection.schema_cache.columns_hash(self.relation.table_name)[self.name.to_s]
|
|
43
|
+
rescue Exception
|
|
44
|
+
col = nil
|
|
45
|
+
end
|
|
42
46
|
if (!col) #if the column doesn't exist in the database
|
|
43
47
|
Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new(self, other))
|
|
44
48
|
else
|
|
@@ -61,55 +65,69 @@ module ArelExtensions
|
|
|
61
65
|
#function returns the time between two dates
|
|
62
66
|
#function returns the substraction between two ints
|
|
63
67
|
def -(other)
|
|
64
|
-
|
|
68
|
+
case self
|
|
69
|
+
when Arel::Nodes::Grouping
|
|
65
70
|
if self.expr.left.is_a?(Date) || self.expr.left.is_a?(DateTime)
|
|
66
|
-
|
|
71
|
+
Arel::Nodes::Grouping.new(ArelExtensions::Nodes::DateSub.new [self, other])
|
|
67
72
|
else
|
|
68
|
-
|
|
73
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
|
|
69
74
|
end
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
75
|
+
when ArelExtensions::Nodes::Function
|
|
76
|
+
case self.return_type
|
|
77
|
+
when :string, :text # ???
|
|
78
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other)) # ??
|
|
79
|
+
when :integer, :decimal, :float, :number
|
|
80
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
|
|
81
|
+
when :date, :datetime
|
|
82
|
+
ArelExtensions::Nodes::DateSub.new [self, other]
|
|
83
|
+
else
|
|
84
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
|
|
85
|
+
end
|
|
86
|
+
when Arel::Nodes::Function
|
|
79
87
|
Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
|
|
80
|
-
end if self.is_a?(ArelExtensions::Nodes::Function)
|
|
81
|
-
col = Arel::Table.engine.connection.schema_cache.columns_hash(self.relation.table_name)[self.name.to_s]
|
|
82
|
-
if (!col) #if the column doesn't exist in the database
|
|
83
|
-
return Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
|
|
84
88
|
else
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
89
|
+
|
|
90
|
+
begin
|
|
91
|
+
col = Arel::Table.engine.connection.schema_cache.columns_hash(self.relation.table_name)[self.name.to_s]
|
|
92
|
+
rescue Exception
|
|
93
|
+
col = nil
|
|
94
|
+
end
|
|
95
|
+
if (!col) #if the column doesn't exist in the database
|
|
96
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
|
|
97
|
+
else
|
|
98
|
+
arg = col.type
|
|
99
|
+
if (arg == :date || arg == :datetime)
|
|
100
|
+
case other
|
|
101
|
+
when Arel::Attributes::Attribute
|
|
102
|
+
begin
|
|
103
|
+
col2 = Arel::Table.engine.connection.schema_cache.columns_hash(other.relation.table_name)[other.name.to_s]
|
|
104
|
+
rescue Exception
|
|
105
|
+
col = nil
|
|
106
|
+
end
|
|
107
|
+
if (!col2) #if the column doesn't exist in the database
|
|
108
|
+
ArelExtensions::Nodes::DateSub.new [self, other]
|
|
109
|
+
else
|
|
110
|
+
arg2 = col2.type
|
|
111
|
+
if arg2 == :date || arg2 == :datetime
|
|
112
|
+
ArelExtensions::Nodes::DateDiff.new [self, other]
|
|
113
|
+
else
|
|
114
|
+
ArelExtensions::Nodes::DateSub.new [self, other]
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
when Arel::Nodes::Node, DateTime, Time, String, Date
|
|
95
118
|
ArelExtensions::Nodes::DateDiff.new [self, other]
|
|
96
|
-
|
|
119
|
+
when Integer
|
|
97
120
|
ArelExtensions::Nodes::DateSub.new [self, other]
|
|
98
121
|
end
|
|
99
|
-
end
|
|
100
|
-
when Arel::Nodes::Node, DateTime, Time, String, Date
|
|
101
|
-
ArelExtensions::Nodes::DateDiff.new [self, other]
|
|
102
|
-
when Integer
|
|
103
|
-
ArelExtensions::Nodes::DateSub.new [self, other]
|
|
104
|
-
end
|
|
105
|
-
else
|
|
106
|
-
case other
|
|
107
|
-
when Integer, Float, BigDecimal
|
|
108
|
-
Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, Arel.sql(other.to_s)))
|
|
109
|
-
when String
|
|
110
|
-
Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, Arel.sql(other)))
|
|
111
122
|
else
|
|
112
|
-
|
|
123
|
+
case other
|
|
124
|
+
when Integer, Float, BigDecimal
|
|
125
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, Arel.sql(other.to_s)))
|
|
126
|
+
when String
|
|
127
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, Arel.sql(other)))
|
|
128
|
+
else
|
|
129
|
+
Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
|
|
130
|
+
end
|
|
113
131
|
end
|
|
114
132
|
end
|
|
115
133
|
end
|
|
@@ -6,6 +6,7 @@ require 'arel_extensions/nodes/rand'
|
|
|
6
6
|
require 'arel_extensions/nodes/formatted_number'
|
|
7
7
|
require 'arel_extensions/nodes/log10'
|
|
8
8
|
require 'arel_extensions/nodes/power'
|
|
9
|
+
require 'arel_extensions/nodes/std'
|
|
9
10
|
|
|
10
11
|
module ArelExtensions
|
|
11
12
|
module MathFunctions
|
|
@@ -39,6 +40,15 @@ module ArelExtensions
|
|
|
39
40
|
def power exposant = 0
|
|
40
41
|
ArelExtensions::Nodes::Power.new [self,exposant]
|
|
41
42
|
end
|
|
43
|
+
|
|
44
|
+
# Aggregate Functions
|
|
45
|
+
def std unbiased = true
|
|
46
|
+
ArelExtensions::Nodes::Std.new [self,unbiased]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def variance unbiased = true
|
|
50
|
+
ArelExtensions::Nodes::Variance.new [self,unbiased]
|
|
51
|
+
end
|
|
42
52
|
|
|
43
53
|
|
|
44
54
|
#function that can be invoked to produce random numbers between 0 and 1
|
|
@@ -73,7 +83,7 @@ module ArelExtensions
|
|
|
73
83
|
}
|
|
74
84
|
# opts = {:locale => 'fr_FR', :type => "e"/"f"/"d", :prefix => "$ ", :suffix => " %", :flags => " +-#0", :width => 5, :precision => 6}
|
|
75
85
|
ArelExtensions::Nodes::FormattedNumber.new [self,opts]
|
|
76
|
-
rescue Exception
|
|
86
|
+
rescue Exception
|
|
77
87
|
Arel::Nodes.build_quoted('Wrong Format')
|
|
78
88
|
end
|
|
79
89
|
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module ArelExtensions
|
|
2
|
+
module Nodes
|
|
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
|
|
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
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -6,8 +6,12 @@ module ArelExtensions
|
|
|
6
6
|
end
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
def matches(other, escape=nil)
|
|
10
|
-
|
|
9
|
+
def matches(other, escape=nil,case_sensitive= nil)
|
|
10
|
+
if Arel::VERSION.to_i < 7
|
|
11
|
+
Arel::Nodes::Matches.new(self, Arel::Nodes.build_quoted(other), escape)
|
|
12
|
+
else
|
|
13
|
+
Arel::Nodes::Matches.new(self, Arel::Nodes.build_quoted(other), escape, case_sensitive)
|
|
14
|
+
end
|
|
11
15
|
end
|
|
12
16
|
|
|
13
17
|
def imatches(other, escape=nil)
|
|
@@ -107,14 +107,14 @@ module ArelExtensions
|
|
|
107
107
|
ArelExtensions::Nodes::Replace.new [self, left, right]
|
|
108
108
|
end
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
110
|
+
def concat other
|
|
111
|
+
res = ArelExtensions::Nodes::Concat.new [self, other]
|
|
112
|
+
if res.expressions.length == 1
|
|
113
|
+
res.expressions.first
|
|
114
|
+
else
|
|
115
|
+
res
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
118
|
|
|
119
119
|
def group_concat sep = nil
|
|
120
120
|
ArelExtensions::Nodes::GroupConcat.new [self, sep]
|
|
@@ -473,6 +473,21 @@ module ArelExtensions
|
|
|
473
473
|
collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
|
|
474
474
|
collector
|
|
475
475
|
end
|
|
476
|
+
|
|
477
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
|
478
|
+
collector << (o.unbiased_estimator ? "STDEV(" : "STDEVP(")
|
|
479
|
+
visit o.left, collector
|
|
480
|
+
collector << ")"
|
|
481
|
+
collector
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
|
485
|
+
collector << (o.unbiased_estimator ? "VAR(" : "VARP(")
|
|
486
|
+
visit o.left, collector
|
|
487
|
+
collector << ")"
|
|
488
|
+
collector
|
|
489
|
+
end
|
|
490
|
+
|
|
476
491
|
|
|
477
492
|
end
|
|
478
493
|
end
|
|
@@ -299,7 +299,7 @@ module ArelExtensions
|
|
|
299
299
|
|
|
300
300
|
alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
|
|
301
301
|
def visit_Arel_Nodes_SelectStatement o, collector
|
|
302
|
-
if !collector.value.blank? && o.limit.blank? && o.offset.blank?
|
|
302
|
+
if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
|
|
303
303
|
o = o.dup
|
|
304
304
|
o.orders = []
|
|
305
305
|
end
|
|
@@ -351,6 +351,20 @@ module ArelExtensions
|
|
|
351
351
|
collector = visit ArelExtensions::Nodes::Concat.new([Arel::Nodes.build_quoted(o.prefix),full_number,Arel::Nodes.build_quoted(o.suffix)]), collector
|
|
352
352
|
collector
|
|
353
353
|
end
|
|
354
|
+
|
|
355
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
|
356
|
+
collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
|
|
357
|
+
visit o.left, collector
|
|
358
|
+
collector << ")"
|
|
359
|
+
collector
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
|
363
|
+
collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
|
|
364
|
+
visit o.left, collector
|
|
365
|
+
collector << ")"
|
|
366
|
+
collector
|
|
367
|
+
end
|
|
354
368
|
|
|
355
369
|
|
|
356
370
|
end
|
|
@@ -491,7 +491,7 @@ module ArelExtensions
|
|
|
491
491
|
|
|
492
492
|
alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
|
|
493
493
|
def visit_Arel_Nodes_SelectStatement o, collector
|
|
494
|
-
if !collector.value.blank? && o.limit.blank? && o.offset.blank?
|
|
494
|
+
if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
|
|
495
495
|
o = o.dup
|
|
496
496
|
o.orders = []
|
|
497
497
|
end
|
|
@@ -571,6 +571,19 @@ module ArelExtensions
|
|
|
571
571
|
collector
|
|
572
572
|
end
|
|
573
573
|
|
|
574
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
|
575
|
+
collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
|
|
576
|
+
visit o.left, collector
|
|
577
|
+
collector << ")"
|
|
578
|
+
collector
|
|
579
|
+
end
|
|
580
|
+
|
|
581
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
|
582
|
+
collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
|
|
583
|
+
visit o.left, collector
|
|
584
|
+
collector << ")"
|
|
585
|
+
collector
|
|
586
|
+
end
|
|
574
587
|
|
|
575
588
|
|
|
576
589
|
|
|
@@ -334,7 +334,8 @@ module ArelExtensions
|
|
|
334
334
|
|
|
335
335
|
alias_method :old_visit_Arel_Nodes_SelectStatement, :visit_Arel_Nodes_SelectStatement
|
|
336
336
|
def visit_Arel_Nodes_SelectStatement o, collector
|
|
337
|
-
|
|
337
|
+
|
|
338
|
+
if !(collector.value.blank? || (collector.value.is_a?(Array) && collector.value[0].blank?)) && o.limit.blank? && o.offset.blank?
|
|
338
339
|
o = o.dup
|
|
339
340
|
o.orders = []
|
|
340
341
|
end
|
|
@@ -358,6 +359,19 @@ module ArelExtensions
|
|
|
358
359
|
collector << "#{quote_table_name join_name}.#{quote_column_name o.name}"
|
|
359
360
|
end
|
|
360
361
|
|
|
362
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
|
363
|
+
collector << (o.unbiased_estimator ? "STDDEV_SAMP(" : "STDDEV_POP(")
|
|
364
|
+
visit o.left, collector
|
|
365
|
+
collector << ")"
|
|
366
|
+
collector
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
|
370
|
+
collector << (o.unbiased_estimator ? "VAR_SAMP(" : "VAR_POP(")
|
|
371
|
+
visit o.left, collector
|
|
372
|
+
collector << ")"
|
|
373
|
+
collector
|
|
374
|
+
end
|
|
361
375
|
|
|
362
376
|
end
|
|
363
377
|
end
|
|
@@ -510,6 +510,19 @@ module ArelExtensions
|
|
|
510
510
|
visit o.right, collector
|
|
511
511
|
end
|
|
512
512
|
|
|
513
|
+
def visit_ArelExtensions_Nodes_Std o, collector
|
|
514
|
+
collector << "STD("
|
|
515
|
+
visit o.left, collector
|
|
516
|
+
collector << ")"
|
|
517
|
+
collector
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
def visit_ArelExtensions_Nodes_Variance o, collector
|
|
521
|
+
collector << "VARIANCE("
|
|
522
|
+
visit o.left, collector
|
|
523
|
+
collector << ")"
|
|
524
|
+
collector
|
|
525
|
+
end
|
|
513
526
|
|
|
514
527
|
|
|
515
528
|
end
|
|
@@ -57,6 +57,19 @@ module ArelExtensions
|
|
|
57
57
|
compile((@price + 42).average).must_be_like %{AVG(("products"."price" + 42))}
|
|
58
58
|
compile((Arel.rand * 9).round + 42).must_be_like %{(ROUND(RAND() * 9) + 42)}
|
|
59
59
|
compile((Arel.rand * @price).round(2) + @price).must_be_like %{(ROUND(RAND() * "products"."price", 2) + "products"."price")}
|
|
60
|
+
|
|
61
|
+
compile(@price.std + 42).must_be_like %{(STD("products"."price") + 42)}
|
|
62
|
+
compile(@price.variance + 42).must_be_like %{(VARIANCE("products"."price") + 42)}
|
|
63
|
+
|
|
64
|
+
compile(@price.coalesce(0) - 42).must_be_like %{(COALESCE("products"."price", 0) - 42)}
|
|
65
|
+
compile(@price.sum - 42).must_be_like %{(SUM("products"."price") - 42)}
|
|
66
|
+
compile(@price.std - 42).must_be_like %{(STD("products"."price") - 42)}
|
|
67
|
+
compile(@price.variance - 42).must_be_like %{(VARIANCE("products"."price") - 42)}
|
|
68
|
+
|
|
69
|
+
fake_table = Arel::Table.new('fake_tables')
|
|
70
|
+
|
|
71
|
+
compile(fake_table[:fake_att] - 42).must_be_like %{("fake_tables"."fake_att" - 42)}
|
|
72
|
+
compile(fake_table[:fake_att].coalesce(0) - 42).must_be_like %{(COALESCE("fake_tables"."fake_att", 0) - 42)}
|
|
60
73
|
end
|
|
61
74
|
|
|
62
75
|
# String Functions
|
|
@@ -89,7 +89,7 @@ module ArelExtensions
|
|
|
89
89
|
end
|
|
90
90
|
|
|
91
91
|
def t(scope, node)
|
|
92
|
-
scope.select(node.as('res')).first.res
|
|
92
|
+
scope.select(node.as('res')).to_a.first.res
|
|
93
93
|
end
|
|
94
94
|
|
|
95
95
|
# Math Functions
|
|
@@ -646,7 +646,21 @@ module ArelExtensions
|
|
|
646
646
|
User.select(at[:id]).from(at).to_sql.downcase
|
|
647
647
|
end
|
|
648
648
|
end
|
|
649
|
-
|
|
649
|
+
|
|
650
|
+
def test_stat_functions
|
|
651
|
+
skip "SQLite doesn't work for most on this functions" if $sqlite
|
|
652
|
+
#puts t(User.where(nil), @score.average)
|
|
653
|
+
#puts t(User.where(nil), @score.variance(true))
|
|
654
|
+
#puts t(User.where(nil), @score.variance(false))
|
|
655
|
+
#puts t(User.where(nil), @score.std(true))
|
|
656
|
+
#puts t(User.where(nil), @score.std(false))
|
|
657
|
+
|
|
658
|
+
assert ( 15.98625 - t(User.where(nil), @score.average)).abs < 0.01
|
|
659
|
+
assert (613.75488 - t(User.where(nil), @score.variance)).abs < 0.01
|
|
660
|
+
assert ( 537.0355 - t(User.where(nil), @score.variance(false))).abs < 0.01
|
|
661
|
+
assert ( 24.77408 - t(User.where(nil), @score.std)).abs < 0.01
|
|
662
|
+
assert ( 23.17403 - t(User.where(nil), @score.std(false))).abs < 0.01
|
|
663
|
+
end
|
|
650
664
|
end
|
|
651
665
|
end
|
|
652
666
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: arel_extensions
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Yann Azoury
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date: 2018-
|
|
13
|
+
date: 2018-12-10 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: arel
|
|
@@ -147,6 +147,7 @@ files:
|
|
|
147
147
|
- lib/arel_extensions/nodes/replace.rb
|
|
148
148
|
- lib/arel_extensions/nodes/round.rb
|
|
149
149
|
- lib/arel_extensions/nodes/soundex.rb
|
|
150
|
+
- lib/arel_extensions/nodes/std.rb
|
|
150
151
|
- lib/arel_extensions/nodes/substring.rb
|
|
151
152
|
- lib/arel_extensions/nodes/then.rb
|
|
152
153
|
- lib/arel_extensions/nodes/trim.rb
|