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 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