arel_extensions 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Travis Build Status](https://img.shields.io/travis/Faveod/arel-extensions.svg?label=Travis%20build)](http://travis-ci.org/Faveod/arel-extensions)
|
4
4
|
[![AppVeyor Build Status](https://img.shields.io/appveyor/ci/yazfav/arel-extensions.svg?label=AppVeyor%20build)](https://ci.appveyor.com/project/yazfav/arel-extensions)
|
5
|
-
[![Code Climate](https://img.shields.io/codeclimate/github/Faveod/arel-extensions.svg)](https://codeclimate.com/github/Faveod/arel-extensions)
|
6
|
-
[![Gemnasium](https://img.shields.io/gemnasium/Faveod/arel-extensions.svg)](https://gemnasium.com/github.com/Faveod/arel-extensions)
|
7
5
|
[![Security](https://hakiri.io/github/Faveod/arel-extensions/master.svg)](https://hakiri.io/github/Faveod/arel-extensions/master)
|
8
6
|
![](http://img.shields.io/badge/license-MIT-brightgreen.svg)
|
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
|