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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b42393f60593054c04105afad4f4500dc826cd93
4
- data.tar.gz: 383b4bc32619fe292c7f7ba31f867f1f49c8da80
3
+ metadata.gz: 2d8dec1f213ad0c9708bec8dba67bf1f1e69a08c
4
+ data.tar.gz: 0d14b1fab3067c427d370cf0e7b005f3ff285349
5
5
  SHA512:
6
- metadata.gz: 7a724f2bd5c6d6ecedf567d44cc5d9be29f4270043b9d816b0090e19fce6380af13af3e5d4930f5252add2b4542d58ff7f6a21c202e1a5001665c7aa10b9aee3
7
- data.tar.gz: 29f68d3d37bee531b23098ccace43491c42d781f719c451d1a7bbbaa4c0067b54abbf356940be7f955ad72984a07132e59e1bc4b8cea0f061e0abeb7099c416b
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
- - bundle exec rake test:oracle # service unavailable
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
- jdk: oraclejdk9
154
- - rvm: jruby-head
155
- gemfile: gemfiles/rails5_2.gemfile
156
- jdk: oraclejdk9
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
- Exemples :
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
@@ -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 => 'v51.0', :platforms => :jruby
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
@@ -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 ArelExtensions::Nodes::Function
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 Arel::Nodes::Function
39
- return Arel::Nodes::Grouping.new(Arel::Nodes::Addition.new self, other)
40
- else
41
- col = Arel::Table.engine.connection.schema_cache.columns_hash(self.relation.table_name)[self.name.to_s]
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
- if self.is_a?(Arel::Nodes::Grouping)
68
+ case self
69
+ when Arel::Nodes::Grouping
65
70
  if self.expr.left.is_a?(Date) || self.expr.left.is_a?(DateTime)
66
- return Arel::Nodes::Grouping.new(ArelExtensions::Nodes::DateSub.new [self, other])
71
+ Arel::Nodes::Grouping.new(ArelExtensions::Nodes::DateSub.new [self, other])
67
72
  else
68
- return Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
73
+ Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
69
74
  end
70
- end
71
- return case self.return_type
72
- when :string, :text # ???
73
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other)) # ??
74
- when :integer, :decimal, :float, :number
75
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
76
- when :date, :datetime
77
- ArelExtensions::Nodes::DateSub.new [self, other]
78
- else
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
- arg = col.type
86
- if (arg == :date || arg == :datetime)
87
- case other
88
- when Arel::Attributes::Attribute
89
- col2 = Arel::Table.engine.connection.schema_cache.columns_hash(other.relation.table_name)[other.name.to_s]
90
- if (!col2) #if the column doesn't exist in the database
91
- ArelExtensions::Nodes::DateSub.new [self, other]
92
- else
93
- arg2 = col2.type
94
- if arg2 == :date || arg2 == :datetime
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
- else
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
- Arel::Nodes::Grouping.new(Arel::Nodes::Subtraction.new(self, other))
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 => e
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
- Arel::Nodes::Matches.new(self, Arel::Nodes.build_quoted(other), escape)
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
- 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
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]
@@ -1,3 +1,3 @@
1
1
  module ArelExtensions
2
- VERSION = "1.1.0".freeze
2
+ VERSION = "1.1.1".freeze
3
3
  end
@@ -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
- if !collector.value.blank? && o.limit.blank? && o.offset.blank?
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
@@ -369,6 +369,7 @@ module ArelExtensions
369
369
  collector
370
370
  end
371
371
 
372
+
372
373
  end
373
374
  end
374
375
  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.0
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-08-08 00:00:00.000000000 Z
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